我使用 alacritty,目前我有这些键绑定
key_bindings:
# (macOS only)
- { key: N, mods: Command, action: SpawnNewInstance }
- { key: F, mods: Command, command:
{ program: "osascript",
args: ["/Users/sand/.dotfiles/alacritty-fullscreen.applescript"] } }
# ...
- { key: Delete, chars: "\x1b[3~" }
我也使用 tmux
# Needed for CTRL-Left/Right to work.
setw -g xterm-keys on
# Use vi key bindings in copy mode.
setw -g mode-keys vi
# Search mode vi
set-window-option -g mode-keys vi
我希望 vi 可以绑定到 zsh,但我最想念的是 option+delete 会在 INSERT 模式下向后删除 1 个单词,就像我在 zsh emacs 模式下所做的那样。我知道我可以使用<C-W>
来删除单词,但我真的习惯了 Option-Delete。它也与我在浏览器文本框、google doc 中使用的一致,删除 1 个单词,所以我想保留它。我该如何实现这一点?
我还注意到,如果我在 zsh vi 模式下输入一些文本,点击ESC
进入 NORMAL 模式,然后使用 返回 INSERT 模式i
,我就不能再使用 delete 键删除之前输入的文本了。我只能输入新字符,或者返回 NORMAL 模式并cc
使用dd
删除文本。有什么想法吗?
答案1
要绑定 Alt-Backspace(在 Mac 上 Alt 是 Option,不是吗?)来向后删除单词,请尝试:
bindkey '^[^?' backward-kill-word
backward-kill-word
(在 emacs 模式下绑定到 Alt-Backspace)删除直到最后一个单词,而(在 vi 模式下vi-backward-kill-word
绑定到)删除直到最后一个单词,但不会超过上次进入插入模式的位置。(来源: 。)这是唯一的区别,但是它们具有不同的值,这是一个环境变量,您可以在 .zshrc 中设置它以指定哪些字符被视为单词的一部分。因此,如果您将自己设置为 vi 模式,然后重新绑定并退格以使用常规的和而不是 vi 版本,就像在您的 .zshrc 中一样:<C-w>
man zshzle
$WORDCHARS
<C-w>
backward-kill-word
backward-delete-char
bindkey '^W' backward-kill-word
bindkey '^?' backward-delete-char
...那么现在你可以用这些键绑定删除内容,甚至可以删除上次进入插入模式之后的内容。问题是现在更多字符被视为单词的一部分,例如/
,因此<C-w>
会删除整个文件路径,这非常烦人。(这就是我发现这个问题的原因。)这是因为/
是的一部分,所以要修复它,只需删除.zshrc 中你不想要的$WORDCHARS
任何字符,如下所示:$WORDCHARS
WORDCHARS=${WORDCHARS/\/}
(这将删除,因为它被转义了,/
所以写为。)我个人还删除了字符。也许还有更多需要删除。最后,以防万一,这是我的系统上 的默认值,没有删除任何内容:\/
-
$WORDCHARS
*?_-/.[]~=&;!#$%^(){}<>