Ben*_*ler 5 bash bash-completion
我的代码全部位于我的计算机/ a/b/c/d/e/myCode上的以下目录中.当我想编译project1时,我很生气地键入make/a/b/c/d/e/myCode/project1.为了解决这个问题,我在bashrc中创建了一个函数,如下所示:
function make_project { make /a/b/c/d/e/myCode/$1; }
Run Code Online (Sandbox Code Playgroud)
然后我称之为:
make_project project1
Run Code Online (Sandbox Code Playgroud)
这很好用.唯一的问题是我没有project1的自动完成功能.因此,如果我有一个名为my_complicatedly_named_project的复杂名称的项目,我将需要输入整个名称.是否有任何方法让bash知道参数是/ a/b/c/d/e/myCode /中的目录它可以自动完成吗?
compgen命令可用于生成和测试补全,并且查看现有补全可以为生成新补全提供一些帮助。您正在查找特定子树中的目录,因此以下内容应该在 bash 中工作:
function _make_project {
COMPREPLY=( $(cd /a/b/c/d/myCode; compgen -A directory -- "${COMP_WORDS[COMP_CWORD]}") );
}
Run Code Online (Sandbox Code Playgroud)
这使用 compgen 来获取可能完成当前参数的目录,从 myCode 子树开始。要为您的函数安装此函数,您应该使用以下complete命令将此完成函数与 bash 函数关联:
complete -F _make_project make_project
Run Code Online (Sandbox Code Playgroud)
更新
为了避免在已完成的工作中附加空格字符,在注册完成函数时可以提供nospace选项。如果将其与compgen 的-S选项结合起来以附加后缀字符,则补全可以显示为目录名称,并且可以轻松遍历子树:
function _make_project {
COMPREPLY=( $(cd /a/b/c/d/myCode; compgen -S / -A directory -- "${COMP_WORDS[COMP_CWORD]}") );
}
complete -o nospace -F _make_project make_project
Run Code Online (Sandbox Code Playgroud)