使用通配符进行 Bash 自动完成

使用通配符进行 Bash 自动完成

我想像在 emacs 中一样在终端中输入:

emacs 2019-*subject*

当我点击时,Tab我得到了第一场比赛:

2019-08-03-subject.markdown 

我希望它能向我显示以下选项:

2019-08-03-subject.markdown 2019-bla-bla-subject-predicate.markdown etc...

我在网上查遍了所有地方,不敢相信这不是一个功能。

许多 相似的提出的问题。答案并不像我想要的那样(如上所示)。我尝试过的其他解决方案:这里

PS 我使用 Ubuntu 16。这是我在打开文件时在 emacs 中发现的典型功能。这非常方便。

答案1

之后发生的事情Tab取决于完成脚本。这个答案让我相信 2013 年至少有一位用户实现了所需的行为,但在 2019 年,我的 Debian 9 中的行为就像您描述的那样;可能从那时起脚本/行为就发生了变化。

此外,Bash 根据输入的命令(当前行中的第一个单词)选择脚本。任何单一更改都会影响所有补全以提供您想要的内容,这一点并不明显(我想该_filedir功能是一个很好的开始)。


幸运的是,您可以根据需要获得可能的扩展。来自man 1 bashREADLINE标题下):

glob-complete-word( M-g)
point 之前的单词被视为路径名扩展的模式,并隐式附加星号。此模式用于生成匹配文件名的列表,以供可能的补全。

glob-expand-word( C-x *)
point 之前的单词被视为路径名扩展的模式,并插入匹配的文件名列表,替换该单词。如果提供了数字参数,则在路径名扩展之前附加一个星号。

glob-list-expansions( C-x g)显示
将生成的扩展列表,并重新绘制该线。如果提供了数字参数,则在路径名扩展之前附加一个星号。glob-expand-word

M-gC-x *描述C-x g默认键绑定。更友好的格式如下:

  • Meta+ gAlt+ g)表示glob-complete-word
  • Ctrl+ x,(释放Ctrl*表示glob-expand-word(注意:在我的键盘上*实际上是Shift+ ),8
  • Ctrl+ x,(发布Ctrlg对于glob-list-expansions

以下代码设置这些绑定(以防它们由于某种原因丢失):

  • 仅适用于当前 shell:

    # commands to run in Bash
    bind '"\eg":   glob-complete-word'
    bind '"\C-x*": glob-expand-word'
    bind '"\C-xg": glob-list-expansions'
    
  • 或者在你的永久配置中(/etc/inputrc~/.inputrc):

    # lines to add
    "\eg":   glob-complete-word
    "\C-x*": glob-expand-word
    "\C-xg": glob-list-expansions
    

    (请注意,这只会影响新的 shell,除非你重新加载)。


您可能对glob-complete-word或感兴趣glob-list-expansions。主要区别:

  • glob-complete-word总是附加一个星号,而glob-list-expansions有条件地执行此操作(参见引用的手册)。
  • 如果有很多匹配项,那么您可能需要触发glob-complete-word两次(即按下组合键两次)才能打印某些内容;这取决于show-all-if-ambiguous,比较已经提到答案
  • 如果只有一次匹配,那么glob-complete-word将执行实际的行完成,同时glob-list-expansions仍然只显示匹配。

在您的特定情况下输入以下代码:

emacs 2019-*subject*

然后Ctrl+ x, g

相关内容