交互模式

交互模式

我经常通过终端运行我的研究实验。该命令非常长,我经常发现需要更改调用的参数。问题是调用线很长,并且参数例如位于该行的中间。要替换参数,我必须按住向左箭头/向右箭头,直到到达参数所在的位置,然后删除并重写字符。

有没有办法使用鼠标光标位置导航终端命令行?当然,单击该行的中间不会执行任何操作。

例子:

假设我在终端中:

〜> 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允许将字符串替换beforeafter.

例如:

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

相关内容