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

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

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

182193 次浏览

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

运行该命令一次后,运行 fc

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

..但是,正如 Pax 所说——命令行并不特别适合编辑长得离谱的行——为什么不将命令编入脚本呢?

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

(但是如果有人能为我提供良好的搜索和编辑工具,我还是更喜欢使用真正的终端 shell。)

由于这个问题还没有解决,这里还有一些其他的选择。

  • 使用 Ctrl + X后跟 Ctrl + 你好在由 $FCEDIT$EDITORemacs指定的编辑器中打开当前行(按此顺序试用)。
  • 如果您之前运行了该命令,请按 Ctrl + R进行反向历史记录搜索,然后键入 option25(在本例中)。将显示该行。按 标签开始编辑这一点。
  • 使用带有 s///修饰符的历史记录展开。例如,!-2:s/--option25/--newoption/将重新运行倒数第二个命令,但是替换选项25。要修改最后一个 ./cmd命令,请使用 !string语法: !./cmd:s/--option25/--newoption/
    任何分隔符都可以用来代替/替换。
  • 如果编辑前一行,可以使用快速替换: ^--option25^--newoption
  • 角色搜索。Pax 提到了这一点,并且可以在常规 emacs 模式下进行,Ctrl + ]用于正向搜索,Ctrl + Alt + ]用于反向搜索。

我推荐第二种选择。Ctrl + R非常方便快捷,不需要编辑器,而且在运行命令之前就可以看到结果(不同于历史扩展)。

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

在 OSX 中,Meta 翻译成 ESC,这很糟糕。

但是,也可以打开终端首选项-> 设置-> 配置文件-> 键盘并检查“ use option as meta key”

需要说明的是,您不想要一种“在 晚期命令行上快速移动光标的方法”。 实际上,您需要的是在 Shell程序中通过命令行导航的快速方法。

例如,Bash 是非常常见的 shell。 它使用 读数库来实现命令行输入。也就是说,了解 Readline 绑定非常方便,因为它不仅在 bash 中使用。例如,gdb 还使用 Readline 处理输入。

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

如果上面的链接关闭,可以进行简短的复制粘贴:

基本生活必需品

  • Ctrl-b 向后移动一个字符。
  • 向前移动一个字符。
  • [ DEL ]或[ Backspace ]删除光标左侧的字符。
  • 删除光标下面的字符。
  • Ctrl-_ or C-x C-u 撤消最后一个编辑命令。您可以一直撤消到一个空行。

有动静

  • 移动到行的开始。
  • 移动到行的末尾。
  • 向前移动一个单词,其中一个单词由字母和数字组成。
  • 向后移动一个单词。
  • 清除屏幕,重新打印顶部的当前行。

杀了再拉

  • 杀死从当前光标位置到行尾的文本。
  • 从光标到当前单词的末尾,或者,如果在单词之间,到下一个单词的末尾。单词边界与 M-f 使用的边界相同。
  • 从光标中删除当前单词的开头,或者,如果在单词之间,删除到前一个单词的开头。单词边界与 M-b 使用的边界相同。
  • 从光标到上一个空格,这与 M 不同,因为单词边界不同。
  • 将最近删除的文本拖回到光标的缓冲区中。
  • 旋转杀手环,拉动新的上衣。只有在先前的命令为 C-y 或 M-y 时才能这样做。

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

更新

还要注意,Readline 可以以两种模式操作:

  • Emacs 模式(默认模式)
  • 模式

要将 Bash 切换到 vi 模式:

$ set -o vi

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

意外收获

在 macOS 终端应用程序(和 iTerm 也) ,你可以选择-点击移动光标(光标将移动到点击的位置)。这甚至可以在 vim内部使用。

增量式历史搜索

在终端机输入:

gedit  ~/.inputrc

然后复制粘贴并保存

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

你需要做的就是输入前面的命令比如前面的2到3个字母然后向上的箭头会带你到那里快速地说 i want:

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

我只需要进去

fo

然后按向上箭头命令很快就会出现

如果你想向前移动一定数量的单词,按 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

按住 Option 键并单击您希望光标移动的位置,终端将光标移动到精确的位置。

用鼠标

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

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

set mouse=a
set ttymouse=xterm2

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

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

在 Cygwin,你可以右键单击窗口来激活这个功能。在弹出窗口中,选择 选择。-> 鼠标-> 激活 单击放置命令行光标-> 应用。

从现在开始,只要在命令行中的某个位置单击鼠标左键,光标就会出现在那里。

第一: Export EDITOR = ‘ nano-m’出口编辑器 = ‘ nano-m’

然后: 按顺序排列 CTRL + X CTRL + E。

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

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

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

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

它可以在 Github上找到

更多关于 另一个帖子的信息

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

它可能不是最快的,但这个需要在这里,一些阅读关于 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"这应该将光标向上移动7行屏幕,打印单词“ BASH”,然后返回到它开始生成正常提示符的位置。


例子 :

将光标向后移7行:

echo -e "\033[7A"

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

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

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

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

使用选项键和使用一个点击的地方,你想放置光标与鼠标或触摸板是你使用 Mac 内置终端。