181

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

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

4

15 回答 15

225

需要明确的是,您不想要“在终端命令行上移动光标的快速方法”。您真正想要的是一种在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 是元密钥。对于 Max OS X 终端,您可以为此在设置/键盘中启用“使用选项作为元键”。对于 Linux,它更复杂。

更新

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

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

$ set -o vi

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

奖金

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

于 2012-08-17T16:58:12.933 回答
118

由于这还没有关闭,这里有更多的选择。

  • 使用Ctrl+x后跟Ctrl+在由ore指定的编辑器中打开当前行或(按该顺序尝试)。$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非常方便快捷,无需与编辑器混为一谈,并且您可以在命令运行之前看到结果(与历史扩展不同)。

于 2009-05-13T11:01:13.873 回答
39

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

于 2016-07-21T12:44:50.680 回答
12

我更喜欢 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",然后返回到单词的开头。

于 2009-03-18T06:21:31.270 回答
9

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

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

但或者,您可以打开终端首选项 -> 设置 -> 配置文件 -> 键盘并选中“使用选项作为元键”

于 2012-05-11T11:28:17.827 回答
8

运行一次命令后,运行fc

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

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

于 2009-03-18T12:46:15.590 回答
4

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

于 2015-01-06T06:25:51.707 回答
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

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

于 2014-03-20T06:59:06.143 回答
1

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

(但如果有人能指出我良好的搜索和编辑设施,我仍然更喜欢使用真正的终端外壳。)

于 2009-03-18T18:19:40.687 回答
1

使用选项键并单击要使用鼠标或触摸板放置光标的位置是您使用的是 Mac 内置终端。

于 2021-10-31T04:21:27.230 回答
0

使用鼠标

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

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

set mouse=a
set ttymouse=xterm2

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

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

于 2016-11-13T12:49:57.793 回答
0

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

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

于 2017-06-14T13:00:00.627 回答
0

第一:export EDITOR='nano -m'

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

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

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

于 2018-12-29T18:46:53.143 回答
0

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

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

可以在github上找到

其他帖子的更多信息

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

于 2019-03-31T05:06:06.697 回答
0

它可能不是最快的,但这需要在这里,一些关于ANSI 光标移动的阅读

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

- 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
于 2019-10-16T21:01:00.933 回答