如何在 tmux 和 alacritty 终端的 zsh vi 模式下将 Option-Delete 绑定到向后删除单词

San*_*yen 3 terminal vim zsh key-binding tmux

我使用 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~"                     }
Run Code Online (Sandbox Code Playgroud)

我也使用 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
Run Code Online (Sandbox Code Playgroud)

我想要为 zsh 绑定 vi,但我最怀念的是 option+delete 会在 INSERT 模式下向后删除 1 个单词,就像我在 zsh emacs 模式下一样。我知道我可以用来<C-W>删除单词,但我真的习惯了 Option-Delete。它也与我在浏览器文本框中使用的内容一致,谷歌文档...删除 1 个单词,所以我想保留它。我怎样才能做到这一点?

我还注意到,如果我在 zsh vi 模式下输入一些文本,点击ESC进入正常模式,然后使用 返回插入模式i,我将无法再使用删除键删除以前输入的文本。我只能输入新字符,或返回正常模式cc,然后dd删除文本。任何想法?

小智 6

要绑定 Alt-Backspace(Alt 在 Mac 上是选项,不是吗?)来向后删除单词,请尝试:

bindkey '^[^?' backward-kill-word
Run Code Online (Sandbox Code Playgroud)

backward-kill-word(在 emacs 模式下绑定到 Alt-Backspace)向后删除直到最后一个单词,并且vi-backward-kill-word(在 vi 模式下绑定到<C-w>)向后删除直到最后一个单词,但不超过上次进入插入模式的点。(来源:man zshzle。)这是唯一的区别,但是它们有不同的 值$WORDCHARS,这是一个环境变量,您可以在 .zshrc 中设置以指定哪些字符被视为单词的一部分。因此,如果您将自己设置为 vi 模式,然后重新绑定<C-w>并退格以使用常规版本backward-kill-word,而backward-delete-char不是 vi 版本,就像 .zshrc 中的那样:

bindkey '^W' backward-kill-word
bindkey '^?' backward-delete-char
Run Code Online (Sandbox Code Playgroud)

...然后现在您可以使用这些键绑定删除内容,甚至超出上次进入插入模式的位置。问题是现在更多的字符被视为单词的一部分,例如/,因此<C-w>删除整个文件路径,这非常烦人。(这就是我发现这个问题的方式。)那是因为/是 的一部分$WORDCHARS,所以要修复它,只需删除$WORDCHARS.zshrc 中不需要的任何字符,如下所示:

WORDCHARS=${WORDCHARS/\/}
Run Code Online (Sandbox Code Playgroud)

(这会删除/\/因为它被转义了。)我个人也删除了该-字符。也许还有更多需要删除。最后,为了以防万一,这就是$WORDCHARS我的系统上的默认值,无需删除任何内容:

*?_-/.[]~=&;!#$%^(){}<>
Run Code Online (Sandbox Code Playgroud)