在终端中给定的很长的命令行上移动的最佳方式是什么?
假设我使用箭头键或 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 是元密钥。对于 Max OS X 终端,您可以为此在设置/键盘中启用“使用选项作为元键”。对于 Linux,它更复杂。
更新
另请注意,Readline 可以在两种模式下运行:
emacs 模式(默认)
vi 模式
要将 Bash 切换为使用 vi 模式:
$ set -o vi
我个人更喜欢 vi 模式,因为我使用 vim 进行文本编辑。
奖金
在 macOS 终端应用程序(以及 iTerm 中)中,您可以 Option-Click 移动光标(光标将移动到单击位置)。这甚至适用于 vim
。
由于这还没有关闭,这里有更多的选择。
使用 Ctrl+x 后跟 Ctrl+e 在 $FCEDIT 或 $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 键并单击您希望光标移动的位置,终端会将光标冲到该精确位置。
我更喜欢 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 所说 - 命令行对于编辑荒谬的长行并不是特别好 - 为什么不将命令变成脚本呢?
如果您想向前移动一定数量的单词,请点击 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
增量历史搜索
在终端输入:
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
并点击向上箭头命令将很快出现
一种选择是在 emacs
中使用 M-x shell
。这提供了 emacs
所具有的所有编辑功能和击键,因此 C-s
可用于搜索文本 option25
,例如。
(但如果有人能指出我良好的搜索和编辑设施,我仍然更喜欢使用真正的终端外壳。)
它可能不是最快的,但需要在这里,一些关于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
使用选项键并单击要使用鼠标或触摸板放置光标的位置是您使用的是 Mac 内置终端。
使用鼠标
有时,编辑命令行的最简单方法是使用鼠标。以前的一些答案给出了在 $EDITOR 中打开当前行的命令。对我(带有 grml 配置的 zhs)来说,该组合是 Alt+e
。如果您在编辑器中启用鼠标,则可以使用它。
要在 Vim 中启用鼠标,请将其添加到 ~/.vimrc
set mouse=a
set ttymouse=xterm2
如果您想在终端中进行文本选择(而不是将鼠标单击传递给 vim),请在单击时按住 Shift;当然,这是特定于终端的。
系统管理员不应该害怕鼠标。
在 Cygwin 中,您可以通过右键单击窗口来激活此类功能。在弹出窗口中,选择选项... -> 鼠标 -> 激活点击放置命令行光标 -> 应用。
从现在开始,只需在命令行中的某个位置单击鼠标左键即可将光标放置在那里。
第一:export EDITOR='nano -m'
然后:按顺序CTRL+X CTRL+E。
您当前的行将在启用鼠标的 nano 编辑器中打开。您可以单击文本的任何部分并进行编辑
然后 CTRL+X 退出, y 确认保存。
我制作了一个脚本,使命令行光标在鼠标单击时移动:
启用 xterm 鼠标跟踪报告 设置 readline 绑定以使用单击生成的转义序列
可在 github 上找到
有关 another post 的更多信息
如果 echo -e "\e[?1000;1006;1015h" # Enable tracking
在终端上使用鼠标单击时打印转义序列,则将起作用
不定期副业成功案例分享