16

这可能比“自定义选项卡完成”有更好的名称,但这是场景:

通常,当我在命令行输入一个命令,然后输入两次 {TAB} 时,我会得到当前目录中所有文件和子目录的列表。例如:

[user@host tmp]$ cat <TAB><TAB>
chromatron2.exe                  Fedora-16-i686-Live-Desktop.iso  isolate.py
favicon.ico                      foo.exe                          James_Gosling_Interview.mp3

但是,我注意到至少有一个程序以某种方式过滤了这个列表:wine. 考虑:

[user@host tmp]$ wine <TAB><TAB>
chromatron2.exe  foo.exe

它有效地将结果过滤到*.exe.

认为它可能是某种负责过滤的包装脚本,a did awhichfilean 结果wine不是脚本而是可执行文件。

现在,我不知道这个“过滤器”是否以某种方式编码在程序本身中,或者在默认的 wine 安装期间以其他方式指定,所以我不确定这个问题是否更适合 stackoverflow 或超级用户,所以我交叉手指扔到这里。如果我猜错了,我很抱歉。(另外,我检查了一些类似的问题,但大多数都无关紧要或涉及编辑 shell 配置。)

所以我的问题是,这种“过滤”是如何完成的?提前致谢。

4

3 回答 3

13

您可能会在系统上找到一个名为的文件,其中包含设置此行为/etc/bash_completion的函数和命令。complete该文件将来自您的 shell 启动文件之一,例如~/.bashrc.

也可能有一个名为的目录/etc/bash_completion.d,其中包含具有更多完成功能的单个文件。这些文件由/etc/bash_completion.

这是我系统上wine完成命令的样子/etc/bash_completion

complete -f -X '!*.@(exe|EXE|com|COM|scr|SCR|exe.so)' wine

这组文件大部分由Bash Completion Project维护。

于 2012-06-08T11:12:55.763 回答
6

您可以查看 bash 手册中的Programmable Completion以了解其工作原理。

于 2012-06-08T05:09:01.487 回答
5

我知道这很旧,但我想用我自己的脚本做类似的事情。

您可以使用我在这里制作的示例: http ://runnable.com/Uug-FAUPXc4hAADF/autocomplete-for-bash

从上面粘贴代码:

# Create function that will run when a certain phrase is typed in terminal
# and tab key is pressed twice
_math_complete()
{
    # fill local variable with a list of completions
    local COMPLETES="add sub mult div"
    # you can fill this variable however you want. example:
    # ./genMathArgs.sh > ./mathArgsList
    # local COMPLETES=`cat ./mathArgsList`

    # we put the completions into $COMPREPLY using compgen
    COMPREPLY=( $(compgen -W "$COMPLETES" -- ${COMP_WORDS[COMP_CWORD]}) )
    return 0
}

# get completions for command 'math' from function '_math_complete()'
complete -F _math_complete math 

# print instructions
echo ""
echo "To test auto complete do the following:"
echo "Type math then press tab twice." 
echo "You will see the list we created in COMPLETES"
echo ""
于 2014-01-31T09:30:18.667 回答