zsh 键绑定:使后向杀字作用于整个带引号的字符串

zsh 键绑定:使后向杀字作用于整个带引号的字符串

当使用Ctrl+wAlt+BackspaceAlt+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"xEsc2dF'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.

我想指出的是,我用来解决这个问题的所有三个答案都来自吉尔斯,他是人类中的巨人。谢谢你!

相关内容