设置函数参数的工作目录

时间:2014-12-22 09:55:39

标签: 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; }

然后我称之为:

make_project project1

这很好用。唯一的问题是我没有project1的自动完成功能。因此,如果我有一个名为my_complicatedly_named_project的复杂名称的项目,我将需要输入整个名称。是否有任何方法让bash知道参数是/ a / b / c / d / e / myCode /中的目录它可以适当地自动完成吗?

3 个答案:

答案 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/

后使用自动填充功能