更新(2020 年 3 月 2 日)

更新(2020 年 3 月 2 日)

我想用like中的Ctrl+删除一个单词。Wzsh

vim /foo/bar^W
vim /foo/

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

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

如何将Ctrl+配置Wdelete-word

答案1

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

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

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

答案2

仅供参考,我找到了这个解决方案这里变得更加优雅。我引用:

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

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

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

更新(2020 年 3 月 2 日)

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

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

export WORDCHARS='.-'

答案3

到目前为止,没有一个答案提供 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

相关内容