【问题标题】:List directories at a specific path as autocomplete options for a bash script?列出特定路径的目录作为 bash 脚本的自动完成选项?
【发布时间】:2019-12-16 23:39:18
【问题描述】:

我的 .bash_profile 中有一个名为 repos 的 bash 函数,我想为此添加列出特定目录内容的自动完成功能.我正在尝试使用complete 命令来实现这一点。

简而言之,我尝试过的:

创建了一个名为 repos_complete.bash 的文件,其中包含以下代码。此后,我运行 source repos_complete.bash 以确保它适用于 repos 脚本。

repos_complete.bash中的代码:

complete -A directory repos

到目前为止的结果:如果我输入repos,然后按tab,它将列出当前目录的内容。但是,我想要的是它列出另一个目录的内容,例如~/source/repos/.

我尝试将 repos_complete.bash 的内容替换为以下内容:

 complete -C ls ~/source/repos repos

当现在输入 repostab 时,我收到一条错误消息:

无法访问“repos”:没有这样的文件或目录

在我看来,-C(之后接受命令)将整行解释为命令,包括最后一个“repos”,而不仅仅是应用第一部分(ls ~/source/repos)作为函数 repos 的命令,这是我想要实现的。

这里有什么正确传递ls <some path>命令的技巧吗?


注意:我应该指出,这是在 Windows 10 下的 git bash shell 的上下文中运行的,以防有什么不同。

【问题讨论】:

    标签: bash shell git-bash


    【解决方案1】:

    我认为您需要填写COMPREPLY 数组。我认为这可行:

    _repos()
    {
        local cur;
        local base=~/source/repos/
        _get_comp_words_by_ref cur;
        cur="$base$cur"
        _filedir
        COMPREPLY=("${COMPREPLY[@]#$base}")
    } && complete -o nospace -F _repos repos
    

    如果你想使用-C选项,你可以使用下面的这个方法。 (请注意,我没有针对包含特殊字符的文件名评估它。)

    _repos()
    {
        ( cd ~/source/repos; printf "%s\n" "$2"* )
    } && complete -o nospace -C _repos repos
    

    【讨论】:

    • 我无法让您的第一个脚本正常工作(在包含 _filedir 的行上收到错误消息,老实说,我无法准确理解所有代码的工作原理) ,但是您的第二个解决方案效果很好。感谢您的帮助,我真的很感激!
    • _filedir 是文件和目录路径完成的 bash 完成工作方式(至少在 ubuntu 上)。 (例如ls <tab><tab>cd <tab><tab>)。因此,这里的逻辑是:获取您输入的单词。前缀基础。让 bash-completion 用 _filedir 完成它的魔法。从输出中删除前缀。
    【解决方案2】:

    complete -C 不能按预期工作的原因是-C 应该采用一个本身带有三个参数的命令。来自Bash manual

    当函数或命令被调用时,第一个参数 ($1) 是正在完成其参数的命令的名称,第二个参数 ($2) 是正在完成的单词,第三个参数 ($3) 是当前命令行上正在补全的单词之前的单词。

    因此,如果您想使用-C 形式的complete,您似乎需要一个自定义命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 2023-01-23
      • 1970-01-01
      相关资源
      最近更新 更多