zsh:使 ALT+BACKSPACE 在非字母数字字符处停止

400*_*Cat 8 command-line keyboard-shortcuts zsh

zsh默认情况下通过,CTRL+wALT+Backspace似乎正是同样的效果。

我如何保持CTRL+w原样,并更改ALT+Backspace以使其停在非字母数字字符处。

即,当光标位于以下命令的末尾时:echo /aaa/bbb/ccc,按CTRL+w应离开echo,而按ALT+Backspace应离开echo /aaa/bbb/

更新

根据来自 的回答@Thomas Dickey,我已将以下内容添加到我的.zshrc

 my-backward-delete-word () {
    local WORDCHARS='~!#$%^&*(){}[]<>?+;'
    zle backward-delete-word
 }
 zle -N my-backward-delete-word

 bindkey    '\e^?' my-backward-delete-word
Run Code Online (Sandbox Code Playgroud)

现在命令行编辑器的行为与我预期的不同。

例如,单引号字符'未在 my 中枚举WORDCHARS,因此当我按下 时Alt+BackSpacebackward-delete-word应该停在'

这适用于第一个示例,但不适用于第二个示例:

$ echo 'asdf'
$ echo '

$ echo '=asdf'
$ echo '=
$
Run Code Online (Sandbox Code Playgroud)

在第二个例子中,我echo '=离开了命令行。在我Alt+BackSpace第二次按下后,所有东西都被吃掉了,包括echo. 我原以为只=应该被吃掉,因为它应该在'.

为什么这不能按预期工作?

Tho*_*key 9

实际上,我没有在 zsh bindings 中看到它,但是如果bindkey显示它,那么它可以通过绑定到您定义的函数来配置。

从我的回答开始

    我使用了名单上的某个人(奥利弗·基德尔)贡献的这一点;查看
    10 月 8 日星期一的档案,了解更多信息:

    tcsh-backward-delete-word () {
      本地 WORDCHARS="${WORDCHARS:s#/#}"
      zle 向后删除词
    }

    我将它绑定到 control-W:
    bindkey '^W' tcsh-backward-delete-word

    但你显然可以改变这一点。

    我想这就是你要找的,不是吗?

    '$WORDCHARS' 变量是 zsh 确定单词边界的方式,因此您
    可以在全局范围内添加“/”,但这可能会影响其他事情
    你想留下它,所以我更喜欢这个功能。

所以:您可以$WORDCHARS在自己的函数中用作局部变量,根据需要定义单词,并将其绑定到任意键。

定义函数时,不要忘记将其添加为键映射

zle -N tcsh-backward-delete-word
Run Code Online (Sandbox Code Playgroud)