自定义命令的 Bash 自动完成子目录

Ged*_*son 5 bash command-line autocomplete tab-completion macos

我已经尝试了几个小时来使这个工作正常进行,但我觉得我还没有接近任何地方。

我试图通过从 Mac OS X 终端完成目录名称的制表符来缩短我们的工作流程。

我们有一个内部工具,我们称之为 ,它bob会自动在 git 子模块上运行命令。我想做的是让它自动完成子目录名称。问题是,这些子目录位于静态位置。

   project directory
   ->public
     ->submodules
       ->a-module
       ->another-module
       ->other-module
       ->some-module
Run Code Online (Sandbox Code Playgroud)

命令从顶级项目目录运行,如下所示:

bob start bugfix anothermodule
Run Code Online (Sandbox Code Playgroud)

而不是必须完全输入“anothermodule”,这是我们目前所做的,我希望让标签自动完成工作。我们每天多次使用此工作流程,将其缩短几秒钟会很棒并且可以避免打字错误。

最终目标是:

bob start bugfix an<tab>
Run Code Online (Sandbox Code Playgroud)

会自动完成

bob start bugfix anothermodule
Run Code Online (Sandbox Code Playgroud)

我试过CDPATH但很快意识到这不是我想要的,因为这不是遵循cd命令,只是我的自定义命令。

我已经bash_completion安装,但一般来说我不太擅长 bash。提到这一点,以防万一它可以成为解决方案的一部分!

Ant*_*gan 2

这是对 Kamil\xe2\x80\x99s 优秀答案的增强,它从-module每个子目录名称的部分中删除连字符。

\n\n
bugfix)\n    curdir=$(pwd)\n    cd public/submodules/ 2>/dev/null && _filedir -d\n    # Strip the hyphen from `-module` in each sub-directory name.\n    for ((i=0; i<${#COMPREPLY[@]}; i++)); do\n        COMPREPLY[$i]="${COMPREPLY[$i]/-module/module}"\n    done\n    cd "$curdir"\n    ;;\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x99s 仍有改进此部分的余地:您可能必须键入连字符,即键入a-Tab以使其完成 toamodule而不是在amodule和之间进行选择anothermodule(连字符仍被完成函数剥离)。

\n