如何在 zsh 中删除两个键以删除斜杠或单词?

Spa*_*awk 37 zsh

Bash 行为

我刚刚从 迁移bashzsh. 在 中bash,我在~/.inputrc.

"\e\C-?": unix-filename-rubout
Run Code Online (Sandbox Code Playgroud)

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

另外,bash默认为 make Ctrl+ w delete 到前一个space,这对于删除整个参数很有用(假设它们没有空格)。因此,每个组合键执行的操作略有不同

Zsh 行为

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

Tho*_*key 30

这里问了一个类似的问题:zsh: stop backward-kill-word on directory delimiter

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

autoload -U select-word-style
select-word-style bash
Run Code Online (Sandbox Code Playgroud)

  • 您需要调整 WORDCHARS 变量。在 zsh 中很容易使用 `vared WORDCHARS` (2认同)
  • @Jshura 不,根据问题,我想要两个不同的函数,这在`bash` 中是可能的。 (2认同)

Jun*_*nic 20

编辑:您提出问题后的下一个谷歌结果是具有相同解决方案的结果: zsh: make ALT+BACKSPACE stop at non-alphanumeric characters

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

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

这样你就可以ctrl+w用来删除一个单词(在 vim 术语中)和alt+bkspc删除一个单词


nh2*_*nh2 9

扩展JunkMechanic 的回答,我想要那个

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

这是我现在使用的:

# 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
Run Code Online (Sandbox Code Playgroud)

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