在终端命令行上移动光标的最快方法?


156

在终端中给定的非常长的命令行上四处移动的最佳方法是什么?

假设我使用了箭头键或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

Answers:


107

由于此操作尚未关闭,因此还有更多选择。

  • 使用Ctrl+ x后跟Ctrl+ e在由$FCEDITor $EDITORemacs(按此顺序尝试)指定的编辑器中打开当前行。
  • 如果您早先运行了命令,请按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非常方便,快捷,无需编辑,您可以在运行命令之前看到结果(与历史记录扩展不同)。


203

明确地说,您不需要“在终端命令行上移动光标的快速方法”。您真正想要的是在Shell程序中浏览命令行的快速方法。

例如,Bash是非常常见的外壳。它使用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是元密钥。对于Max OS X Terminal,您可以为此在“设置/键盘”中启用“将选项用作元密钥”。对于Linux,它更为复杂。

更新资料

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

  • emacs模式(默认设置)
  • vi模式

要将Bash切换为使用vi模式:

$ set -o vi

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

奖金

在macOS Terminal应用程序中(在iTerm中也是如此),您可以按住Option键单击以移动光标(光标将移至单击位置)。这甚至可以在内部使用vim


3
我更喜欢这个答案,因为它简化了[bash]键盘输入工作原理(来自哪里),即[Readline]的[本质/根源/原因]。
eugenevd 2013年

6
在标准Ubuntu终端中,Meta(M)为Alt + Shift,除非您禁用菜单访问键盘快捷键,在这种情况下,它仅为Alt。
brianpeiris

2
在Konsole的Kde中,Meta(M)是替代键
-Pipo

问题是,如果Meta为ALT,则Meta + F无效,因为ALT允许访问正在运行的程序的菜单(在此情况下为终端)。还有其他选择吗?
2014年

1
Mf是什么,所以您在这里不使用控制是什么?
PositiveGuy

33

按住Option键,然后单击您希望光标移动到的位置,然后Terminal将光标移到该精确位置。


2
您只是复制了我的效率
冈萨雷斯

在什么环境下可以使用?我猜只是在Mac OS中?
阿卜杜勒

即使在跳转服务器上,也可以在远程ssh linux上运行。
约翰·姜

10

我倾向于使用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”,然后返回到单词的开头。


不需要脚本-只需在vi模式下按“ v”并在编辑器中打开命令行。您可以使用换行符更好地格式化命令行,err,“脚本”,并且不需要临时文件。:)因此,“ v / 25”使您到达4个字符。
dannysauer

但是,然后,您不仅需要按<Enter>键来运行它。@dannysauer
CDR

9

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

在OSX中,Meta转换为ESC,很糟糕。

但是,您也可以打开终端首选项->设置->配置文件->键盘,然后选中“将选项用作元键”


8

运行一次命令后,运行 fc

它将$EDITOR与上一个命令一起启动,然后您可以使用常规编辑器修改该命令。保存并退出时,将执行文件。

..但是,就像Pax所说的那样-命令行对于编辑冗长的行不是特别好-为什么不将命令转换成脚本呢?


4

如果您想向前移动一定数量的单词,请点击M-<n>M-代表Meta,通常是转义键),然后点击一个数字。这会向readline发送一个repeat参数,因此您可以重复任何您想要的命令-如果您要前进,请按一下M-<n> M-f,光标将向前移动<n>字数。

例如

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

因此,对于您从行首的光标处开始的示例,M-26 M-f您的光标将位于--option25|行末处的-或-处,M-26 M-b将光标置于--|option25


2

增量历史搜索

在终端中输入:

gedit  ~/.inputrc

然后复制粘贴并保存

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

查找上一个命令所需要做的就是输入说前2或3个字母,向上箭头将带您快速到那里,说我想要:

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

我需要做的就是输入

fo

并点击向上箭头命令将很快出现


1

一种选择是使用M-x shellemacs。这提供了所有具有的编辑功能和击键emacs,因此C-s可以用于搜索文本option25

(但如果有人可以指出我要使用良好的搜索和编辑工具,我还是更喜欢使用真正的终端机外壳。)


0

使用鼠标

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

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

set mouse=a
set ttymouse=xterm2

如果然后要在终端中进行文本选择(而不是将鼠标单击传递给vim),请在单击时按住Shift键;当然,这是特定于终端的。

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


0

在Cygwin中,您可以通过右键单击窗口来激活该功能。在弹出窗口中,选择选项...- >鼠标->激活单击放置命令行光标 ->应用。

从现在开始,只需在命令行中的某个位置单击鼠标左键,即可将光标放置在此处。


0

第一:export EDITOR ='nano -m'

然后:依次按CTRL + X CTRL + E。

您当前的行将在启用鼠标的nano编辑器中打开。您可以单击文本的任何部分并进行编辑

然后按CTRL + X退出,然后按y确认保存。


0

我编写了一个脚本,使鼠标单击时命令行光标移动

  1. 启用xterm鼠标跟踪报告
  2. 设置readline绑定以使用点击产生的转义序列

可以在github上找到

有关其他帖子的更多信息

如果echo -e "\e[?1000;1006;1015h" # Enable tracking在使用鼠标单击时在终端上打印转义序列,则可以使用


0

它可能不是最快的,但这需要在这里,一些有关ANSI光标移动的信息

ANSI转义序列允许您随意在屏幕上移动光标。这对于由Shell脚本生成的全屏用户界面更为有用,但也可以在提示中使用。运动逃逸顺序如下:

- Position the Cursor:
  \033[<L>;<C>H
     Or
  \033[<L>;<C>f
  puts the cursor at line L and column C.
- Move the cursor up N lines:
  \033[<N>A
- Move the cursor down N lines:
  \033[<N>B
- Move the cursor forward N columns:
  \033[<N>C
- Move the cursor backward N columns:
  \033[<N>D

- Clear the screen, move to (0,0):
  \033[2J  or \033c
- Erase to end of line:
  \033[K

- Save cursor position:
  \033[s
- Restore cursor position:
  \033[u

(...)

尝试在提示符下输入以下代码(如果将其放入终端时,提示在终端下数行,则代码会更清楚一点):echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D"这应将光标向上移动七行,在屏幕上打印单词“ BASH ”,然后返回开始产生正常提示的位置。


例子

向后移动光标7行:

echo -e "\033[7A"

将光标移至第10行第5列:

echo -e "\033[10;5H"

快速回显颜色代码,使程序着色:

echo -e "\033[35;42m" ; ifconfig
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.