在终端的给定非常长的命令行上移动的最佳方法是什么?
假设我使用了箭头键或 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
?
答案 0 :(得分:185)
要清楚,您不希望快速将光标移动到终端命令行"。 您真正想要的是在 shell 程序中快速浏览命令行。
例如,Bash是非常常见的shell。 它使用Readline库来实现命令行输入。因此,知道Readline绑定非常方便,因为它不仅用于bash。例如,gdb也使用Readline来处理输入。
在Readline文档中,您可以找到所有与导航相关的绑定(以及更多): http://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction
如果上面的链接出现故障,请进行简短的复制粘贴:
Bare Essentials
运动
Kill and yank
M是Meta键。 对于Max OS X终端,您可以启用"使用选项作为元键"在设置/键盘中。 对于Linux来说,它更复杂。
<强>更新强>
另请注意,Readline可以在两种模式下运行:
要将Bash切换为使用vi模式:
$ set -o vi
Personaly我更喜欢vi模式,因为我使用vim进行文本编辑。
<强>加成强>
在macOS终端应用程序中(以及在iTerm中),您可以选择 - 单击以移动光标(光标将移动到单击的位置)。这甚至适用于vim
。
答案 1 :(得分:100)
由于尚未关闭,以下是一些选项。
$FCEDIT
或$EDITOR
或emacs
(按此顺序尝试)。option25
(在本例中)。该行将显示。点击 Tab 开始编辑。s///
修饰符进行历史记录扩展。例如。 !-2:s/--option25/--newoption/
将重新运行倒数第二个命令,但替换option25。要修改上一个./cmd
命令,请使用!string
语法:!./cmd:s/--option25/--newoption/
^--option25^--newoption
我推荐第二个选项。 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)
我制作了一个脚本来使命令行鼠标单击时移动光标:
可以在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