2016-05-25 11:09:33 +00:00
|
|
|
function __fish_shared_key_bindings -d "Bindings shared between emacs and vi mode"
|
2024-03-30 15:10:12 +00:00
|
|
|
set -l legacy_bind bind
|
2016-05-25 11:09:33 +00:00
|
|
|
# These are some bindings that are supposed to be shared between vi mode and default mode.
|
|
|
|
# They are supposed to be unrelated to text-editing (or movement).
|
|
|
|
# This takes $argv so the vi-bindings can pass the mode they are valid in.
|
|
|
|
|
2016-11-13 22:07:03 +00:00
|
|
|
if contains -- -h $argv
|
|
|
|
or contains -- --help $argv
|
2022-04-04 03:57:55 +00:00
|
|
|
echo "Sorry but this function doesn't support -h or --help" >&2
|
2016-11-13 22:07:03 +00:00
|
|
|
return 1
|
|
|
|
end
|
|
|
|
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv ctrl-y yank
|
2016-11-28 05:27:22 +00:00
|
|
|
or return # protect against invalid $argv
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv alt-y yank-pop
|
2016-05-25 11:09:33 +00:00
|
|
|
|
|
|
|
# Left/Right arrow
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv right forward-char
|
|
|
|
bind --preset $argv left backward-char
|
|
|
|
$legacy_bind --preset $argv -k right forward-char
|
|
|
|
$legacy_bind --preset $argv -k left backward-char
|
2016-05-25 11:09:33 +00:00
|
|
|
|
2020-03-15 11:58:51 +00:00
|
|
|
# Ctrl-left/right - these also work in vim.
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv ctrl-right forward-word
|
|
|
|
bind --preset $argv ctrl-left backward-word
|
2020-03-15 11:58:51 +00:00
|
|
|
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv pageup beginning-of-history
|
|
|
|
bind --preset $argv pagedown end-of-history
|
|
|
|
$legacy_bind --preset $argv -k ppage beginning-of-history
|
|
|
|
$legacy_bind --preset $argv -k npage end-of-history
|
2017-01-15 19:11:38 +00:00
|
|
|
|
2016-05-25 11:09:33 +00:00
|
|
|
# Interaction with the system clipboard.
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv ctrl-x fish_clipboard_copy
|
|
|
|
bind --preset $argv ctrl-v fish_clipboard_paste
|
|
|
|
|
|
|
|
bind --preset $argv escape cancel
|
|
|
|
bind --preset $argv ctrl-\[ cancel
|
|
|
|
bind --preset $argv tab complete
|
|
|
|
bind --preset $argv ctrl-i complete
|
|
|
|
bind --preset $argv ctrl-s pager-toggle-search
|
2016-05-25 11:09:33 +00:00
|
|
|
# shift-tab does a tab complete followed by a search.
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv shift-tab complete-and-search
|
|
|
|
$legacy_bind --preset $argv -k btab complete-and-search
|
|
|
|
bind --preset $argv shift-delete history-pager-delete or backward-delete-char
|
|
|
|
$legacy_bind --preset $argv -k sdc history-pager-delete or backward-delete-char
|
|
|
|
|
|
|
|
bind --preset $argv down down-or-search
|
|
|
|
$legacy_bind --preset $argv -k down down-or-search
|
|
|
|
bind --preset $argv up up-or-search
|
|
|
|
$legacy_bind --preset $argv -k up up-or-search
|
|
|
|
|
|
|
|
bind --preset $argv shift-right forward-bigword
|
|
|
|
bind --preset $argv shift-left backward-bigword
|
|
|
|
$legacy_bind --preset $argv -k sright forward-bigword
|
|
|
|
$legacy_bind --preset $argv -k sleft backward-bigword
|
|
|
|
|
|
|
|
bind --preset $argv alt-right nextd-or-forward-word
|
|
|
|
bind --preset $argv alt-left prevd-or-backward-word
|
|
|
|
$legacy_bind --preset $argv \e\eOC nextd-or-forward-word
|
|
|
|
$legacy_bind --preset $argv \e\eOD prevd-or-backward-word
|
|
|
|
$legacy_bind --preset $argv \e\e\[C nextd-or-forward-word
|
|
|
|
$legacy_bind --preset $argv \e\e\[D prevd-or-backward-word
|
|
|
|
$legacy_bind --preset $argv \e\[1\;9C nextd-or-forward-word #iTerm2
|
|
|
|
$legacy_bind --preset $argv \e\[1\;9D prevd-or-backward-word #iTerm2
|
|
|
|
|
|
|
|
bind --preset $argv alt-up history-token-search-backward
|
|
|
|
bind --preset $argv alt-down history-token-search-forward
|
|
|
|
$legacy_bind --preset $argv \e\eOA history-token-search-backward
|
|
|
|
$legacy_bind --preset $argv \e\eOB history-token-search-forward
|
|
|
|
$legacy_bind --preset $argv \e\e\[A history-token-search-backward
|
|
|
|
$legacy_bind --preset $argv \e\e\[B history-token-search-forward
|
|
|
|
$legacy_bind --preset $argv \e\[1\;9A history-token-search-backward # iTerm2
|
|
|
|
$legacy_bind --preset $argv \e\[1\;9B history-token-search-forward # iTerm2
|
2016-05-25 11:09:33 +00:00
|
|
|
# Bash compatibility
|
|
|
|
# https://github.com/fish-shell/fish-shell/issues/89
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv alt-. history-token-search-backward
|
2016-05-25 11:09:33 +00:00
|
|
|
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv alt-l __fish_list_current_token
|
|
|
|
bind --preset $argv alt-o __fish_preview_current_file
|
|
|
|
bind --preset $argv alt-w __fish_whatis_current_token
|
|
|
|
bind --preset $argv ctrl-l clear-screen
|
|
|
|
bind --preset $argv ctrl-c cancel-commandline
|
|
|
|
bind --preset $argv ctrl-u backward-kill-line
|
|
|
|
bind --preset $argv ctrl-w backward-kill-path-component
|
|
|
|
bind --preset $argv end end-of-line
|
|
|
|
bind --preset $argv home beginning-of-line
|
2016-09-03 17:27:42 +00:00
|
|
|
|
2024-04-19 10:18:53 +00:00
|
|
|
bind --preset $argv alt-d 'if test "$(commandline)." = .; __fish_echo dirh; else; commandline -f kill-word; end'
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv ctrl-d delete-or-exit
|
2016-05-25 11:09:33 +00:00
|
|
|
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv alt-s 'for cmd in sudo doas please; if command -q $cmd; fish_commandline_prepend $cmd; break; end; end'
|
2019-09-25 16:34:54 +00:00
|
|
|
|
2016-05-25 11:09:33 +00:00
|
|
|
# Allow reading manpages by pressing F1 (many GUI applications) or Alt+h (like in zsh).
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv F1 __fish_man_page
|
|
|
|
$legacy_bind --preset $argv -k f1 __fish_man_page
|
|
|
|
bind --preset $argv alt-h __fish_man_page
|
2016-05-25 11:09:33 +00:00
|
|
|
|
2016-11-13 22:07:03 +00:00
|
|
|
# This will make sure the output of the current command is paged using the default pager when
|
|
|
|
# you press Meta-p.
|
2016-05-25 11:09:33 +00:00
|
|
|
# If none is set, less will be used.
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv alt-p __fish_paginate
|
2016-11-13 22:07:03 +00:00
|
|
|
|
2016-05-25 11:09:33 +00:00
|
|
|
# Make it easy to turn an unexecuted command into a comment in the shell history. Also,
|
|
|
|
# remove the commenting chars so the command can be further edited then executed.
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv alt-# __fish_toggle_comment_commandline
|
2018-03-07 10:06:23 +00:00
|
|
|
|
2024-03-30 15:10:12 +00:00
|
|
|
# These keystrokes invoke an external editor on the command buffer.
|
|
|
|
bind --preset $argv alt-e edit_command_buffer
|
|
|
|
bind --preset $argv alt-v edit_command_buffer
|
2022-04-24 19:15:36 +00:00
|
|
|
|
|
|
|
# Bindings that are shared in text-insertion modes.
|
|
|
|
if not set -l index (contains --index -- -M $argv)
|
|
|
|
or test $argv[(math $index + 1)] = insert
|
|
|
|
|
|
|
|
# This is the default binding, i.e. the one used if no other binding matches
|
|
|
|
bind --preset $argv "" self-insert
|
|
|
|
or exit # protect against invalid $argv
|
|
|
|
|
|
|
|
# Space and other command terminators expands abbrs _and_ inserts itself.
|
Trigger abbreviations after inserting process separators
On
a;
we don't expand the abbreviation because the cursor is right of semicolon,
not on the command token. Fix this by making sure that we call expand-abbr
with the cursor on the semicolon which is the end of the command token.
(Now that our bind command execution order is less surprising, this is doable.)
This means that we need to fix the cursor after successfully expanding
an abbreviation. Do this by setting the position explicitly even when no
--set-position is in effect.
An earlier version of this patch used
bind space self-insert backward-char expand-abbr or forward-char
The problem with that (as a failing test shows) was that given "abbr m
myabbr", after typing "m space ctrl-z", the cursor would be after the "m",
not after the space. The second space removes the space, not changing the
cursor position, which is weird. I initially tried to fix this by adding
a hack to the undo group logic, to always restore the cursor position from
when begin-undo-group was used.
bind space self-insert begin-undo-group backward-char expand-abbr end-undo-group or forward-char
However this made test_torn_escapes.py fail for mysterious reasons.
I believe this is because that test registers and triggers a SIGUSR1 handler;
since the signal handler will rearrange char events, that probably messes
with the undo group guards.
I resorted to adding a tailor-made readline cmd. We could probably remove
it and give the new behavior to expand-abbr, not sure.
Fixes #9730
2024-04-13 10:21:45 +00:00
|
|
|
bind --preset $argv " " self-insert expand-abbr-backtrack
|
|
|
|
bind --preset $argv ";" self-insert expand-abbr-backtrack
|
|
|
|
bind --preset $argv "|" self-insert expand-abbr-backtrack
|
|
|
|
bind --preset $argv "&" self-insert expand-abbr-backtrack
|
|
|
|
bind --preset $argv ">" self-insert expand-abbr-backtrack
|
|
|
|
bind --preset $argv "<" self-insert expand-abbr-backtrack
|
|
|
|
bind --preset $argv shift-enter "commandline -i \n" expand-abbr-backtrack
|
|
|
|
$legacy_bind --preset $argv \e\[27\;2\;13~ "commandline -i \n" expand-abbr-backtrack # Sent with XTerm.vt100.formatOtherKeys: 0
|
|
|
|
bind --preset $argv alt-enter "commandline -i \n" expand-abbr-backtrack
|
|
|
|
bind --preset $argv ")" self-insert expand-abbr-backtrack # Closing a command substitution.
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv ctrl-space 'test -n "$(commandline)" && commandline -i " "'
|
2022-05-11 19:57:37 +00:00
|
|
|
bind --preset $argv -k nul 'test -n "$(commandline)" && commandline -i " "'
|
2024-03-30 15:10:12 +00:00
|
|
|
# Shift-space behaves like space because it's easy to mistype.
|
Trigger abbreviations after inserting process separators
On
a;
we don't expand the abbreviation because the cursor is right of semicolon,
not on the command token. Fix this by making sure that we call expand-abbr
with the cursor on the semicolon which is the end of the command token.
(Now that our bind command execution order is less surprising, this is doable.)
This means that we need to fix the cursor after successfully expanding
an abbreviation. Do this by setting the position explicitly even when no
--set-position is in effect.
An earlier version of this patch used
bind space self-insert backward-char expand-abbr or forward-char
The problem with that (as a failing test shows) was that given "abbr m
myabbr", after typing "m space ctrl-z", the cursor would be after the "m",
not after the space. The second space removes the space, not changing the
cursor position, which is weird. I initially tried to fix this by adding
a hack to the undo group logic, to always restore the cursor position from
when begin-undo-group was used.
bind space self-insert begin-undo-group backward-char expand-abbr end-undo-group or forward-char
However this made test_torn_escapes.py fail for mysterious reasons.
I believe this is because that test registers and triggers a SIGUSR1 handler;
since the signal handler will rearrange char events, that probably messes
with the undo group guards.
I resorted to adding a tailor-made readline cmd. We could probably remove
it and give the new behavior to expand-abbr, not sure.
Fixes #9730
2024-04-13 10:21:45 +00:00
|
|
|
bind --preset $argv shift-space 'commandline -i " "' expand-abbr-backtrack
|
2022-04-24 19:15:36 +00:00
|
|
|
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv enter execute
|
|
|
|
bind --preset $argv ctrl-j execute
|
|
|
|
bind --preset $argv ctrl-m execute
|
2022-12-11 17:20:24 +00:00
|
|
|
# Make Control+Return behave like Return because it's easy to mistype after accepting an autosuggestion.
|
2024-03-30 15:10:12 +00:00
|
|
|
bind --preset $argv ctrl-enter execute
|
|
|
|
$legacy_bind --preset $argv \e\[27\;5\;13~ execute # Sent with XTerm.vt100.formatOtherKeys: 0
|
2017-03-09 15:52:38 +00:00
|
|
|
end
|
|
|
|
end
|