我经常通过终端运行我的研究实验。该命令非常长,我经常发现需要更改调用的参数。问题是调用线很长,并且参数例如位于该行的中间。要替换参数,我必须按住向左箭头/向右箭头,直到到达参数所在的位置,然后删除并重写字符。
有没有办法使用鼠标光标位置导航终端命令行?当然,单击该行的中间不会执行任何操作。
例子:
假设我在终端中:
〜> runThisProgram(a,b,c,d,......,v,w,x,y,z)。
现在我想运行它,但使用 X 而不是参数 c。我必须转到该行的末尾,继续按向左箭头,直到到达 c,然后删除并写入 X。(或者,对称地,转到该行的开头,继续按向右箭头,直到到达c,然后删除并写入 X)。是否有一个命令可以使用光标指向“c”位置并转到那里?
答案1
您可以在 shell 中一次移动一个单词:Alt+B将光标向后移动一个单词,Alt+F将光标向前移动一个单词。Alt+D删除光标后的单词。更多热键组合的bash
解释见手册。
答案2
有几种方法可以做你想做的事。
交互模式
现代(和最流行的)shell,如 bash 和 zsh 使用 GNU readline 作为输入库。看男人3阅读线, 部分编辑命令。有两种模式:emacs 和 vi。
Emacs风格
set -o emacs
@sebasth 的回答涵盖了这一部分。
CTRL+ P(或UP):最后一个命令
ALT+ B: 单词向后
ALT+ F: 字向前
ALT+ D: 删除下一个单词
ALT+ backspace: 删除前一个单词
CTRL+ A: 行的开头
CTRL+ E: 行尾
维风格
set -o vi
按I进入插入模式并ESC进入命令模式。进入命令模式,然后:
K:最后一个命令
B: 单词向后
W: 话向前
DW: 删除下一个单词
DB: 删除前一个单词
0: 行的开头
$: 队伍的尽头
使用外部编辑器
fc
将在您最喜欢的编辑器中粘贴您的最后一个命令(您也可以指定历史记录中的另一个命令)(请参阅 $EDITOR 变量)。该命令将在退出编辑器时运行。
当命令行开始变得越来越长时,您可能想要使用真正的编辑器而不是 shell 的 readline。作为奖励,您可以将其另存为磁盘上的脚本文件。
仅修改1个参数
使用^before^after
允许将字符串替换before
为after
.
例如:
abitbol@localhost $ echo 1 2 3 4 5 6 7
1 2 3 4 5 6 7
abitbol@localhost $ ^3^42
echo 1 2 42 4 5 6 7
1 2 42 4 5 6 7
答案3
看来您正在使用,bash
因此您可以使用一个readline
函数将变量READLINE_POINT
(文本光标的位置)设置为所需的列。查找该列的一种廉价方法是(使用鼠标)选择从行开头到所需位置的所有文本,然后使用xsel
读取此选择。
例如,要尝试一下,请将字符绑定!
到函数gotocolumn
:
$ bind '-x "!":gotocolumn'
$ gotocolumn(){ local x=$(xsel);READLINE_POINT=${#x}; }
回忆一长行,从前面选择几个字符,键入!
并移动光标。
我刚刚注意到将文本光标移动到鼠标位置实际上是内置的xterm具有该readline-button
功能,并且只需要一个合适的绑定。例如,运行
xterm -xrm 'XTerm.VT100.translations: #override\
Mod4 <Btn1Down>: readline-button()\n'
然后,当您用 Meta(或 Super)键在输入行中的字符上单击鼠标左键时,xterm 会生成左键或右键,直到光标对齐。
相似地,乌尔克斯VT有一个内置的 perl 扩展(请参阅 参考资料man urxvt-readline
),默认情况下启用,并绑定 Shift 和左键。
答案4
将其包装在一个简单的 shell 脚本中,并使用 shell 变量作为您想要调整的参数:
#!/bin/sh
param_c=340
./myprogram 1 2 "$param_c" \
4 5 6 7