如何通过两次击键来删除 zsh 中的斜杠或单词?

如何通过两次击键来删除 zsh 中的斜杠或单词?

重击行为

我刚刚从 迁移bashzsh。在 中bash,我有以下行~/.inputrc

"\e\C-?": unix-filename-rubout

因此,Alt+Backspace会删除回到前一个斜杠,这对于编辑路径很有用。

单独地,bash默认为Ctrl+w 删除上一个空间,这对于删除整个参数很有用(假设它们没有空格)。因此,有两个稍微不同的使用每个组合键执行的操作。

Zsh 行为

在 中zshAlt+BackspaceCtrl+都w做同样的事情。他们都删除了前一个单词,但他们对断词的定义过于宽松,删除了前一个-_。有没有办法让zsh行为类似于bash, with两个独立的动作?如果重要的话我已经oh-my-zsh安装了。

答案1

这里也提出了类似的问题:zsh:在目录分隔符上停止向后杀字

并给出了可行的解决方案:将这些设置添加到您的 zshrc 中:

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

答案2

编辑:您的问题后的下一个谷歌结果是这个具有相同解决方案的结果:zsh:使 ALT+BACKSPACE 停在非字母数字字符处

这个答案是/nick FoH由 freenode 上的 #zsh 提供的。

backward-kill-dir () {
    local WORDCHARS=${WORDCHARS/\/}
    zle backward-kill-word
    zle -f kill
}
zle -N backward-kill-dir
bindkey '^[^?' backward-kill-dir

通过这种方式,您可以用于ctrl+w删除单词(用 vim 行话)并alt+bkspc删除单词

答案3

扩展于垃圾机械师的回答,我想要那个

  • 现有的 zsh 快捷方式(CtrlWCtrlCtrl)与 zsh 默认值一样工作
  • Alt基于快捷方式(AltWAltAlt)的工作方式类似,但“更细粒度”,例如直到最接近的/

这是我现在使用的:

# Alt+Backspace
backward-kill-dir () {
    local WORDCHARS=${WORDCHARS/\/}
    zle backward-kill-word
    zle -f kill  # Ensures that after repeated backward-kill-dir, Ctrl+Y will restore all of them.
}
zle -N backward-kill-dir
bindkey '^[^?' backward-kill-dir


# Alt+Left
backward-word-dir () {
    local WORDCHARS=${WORDCHARS/\/}
    zle backward-word
}
zle -N backward-word-dir
bindkey "^[[1;3D" backward-word-dir

# Alt+Right
forward-word-dir () {
    local WORDCHARS=${WORDCHARS/\/}
    zle forward-word
}
zle -N forward-word-dir
bindkey "^[[1;3C" forward-word-dir

有关 的详细信息zle -f kill,请参阅Zsh - 在自定义小部件中粘贴文本仅适用于最后一个单词,可以修复吗?

答案4

bindkey '^[^?' vi-backward-kill-word


据我所知,它的效果Meta-BackSpace@thomas-dickey 建议的答案,而且是单行而不是两行;-)。然而,这仅有的影响Meta-BS。如果您正在寻找元(左/右)导航的完整类似 bash 的行为,那么这select-word-style是正确的方法。

(脚注:select-word-style-事物已记录在案,man zshcontrib但我几乎无法理解。vi-backward-kill-word记录在man zshzle。)

相关内容