使用制表符完成Bash历史记录扩展

时间:2014-04-02 21:13:55

标签: bash bash-completion

我经常使用!n:m形式使用命令历史记录扩展,其中n是历史命令的编号,m是参数的编号或其缩写形式

有没有办法在现场扩展这些论点,以便我可以选项卡完成它们?

一个简单的例子:

$ mycmd long/path/with/plenty/of/subdirectories/
$ cp !$/tediously-verbose-filename.txt .

我希望能够使用参数重复,而无需完全输入文件名(或使用lsecho进行虚拟运行。)

4 个答案:

答案 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 bashProgrammable 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
相关问题