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

时间:2009-03-18 06:07:39

标签: bash terminal window

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

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

14 个答案:

答案 0 :(得分:185)

要清楚,您不希望快速将光标移动到终端命令行"。 您真正想要的是在 shell 程序中快速浏览命令行。

例如,

Bash是非常常见的shell。 它使用Readline库来实现命令行输入。因此,知道Readline绑定非常方便,因为它不仅用于bash。例如,gdb也使用Readline来处理输入。

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

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

Bare Essentials

  • Ctrl-b后退一个字符。
  • Ctrl-f向前移动一个字符。
  • [DEL]或[Backspace]删除光标左侧的字符。
  • Ctrl-d删除光标下方的字符。
  • Ctrl-_或C-x C-u撤消上一个编辑命令。你可以一直撤回到一个空行。

运动

  • Ctrl-a移动到行的开头。
  • Ctrl-e移动到行尾。
  • Meta-f向前移动一个单词,其中单词由字母和数字组成。
  • Meta-b向后移动一个单词。
  • Ctrl-l清除屏幕,重新打印顶部的当前行。

Kill and yank

  • Ctrl-k将文本从当前光标位置杀到行尾。
  • M-d从光标到当前单词的结尾,或者,如果在单词之间,则单击下一个单词的结尾。字边界与M-f使用的边界相同。
  • M- [DEL]从光标处取出当前单词的开头,或者,如果在单词之间,则从前一单词的开头处开始。字边界与M-b使用的边界相同。
  • Ctrl-w从光标到前一个空格。这与M-不同,因为单词边界不同。
  • Ctrl-y将最近被杀死的文本放回光标处的缓冲区。
  • M-y旋转杀死环,然后猛拉新的顶部。如果先前的命令是C-y或M-y,则只能执行此操作。

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

<强>更新

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

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

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

$ set -o vi

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

<强>加成

在macOS终端应用程序中(以及在iTerm中),您可以选择 - 单击以移动光标(光标将移动到单击的位置)。这甚至适用于vim

答案 1 :(得分:100)

由于尚未关闭,以下是一些选项。

  • 使用 Ctrl + x ,然后按 Ctrl + e 打开指定编辑器中的当前行$FCEDIT$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 非常方便快捷,编辑器没有任何问题,您可以在命令运行之前看到结果(与历史扩展不同)。

答案 2 :(得分:27)

按住Option键并单击您要移动光标的位置,Terminal将光标移动到精确的位置。

答案 3 :(得分: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”,然后回到单词的开头。

答案 4 :(得分:9)

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

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

但另外,您可以打开终端首选项 - &gt;设置 - &gt;个人资料 - &gt;键盘并选中“使用选项作为元键”

答案 5 :(得分:8)

运行一次命令后,运行fc

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

..但是,正如Pax所说 - 命令行不是特别适合编辑荒谬的长行 - 为什么不将命令变成脚本呢?

答案 6 :(得分:4)

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

E.g。

 $|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

答案 7 :(得分:2)

增量历史记录搜索

在终端输入:

gedit  ~/.inputrc

然后复制粘贴并保存

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

要找到上一个命令,您需要做的就是输入前两个或三个字母,向上箭头会带您快速说我想要:

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

我需要做的就是输入

fo

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

答案 8 :(得分:1)

一种选择是在M-x shell中使用emacs。这提供了emacs具有的所有编辑工具和按键,因此C-s可用于搜索文本option25

(但如果有人能指出我的搜索和编辑设施,我仍然更愿意进入真正的终端shell。)

答案 9 :(得分:0)

使用鼠标

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

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

set mouse=a
set ttymouse=xterm2

如果您想在终端中进行文本选择(而不是将鼠标点击到vim),请在单击时按住Shift键;当然,这是终端特定的。

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

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

第一: 出口EDITOR ='nano -m'

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

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

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

答案 12 :(得分:0)

我制作了一个脚本来使命令行鼠标单击时移动光标

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

可以在github

上找到

有关another post的更多信息

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

答案 13 :(得分:0)

它可能不是最快的,但这需要在这里,有关ANSI cursor movements的一些读物

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"

快速回显colors codes,以使程序着色:

echo -e "\033[35;42m" ; ifconfig