如何在 tmux 和 alacritty 终端中的 zsh vi 模式下将 Option-Delete 绑定到 reverse-delete-word

如何在 tmux 和 alacritty 终端中的 zsh vi 模式下将 Option-Delete 绑定到 reverse-delete-word

我使用 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-wordbackward-delete-char

bindkey '^W' backward-kill-word
bindkey '^?' backward-delete-char

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

WORDCHARS=${WORDCHARS/\/}

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

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

相关内容