![zsh 键绑定:使后向杀字作用于整个带引号的字符串](https://linux22.com/image/194577/zsh%20%E9%94%AE%E7%BB%91%E5%AE%9A%EF%BC%9A%E4%BD%BF%E5%90%8E%E5%90%91%E6%9D%80%E5%AD%97%E4%BD%9C%E7%94%A8%E4%BA%8E%E6%95%B4%E4%B8%AA%E5%B8%A6%E5%BC%95%E5%8F%B7%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
当使用Ctrl+w或Alt+Backspace或Alt+d键盘快捷键向后/向前删除单词时,我知道我可以定义 WORDCHARS 字符:
WORDCHARS='~!#$%^&*(){}[]<>?.+;-'
例如,使用Ctrl+wfrom 该字符串的末尾,将连续删除每个单词
echo aaa bbb ccc ddd eee
但如果我有带引号的字符串,如何将整个带引号的块视为一个实体?
echo 'aaa bbb ccc' 'ddd eee fff'
所以,Ctrl+w应该一次性删除整个“ddd eee fff”。对于用双引号引起来的字符串应该有相同的行为"
答案1
这shell
字型正是这样做的。
autoload -U select-word-style
select-word-style shell
答案2
我认为你需要有空间WORDCHARS
,而且似乎没有办法定义它们的使用规则,我不确定是否有办法实现这一点。也许有一种方法可以定义命令行可以引用的自定义 Emacs 宏。如果有办法做到这两点,这超出了我的熟悉范围,我很乐意听取知情人士的意见。
不是你想要的答案
这不是对所提出问题的直接答案,但它是某物您可以按照您所描述的方式进行操作,使用内置功能(需要遵循的注意事项):
将行编辑器方法更改为vi
set -o vi
然后你可以试着记住输入这个小美:
Esc2dF"x 或Esc2dF'x根据使用的报价。
它并没有真正从手指上滚下来,但.如果你愿意的话,你至少可以按一下重复。
注意事项
它只是向后搜索两次给定引用的实例,并删除所有阻碍的内容(不考虑语法、上下文等)。鉴于这是您的命令行,并且您的光标位于末尾:
echo "foo bar" baz
你最终会得到
echo<space>
或者如果你开始于
echo "foo bar" baz "boz
你最终会得到同样的结果不完全是我想要的
echo "foo bar
在开始打字之前,您需要进入vi
模式,因此您必须在您的个人资料或类似内容中进行设置。
在命令行中作为vi
编辑器是一种范式转变,并且可能会与肌肉记忆作斗争——这看起来确实不太有趣。
所以...
我可能会坚持CtrlW自己砸几次。
如果你不小心做过头了,总是可以撤消的Ctrl_。
答案3
吉尔斯所描述的文字风格确实是做到这一点的正确方法。但如果您遵循他的建议,所有基于单词的键都会出现这种行为。因此M+f将停止按单词向前移动[A-Za-z0-9]
,而是向前跳转一个完整的 shell 参数。
由于您请求一种一次删除完整 shell 参数的方法,但没有提及任何其他移动,因此您可以执行以下操作:
autoload -U select-word-style
select-word-style normal
zle -N backward-kill-shell-word backward-kill-word-match
zstyle :zle:backward-kill-shell-word word-style shell
bindkey '^w' backward-kill-shell-word
这会将Ctrl+绑定W到新创建的 zsh 小部件backward-kill-shell-word
。显然,如果您想为此使用不同的快捷方式,则需要调整 bindkey 的第一个参数。看zsh 文档了解更多。
注意:不同的终端仿真器针对相同的按键发送不同的十六进制代码/转义序列。就我而言,我实际上想使用Ctrl+ Backspace( Mac 上的Ctrl+ Delete。)这并非微不足道的,Ctrl+Backspace是特别充满忧虑。就我而言(macOS 上的 iTerm2),我实际上需要创建并发送合成转义序列for Ctrl+Delete得到我想要的行为。然后我^[[27;6;8~
在bindkey
我的.zshrc
.
我想指出的是,我用来解决这个问题的所有三个答案都来自吉尔斯,他是人类中的巨人。谢谢你!