我的代码全部位于我的计算机/ 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; }
然后我称之为:
make_project project1
这很好用。唯一的问题是我没有project1的自动完成功能。因此,如果我有一个名为my_complicatedly_named_project的复杂名称的项目,我将需要输入整个名称。是否有任何方法让bash知道参数是/ a / b / c / d / e / myCode /中的目录它可以适当地自动完成吗?
答案 0 :(得分:2)
compgen命令可用于生成和测试完成,查看现有的完成可以提供一些帮助来生成新的完成。您在特定子树中的目录之后,因此以下内容应该在bash中起作用:
function _make_project {
COMPREPLY=( $(cd /a/b/c/d/myCode; compgen -A directory -- "${COMP_WORDS[COMP_CWORD]}") );
}
这使用compgen从myCode子树开始获取可能完成当前参数的目录。要为您的函数安装此函数,您应该使用complete
命令将此完成函数与bash函数相关联:
complete -F _make_project make_project
<强>更新强>
为避免在完成的工作中附加空格字符,在注册完成功能时,可以提供 nospace 选项。如果将此与 -S 选项结合使用compgen以附加后缀字符,则完成可以显示为目录名称,并且可以轻松地遍历子树:
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
答案 1 :(得分:0)
我不知道bash是否可以做到这一点,但是zsh可以合理地做到这一点。要在zsh中使用此功能,请将此行添加到.zshrc:
fpath=(~/.zshcompletion $fpath)
然后创建文件~/.zshcompletion/_make_project
:
#compdef make_project
# _arguments "1: :(World)"
_make_project() {
# Note: Do the following two lines mean anything?:
local curcontext="$curcontext" state line
typeset -A opt_args
for dir in /a/b/c/d/e/myCode/*(/); do
compadd "$@" "${dir/*\//}"
done
}
注意:我知道这不是您要求的答案,但由于zsh与bash基本上具有相同的用户界面(脚本通常兼容),我认为如果有这样的话可能会有用不是一个简单的bash解决方案。
答案 2 :(得分:0)
使用myCode
目录的软链接。
ln -s /a/b/c/d/e/myCode/ ~/myCode
将您的功能修改为:
function make_project { make $1; }
我认为输入额外的myCode
不会造成太大的伤害:
make_project ~/myCode/project_name
或只使用make
:
make ~/myCode/project_name
您可以在输入~/myCode/