在终端中给定的非常长的命令行上移动的最佳方法是什么?
假设我使用了箭头键或Ctrl- R来获得这个长命令行:
./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
那里修改一些东西.
到达那里最快的方法是什么?我通常做的是Ctrl- A开始然后反复Alt- F逐字逐句前进(或者Ctrl- E结束Alt- B然后- 后退).但是在很长的路线上需要花费太多时间.必须有一种方法来搜索并直接跳转到我需要修改的部分,例如option25
?
需要说明的是,您不希望"快速在终端命令行上移动光标".您真正想要的是在shell程序中通过命令行导航的快速方法.
例如,Bash是非常常见的shell.它使用Readline库来实现命令行输入.因此,知道Readline绑定非常方便,因为它不仅用于bash.例如,gdb也使用Readline来处理输入.
在Readline文档中,您可以找到所有与导航相关的绑定(以及更多):http: //www.gnu.org/software/bash/manual/bash.html#Readline-Interaction
如果上面的链接关闭,请进行简短的复制粘贴:
基本必需品
Ctrl-b向后移动一个字符.
Ctrl-f向前移动一个字符.
[DEL]或[Backspace]删除光标左侧的字符.
Ctrl-d删除光标下方的字符.
Ctrl-_或Cx Cu撤消上一个编辑命令.您可以一直撤消回空行.
运动
Ctrl-a移动到行的开头.
Ctrl-e移动到行尾.
Meta-f向前移动一个单词,其中单词由字母和数字组成.
Meta-b向后移动一个单词.
Ctrl-l清除屏幕,重新打印顶部的当前行.
杀了并且猛拉
Ctrl-k将文本从当前光标位置杀到行尾.
Md从光标到当前单词的结尾,或者,如果在单词之间,到达下一个单词的结尾.字边界与Mf使用的边界相同.
M- [DEL]从光标处取出当前单词的开头,或者,如果在单词之间,则从前一单词的开头处开始.字边界与Mb使用的边界相同.
Ctrl-w从光标到前一个空格.这与M-不同,因为单词边界不同.
Ctrl-y将最近被杀死的文本放回到光标处的缓冲区中.
我旋转杀戮戒指,猛拉新的顶部.如果先前的命令是Cy或My,则只能执行此操作.
M是Meta键.对于Max OS X终端,您可以在"设置/键盘"中启用"使用选项作为元键".对于Linux来说,它更复杂.
更新
另请注意,Readline可以在两种模式下运行:
emacs模式(默认值)
vi模式
要将Bash切换为使用vi模式:
$ set -o vi
Personaly我更喜欢vi模式,因为我使用vim进行文本编辑.
奖金
在macOS终端应用程序中(以及在iTerm中),您可以选择 - 单击以移动光标(光标将移动到单击位置).这甚至在里面工作vim
.
由于尚未关闭,这里还有一些选择.
使用Ctrl+ x后跟Ctrl+ e打开$FCEDIT
or $EDITOR
或指定的编辑器中的当前行emacs
(按此顺序尝试).
如果您之前运行了该命令,请按Ctrl+键r进行反向历史记录搜索并键入option25
(在本例中).该行将显示.点击Tab此处开始编辑.
使用s///
修饰符进行历史记录扩展.例如,!-2:s/--option25/--newoption/
将重新运行倒数第二个命令,但替换option25.要修改最后一个./cmd
命令,请使用以下!string
语法:!./cmd:s/--option25/--newoption/
可以使用任何分隔符代替/替换.
如果编辑上一行,您可以使用快速替换: ^--option25^--newoption
字符搜索.这是Pax提到的,可以在常规的emacs模式下进行,Ctrl+ ]用于前向搜索,Ctrl+ Alt+ ]用于向后搜索.
我推荐第二种选择.Ctrl+ r非常方便快捷,编辑器没有任何问题,你可以在命令运行之前看到结果(与历史扩展不同).
按住Option键并单击您希望光标移动的位置,Terminal将光标移动到精确的位置.
我倾向于喜欢vi编辑模式(因为那些按键现在嵌入我的脊髓(大脑根本没用),以及来自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爱好者是否可以提出更好的解决方案,少于5次击键(虽然我不想开始宗教战争).
你有没有想过你是否愿意将这个可怕的长命令放入剧本中?:-)
实际上,我可以比那更好:" 3f5B
"找到第三次出现的"5"然后回到单词的开头.
使用Meta-b/Meta-f分别按单词向后/向前移动.
在OSX中,Meta转换为ESC,这很糟糕.
但另外,您可以打开终端首选项 - >设置 - >配置文件 - >键盘并选中"使用选项作为元键"
运行一次命令后,运行 fc
它将$EDITOR
使用上一个命令启动,然后您可以使用常规编辑器修改命令.保存并退出时,将执行该文件.
但是,正如Pax所说 - 命令行不是特别适合编辑荒谬的长行 - 为什么不将命令变成脚本呢?