我经常使用!n:m
形式使用命令历史记录扩展,其中n
是历史命令的编号,m
是参数的编号或其缩写形式
有没有办法在现场扩展这些论点,以便我可以选项卡完成它们?
一个简单的例子:
$ mycmd long/path/with/plenty/of/subdirectories/
$ cp !$/tediously-verbose-filename.txt .
我希望能够使用参数重复,而无需完全输入文件名(或使用ls
或echo
进行虚拟运行。)
答案 0 :(得分:3)
不是完全 OP想要什么,但您可以使用readline快捷方式从先前命令中检索特定参数,并且快捷方式为Alt+.
。对于OP给出的具体示例,这非常有效,具有以下工作流程:
$ mycmd long/path/with/plenty/of/subdirectories/
$ cp <Alt>+./tediously-verbose-filename.txt .
以下是我认为非常有用的其他一些内容:
Alt+.
,它将从历史记录中的先前命令中检索最后一个参数。Alt+.
前加Alt+<n>
,其中n
是来自0-9
的数字,以检索特定参数。例如,Alt+0Alt+.
将检索命令本身,Alt+1Alt+.
将检索第一个参数等。然后,您可以继续按Alt+.
而不必重复前缀。注意:在Alt
组合不起作用的终端上,您可以使用Esc
前缀,例如<Esc>.
。
答案 1 :(得分:2)
是的,请使用以下内容:
cp !$:h/tediously-verbose-filename.txt
:h
部分将带来命令参数的目录部分
答案 2 :(得分:2)
您正在寻找的概念术语是[命令] 历史和历史记录扩展 - 如果您运行man bash
,您会找到HISTORY
部分1}}和HISTORY EXPANSION
致力于此主题。
那就是说,在这种特殊情况下,它不是历史扩展,而是特殊的shell变量$_
,这是你的朋友:
它扩展到最近命令的最后(扩展)参数。
尝试以下方法,模仿您的方案:
ls "$HOME"
# Type this on the command line and press TAB (possibly twice)
# _before_ submitting to TAB-complete to matching files in "$HOME"
# (irrespective of what the current directory is).
# $_ at this point contains whatever "$HOME" expanded to, e.g. "/Users/jdoe".
cp $_/
注意:标签完成是否适用于给定命令与是否使用$_
无关。有关如何为感兴趣的命令手动启用制表符完成,请参阅man bash
,Programmable Completion
部分。
答案 3 :(得分:0)
我知道这是旧的,但看起来只有我看到的选项是:p
运行命令通过打印到屏幕预览,然后在历史记录中向上箭头以在编辑后运行它。
我很好奇是否可以创建一个函数来拉取!!:p
的结果,然后在命令实际运行之前将其返回到该行,例如!!
之后的选项卡启动。如果我设法弄清楚如何写它,我会发布它。
但这是我的意思的例子:
cd@PC:~> _ zypper install git
Loading repository data...
Reading installed packages...
'git' not found in package names. Trying capabilities.
No provider of 'git' found.
Resolving package dependencies...
Nothing to do.
cd@PC:~> !!:p
_ zypper install git
cd@PC:~> _ zypper install git-core