Files
fish-shell/share/functions/fish_default_key_bindings.fish
Johannes Altmanninger 2bb5cbc959 Default bindings for token movements v2
Commit 6af96a81a8 (Default bindings for token movement commands, 2024-10-05)
has been reverted but not all docs have been.

Key bindings to move by command line argument are quite intuitive, and useful
when moving across URLs or other long arguments.

We have redundant bindings like {alt,ctrl}-left, so let's use one of them
for token movement.  We don't want to break the OS-native shortcut for word
movement, so use the other one on the current platform.

Note that Sublime Text does something similar: it uses the native key
binding for word movement, and the vacant one (e.g. `alt-left` on Linux)
for sub-word movement in camel case words.

While there have been 2.5 votes against making this platform dependent,
the majority of feedback was in favor.

This uses uname which seems wrong; we should rather use the OS that the
terminal is running on. I plan to implement this in future, but there's no
consensus yet on whether terminal applications should be allowed to do this.

See #10926
See #11107
2025-03-04 11:44:47 +01:00

91 lines
3.5 KiB
Fish

function fish_default_key_bindings -d "emacs-like key binds"
set -l legacy_bind bind
if contains -- -h $argv
or contains -- --help $argv
echo "Sorry but this function doesn't support -h or --help"
return 1
end
if not set -q argv[1]
bind --erase --all --preset # clear earlier bindings, if any
if test "$fish_key_bindings" != fish_default_key_bindings
__fish_change_key_bindings fish_default_key_bindings || return
set fish_bind_mode default
end
end
# Silence warnings about unavailable keys. See #4431, 4188
if not contains -- -s $argv
set argv -s $argv
end
# These are shell-specific bindings that we share with vi mode.
__fish_shared_key_bindings $argv
or return # protect against invalid $argv
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
bind --preset $argv delete delete-char
bind --preset $argv backspace backward-delete-char
bind --preset $argv shift-backspace backward-delete-char
bind --preset $argv home beginning-of-line
$legacy_bind --preset $argv -k home beginning-of-line
bind --preset $argv end end-of-line
$legacy_bind --preset $argv -k end end-of-line
bind --preset $argv ctrl-a beginning-of-line
bind --preset $argv ctrl-e end-of-line
bind --preset $argv ctrl-h backward-delete-char
bind --preset $argv ctrl-p up-or-search
bind --preset $argv ctrl-n down-or-search
bind --preset $argv ctrl-f forward-char
bind --preset $argv ctrl-b backward-char
bind --preset $argv ctrl-t transpose-chars
bind --preset $argv ctrl-g cancel
bind --preset $argv ctrl-/ undo
bind --preset $argv ctrl-_ undo # XTerm idiosyncracy, can get rid of this once we go full CSI u
bind --preset $argv ctrl-z undo
bind --preset $argv ctrl-Z redo
bind --preset $argv alt-/ redo
bind --preset $argv alt-t transpose-words
bind --preset $argv alt-u upcase-word
bind --preset $argv alt-c capitalize-word
if set -q XPC_FLAGS || set -q __CFBundleIdentifier || test (uname) = Darwin
bind --preset $argv alt-backspace backward-kill-word
bind --preset $argv ctrl-backspace backward-kill-token
bind --preset $argv alt-delete kill-word
bind --preset $argv ctrl-delete kill-token
else
bind --preset $argv alt-backspace backward-kill-token
bind --preset $argv ctrl-backspace backward-kill-word
bind --preset $argv alt-delete kill-token
bind --preset $argv ctrl-delete kill-word
end
bind --preset $argv alt-b prevd-or-backward-word
bind --preset $argv alt-f nextd-or-forward-word
bind --preset $argv alt-\< beginning-of-buffer
bind --preset $argv alt-\> end-of-buffer
bind --preset $argv ctrl-r history-pager
# term-specific special bindings
switch "$TERM"
case st-256color
# suckless and bash/zsh/fish have a different approach to how the terminal should be configured;
# the major effect is that several keys do not work as intended.
# This is a workaround, there will be additions in he future.
$legacy_bind --preset $argv \e\[P delete-char
$legacy_bind --preset $argv \e\[Z up-line
case xterm-256color
# Microsoft's conemu uses xterm-256color plus
# the following to tell a console to paste:
$legacy_bind --preset $argv \e\x20ep fish_clipboard_paste
end
end