在自定义选项卡外壳完成(Customize tab completion in shell)

2019-07-29 18:56发布

这可能是比“自定义选项卡完成”更好的名字,但这里的情景:

通常,当我在命令行中,我输入一个命令,然后用{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

想这可能是某种负责过滤包装脚本的,一个做了whichfile的事实证明wine是没有剧本的,但一个可执行文件。

现在,我不知道这是否“过滤器”在节目中以某种方式编码本身,或以其他方式默认酒中指定的安装,所以我不知道这个问题是否更适合于计算器或超级用户,所以我穿越我的手指,并在这里把它扔。 我很抱歉,如果我猜错了。 (另外,我查了一些类似的问题,但大多数是不相关或参与编辑外壳配置。)

所以我的问题是,如何在这个“过滤”来实现? 提前致谢。

Answer 1:

你可能会发现你的系统,称为上的文件/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

这套文件是由维持很大一部分猛砸完成项目 。



Answer 2:

你可以看一看可编程竣工庆典手册中了解它是如何工作的。



Answer 3:

我知道这是旧的,但我希望做我自己的脚本类似的东西。

你可以玩弄我在这里做一个例子: 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 ""


文章来源: Customize tab completion in shell