用最快的方法在terminal命令行上移动光标?

在terminal的特定命令行上移动的最佳方式是什么?

说我用箭​​头键或CtrlR来获得这个长的命令行:

./cmd --option1 --option2 --option3 --option4 --option5 --option6 --option7 --option8 --option9 --option10 --option11 --option12 --option13 --option14 --option15 --option16 --option17 --option18 --option19 --option20 --option21 --option22 --option23 --option24 --option25 --option26 --option27 --option28 --option29 --option30 --option31 --option32 --option33 --option34 --option35 --option36 --option37 --option38 --option39 --option40 --option41 --option42 --option43 --option44 --option45 --option46 --option47 --option48 --option49 --option50 

现在我需要移动(从行首或行尾开始)光标到--option25来修改那里的东西。

什么是最快的方式到达那里? 我通常做的是按CtrlA开始,然后反复按AltF逐词前进(或CtrlE去结束和AltB然后后退)。 但是需要花费太多的时间。 必须有一种方法来search和直接跳转到我需要修改的部分,例如option25

由于这还没有closures,这里有几个选项。

  • 使用Ctrl + x,然后按Ctrl + e打开由$FCEDIT$EDITORemacs指定的编辑器中的当前行( $FCEDIT顺序尝试)。
  • 如果您之前运行过命令,请按Ctrl + r进行反向历史search,然后键入option25 (在这种情况下)。 该行将被显示。 点击Tab开始编辑在这一点上。
  • 使用s///修饰符进行历史扩展。 例如!-2:s/--option25/--newoption/将重新运行倒数第二个命令,但replace选项25。 要修改最后一个./cmd命令,请使用!string语法: !./cmd:s/--option25/--newoption/
    可以使用任何分隔符代替/中的replace。
  • 如果编辑上一行,可以使用快速replace: ^--option25^--newoption
  • 字符search。 这是由Pax提到的,可以在正常的emacs模式下按Ctrl + ]进行前向search, 按Ctrl + Alt + ]进行后向search。

我build议第二个选项。 Ctrl + r非常方便快捷,不需要使用编辑器,并且在命令运行前看到结果(与历史扩展不同)。

要清楚的是,你不需要一个“在terminal命令行上快速移动光标”。 你真正想要的是在shell程序中通过命令行导航的快速方法。

例如, Bash是非常常见的shell。 它使用Readline库来实现命令行input。 可以这么说,知道Readline绑定是非常方便的,因为它不仅用在bash中。 例如,gdb也使用Readline来处理input。

在Readline文档中,您可以find所有导航相关的绑定(以及更多): http : //www.gnu.org/software/bash/manual/bash.html#Readline-Interaction

如果上面的链接出现故障,请复制粘贴:

基本必需品

  • Cb移回一个字符。
  • Cf前进一个字符。
  • [DEL]或[Backspace]删除光标左边的字符。
  • Cd删除光标下方的字符。
  • C-_或Cx Cu撤消上一个编辑命令。 您可以撤消一路回到空行。

运动

  • Ca移动到行首。
  • Ce移动到行的末尾。
  • Mf前进一个单词,一个单词由字母和数字组成。
  • Mb向后移动一个单词。
  • Cl清除屏幕,重新打印顶部的当前行。

杀死和猛击

  • Ck将当前光标位置的文本杀死到行尾。
  • Md从光标杀死到当前单词的结尾,或者如果在单词之间,则结束到下一个单词的结尾。 单词边界与制造商使用的相同。
  • M- [DEL]从光标处杀死当前单词的开头,或者如果在单词之间,则杀死前一个单词的开头。 字边界与Mb使用的边界相同。
  • Cw从光标杀死前一个空格。 这与M-不同,因为单词边界不同。
  • Cy将最近被杀死的文本放回到光标处的缓冲区中。
  • 我旋转杀死戒指,并拔出新的顶部。 如果先前的命令是Cy或My,则只能执行此操作。

M是元键。 对于Max OS X Terminal,您可以在设置/键盘中启用“使用选项作为元键”。 对于Linux来说更为复杂。

更新

另外请注意,Readline可以在两种模式下运行:

  • emacs模式(这是默认的)
  • vi模式

要切换Bash以使用vi模式:

 $ set -o vi 

Personaly我更喜欢vi模式,因为我使用vim进行文本编辑。

奖金

在macOSterminal应用程序中(也可以在iTerm中),可以通过Option-Click移动光标(光标将移动到点击的位置)。 这甚至可以在vim里面工作。

按住Option键并点击你想要移动光标的位置,terminal将光标移动到精确的位置。

我倾向于selectvi编辑模式(因为这些击键现在embedded我的脊髓(大脑根本不用),还有WordStar 3.3中的CTRL-K,CTRL-X :-)。 你可以使用命令行set -o vi来激活它(并set -o emacs来恢复)。

在Vi中,(ESC-K首先获得排队)“ f5;;B ”(没有双引号)。

当然,你必须明白什么是脱线。 基本上是这样

 f5 to find the first occurrence of "5" (in --option5). ; to find the next one (in --option15). ; to find the next one (in --option25). B to back up to the start of the word. 

让我们看看emacs爱好者是否能够提出一个更好的解决scheme,less于5次击键(尽pipe我不想发起宗教战争)。

你有没有想过是否可能想把这个可怕的长命令写入脚本? 🙂

其实我可以比这个更好一些:“ 3f5B ”find第三个“5”,然后回到这个单词的开头。

运行一次命令后,运行fc

它将启动$EDITOR与以前的命令,然后你可以使用您的常规编辑器来修改该命令。 当你保存并退出时,文件将被执行。

..但是,正如Pax所说 – 命令行不是特别好编辑荒谬的长行 – 为什么不把这个命令变成一个脚本?

使用Meta-b / Meta-f分别向后/向前移动一个字。

在OSX中,Meta翻译为ESC,这很吸引人。

但是,也可以打开terminal首选项 – >设置 – >configuration文件 – >键盘,并选中“使用选项作为元键”

如果你想向前移动一定数量的单词,按下M-<n>M-是Meta,通常是退出键)然后点击一个数字。 这会向readline发送一个重复的参数,所以你可以重复你想要的任何命令 – 如果你想前进,然后按下M-<n> Mf ,光标将向前移动<n>个单词。

例如

  $|echo "two three four five six seven" $ M-4 (arg: 4) echo "two three four five six seven" $ Mf $ echo "two three four| five six seven" 

所以对于你的例子来说,你可以点击M-26 Mf和你的光标在--option25| – 或者 – 从M-26 Mb行的末尾将光标置于--|option25

一个select是在emacs使用Mx shell 。 这提供了emacs具有的所有编辑工具和击键,例如,可以使用Cs来search文本option25

(但是,如果有人能指点我的search和编辑工具,我仍然更喜欢真正的terminalshell。)

增量历史search

在terminalinput:

 gedit ~/.inputrc 

然后复制粘贴并保存

 "\e[A": history-search-backward "\e[B": history-search-forward "\e[C": forward-char "\e[D": backward-char 

所有你需要做的,以find一个先前的命令是input说,前2或3个字母和向上的箭头将带你快速说我想:

 for f in *.mid ; do timidity "$f"; done 

所有我需要做的就是进入

 fo 

并向上箭头命令即将出现

使用鼠标

有时,编辑命令行的最简单方法是使用鼠标。 以前的一些答案给出了一个命令来打开你的$ EDITOR当前行。 对我来说(zhs with grml config)那个组合是Alt+e 。 如果您在编辑器中启用鼠标,则可以使用它。

要在Vim中启用鼠标,将其添加到〜/ .vimrc中

 set mouse=a set ttymouse=xterm2 

如果你想在terminal中进行文本select(而不是将鼠标移到vim上),点击时按住Shift键; 当然这是terminal特定的。

系统pipe理员不应该害怕鼠标。

在Cygwin中,您可以通过右键单击窗口来激活此function。 在popup的窗口中,select选项… – >鼠标 – >激活点击放置命令行光标 – >应用。

从现在开始,只需在命令行中的某个位置点击鼠标左键就可以将光标放在那里。