如何在zsh中将Ctrl+w配置为删除词

iro*_*and 21 keyboard-shortcuts zsh zle

我想通过Ctrl+ Win zshlike删除一个单词。

vim /foo/bar^W
vim /foo/
Run Code Online (Sandbox Code Playgroud)

并为 找到了解决方案bash,但bind不在 zsh 函数中。

是否可以配置 ctrl-w(删除单词)?

如何将Ctrl+配置W为 a delete-word

小智 22

这是我一直在使用的.zshrc 中的一个片段:

my-backward-delete-word() {
    local WORDCHARS=${WORDCHARS/\//}
    zle backward-delete-word
}
zle -N my-backward-delete-word
bindkey '^W' my-backward-delete-word
Run Code Online (Sandbox Code Playgroud)

我记得这是原始来源:http : //www.zsh.org/mla/users/2001/msg00870.html


Ana*_*dis 14

只是为了您的信息,我发现这个解决方案在这里是更为优雅。我引用:

另一种选择是将WORDCHARS(将非字母数字字符视为单词的一部分)设置为不包含/.

如果您希望^w在点、下划线等处中断,您也可以调整它。在~/.zshrc我有:

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

更新 (2/Mar/2020)

正如@Patryk 在下面的评论中指出的那样,这不适用于ZSH >= 5.7. 这是我测试和处理的更新zsh 5.8 (x86_64-apple-darwin18.7.0)

autoload -U select-word-style
select-word-style bash

export WORDCHARS='.-'
Run Code Online (Sandbox Code Playgroud)


sit*_*tif 5

到目前为止,没有一个答案提供 bash 具有的所有属性。即:

  • CTRL-w 删除任何非空格字符。
  • CTRL-w 将文本放入终止环中(因此可以使用 CTRL-y 粘贴它)。
  • CTRL-w在后续的终止命令(CTRL-w、alt-backspace、alt-d 等)中将文本附加到终止环。

此外,我们不想全局设置 WORDCHARS,因为它会影响其他功能。

这是一个满足以上所有条件的解决方案:

        # Ctrl-w - delete a full WORD (including colon, dot, comma, quotes...)
        my-backward-kill-word () {
            # Add colon, comma, single/double quotes to word chars
            local WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>:,"'"'"
            zle -f kill # Append to the kill ring on subsequent kills.
            zle backward-kill-word
        }
        zle -N my-backward-kill-word
        bindkey '^w' my-backward-kill-word
Run Code Online (Sandbox Code Playgroud)