bash 单词移动的不同分隔符

bash 单词移动的不同分隔符

我正在寻找一个 bash emacs 模式快捷方式来将光标向后移动命令行上特定数量的参数。为了说明我正在寻找的内容,我将使用一个具体的示例([]光标在哪里):

开始: $ prog -v a/b/c d/e/f[]

目标: $ prog -[]v a/b/c d/e/f或者$ prog -v[] a/b/c d/e/f

理想情况下,我想有效地告诉 bash 将光标移回n参数,其中参数是非空白字符的连续字符串。

我尝试过的:

  • 等待left-arrow足够长的时间可以让我到达我想去的地方,但效率很低。

  • C-a,然后坐right-arrow足够长的时间。也无效率。

  • M-b返回 readline 认为的“单词”,实际上它似乎停在空格、斜杠和破折号处。但是,我只希望它停在空白字符处。对于给定的示例,我必须使用M-b+ M-b+ M-b+ M-b+ M-b+ M-b+M-b才能到达我想去的地方,而不是我想要的两次。

  • M-7+M-b做了M-b七次,所以确实提高了效率,但是需要脑力来统计“单词”分隔符的个数。对我来说,计算空白符要容易得多,而不是任何 readline 认为的“单词”分隔符。

理想情况下,我可以指定要返回的参数数量,然后告诉它返回;像M-2+之类的东西M-b

@m0dular 指出,在 vi 模式下,B按照我的希望对待参数边界,但我想保留在 emacs 模式下,并且,我希望能够指定要返回的参数数量,而无需重复返回命令本身。

笔记:我本来发布了这个版本在 StackOverflow 上,但由于它与编程没有直接关系,所以他们建议我来这里。

答案1

您始终可以绑定vi-backward-bigwordAlt+B(和vi-forward-bigwordon Alt+F) 以获得您期望的行为(与其中相同,zsh也可以让您在不同的文字样式之间进行选择):

bind '"\eb": vi-backward-bigword'
bind '"\ef": vi-forward-bigword'

然后你就可以使用Alt+2 Alt+B.

还有shell-backward-wordshell-forward-word跳过 shell 标记。例如,在:

cmd "first arg" $(echo second third)

"first arg"$(echosecondthird都是)shell 标记。如果您引用该命令替换(正如您通常希望的那样),它就会成为一个 shell 标记。

答案2

我可以使用库的 emacs 模式键盘快捷键最接近readline的是Ctrl- Meta- ]v向后搜索v并将光标放在那里。如果光标位于行首,您还可以使用Ctrl-从光标位置向前搜索]v

答案3

这实际上是一个关于如何使用 进行导航的问题readline,默认模式是 emacs 风格的移动。您可能set -o vi对 vi 键绑定感兴趣。

在您的示例中set -o vi,您可以执行以下任一操作:

Esc F--

或者: Esc F-v

或者继续捣碎B直到光标到达您想要的位置。或者只需点击Esc-v编辑您的命令vim:wq运行它。确实,可能性是无限的。

相关内容