我想用like中的Ctrl+删除一个单词。Wzsh
vim /foo/bar^W
vim /foo/
并找到了解决方案bash
,但bind
不在 zsh 函数中。
如何将Ctrl+配置W为delete-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
答案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