Bash 部分全局扩展

Ryo*_*Ryo 7 bash globbing tab-completion

我有一个与此类似但不同的问题:如果可能,我希望 bash在自动完成中使用glob 扩展。例如,我想

$ ls *2.<TAB>
Run Code Online (Sandbox Code Playgroud)

给我:

$ ls mydoc2.
mydoc2.pdf mydoc2.tex mydoc2.txt
Run Code Online (Sandbox Code Playgroud)

我经常遇到这种情况。在上面的例子中,我使用了短前缀“mydoc”,但实际的前缀通常很长。这可能吗?

我知道*2.*会扩展为C-x*,但这是一个不同的函数,在这种情况下不适合(因为我只需要从与 glob 匹配的文件列表中选择一个文件)。

Tra*_*rke 5

模拟这种自动完成行为的最佳方法是启用readline变量(如果找到多个匹配则显示可能的完成),然后使用readline命令调用完成(以执行 glob 路径名扩展)。show-all-if-ambiguous glob-complete-word


# 1: Enable `show-all-if-ambiguous` in ~/.inputrc

set show-all-if-ambiguous on
Run Code Online (Sandbox Code Playgroud)

show-all-if-ambiguous:这会改变完成函数的默认行为。如果设置为“on”,则具有多个可能完成的单词会导致立即列出匹配项而不是敲响警钟。默认值为“关闭”。


# 2a: Check to ensure that `glob-complete-word` is bound.

$ bind -q "glob-complete-word"

glob-complete-word can be invoked via "\eg".


# 2b: If unbound, bind `glob-complete-word` to "\eg".

$ bind '"\eg":glob-complete-word'
Run Code Online (Sandbox Code Playgroud)

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


# 3: Trigger the autocompletion with <META-g> or <ESC-g>

# META => alt      (Windows/Linux)
# META => option   (OSX)

$ ls *2.<META-g>     

# possible completions will be listed (show-all-if-ambiguous)   
mydoc2.pdf mydoc2.tex mydoc2.txt

# glob pathname completion will be performed (glob-complete-word)
$ ls mydoc2.  
Run Code Online (Sandbox Code Playgroud)