我正在寻找一个 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-bigword
到Alt+B(和vi-forward-bigword
on Alt+F) 以获得您期望的行为(与其中相同,zsh
也可以让您在不同的文字样式之间进行选择):
bind '"\eb": vi-backward-bigword'
bind '"\ef": vi-forward-bigword'
然后你就可以使用Alt+2 Alt+B.
还有shell-backward-word
和shell-forward-word
跳过 shell 标记。例如,在:
cmd "first arg" $(echo second third)
"first arg"
、$(
、echo
、second
和third
都是)
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
运行它。确实,可能性是无限的。