如何更改制表符补全的目标目录?

如何更改制表符补全的目标目录?

我找到了一个简短的脚本来启用笔记万事韦尔,其中包括:

function n { nano ~/n/$1.txt }

我想扩展它来完成制表符,这样如果我想编辑预先存在的注释“foobar”(~/n/foobar.txt),我可以输入foo[TAB]并让它自动完成foobar,而不是必须每次都输入“foobar”。问题是 bash 的内置制表符补全似乎以当前目录为中心,因此如果我位于不是 ~/n 的文件夹中,那么我的制表符补全会失败 - 或者更糟糕的是,会完成错误事情,因为也许我在 ~/snafu/ 中有一个名为 'footastic' 的文件(这意味着我输入$ n foo[TAB],而不是看到$ n foobar,我查看我的输入并看到:$ n footastic

所以,在所有的序言之后,问题是:如果可能的话,我如何告诉 bash 在我输入 'n' 之后,对于就这一次我希望它假设我们正在使用 ~/n 中的文件来完成,而不是使用当前目录中的文件?

如果你理解了所有这些电子自言自语,那么恭喜你,如果你能做到的话回答那个,非常感谢!

答案1

这可能会让你到达那里......

  1. 在 .bashrc 中启用自定义选项卡完成

    shopt -s progcomp

  2. 创建一个 compgen 函数并将其添加到 .bashrc你的笔记功能。

    _notes() {
    local cur
        cur=${COMP_WORDS[COMP_CWORD]}
        COMPREPLY=( $(compgen -f $HOME/n/$cur | cut -d"/" -f5 ) )
        }
       complete -o filenames -F _notes n

这对我来说很有效——在基础层面上。我还没有解决嵌套目录的问题......

参考:

  1. 大部分来自这里:http://sixoh Three.com/867/bash-completion

  2. 此处完成内置详细信息:http://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html

答案2

为了跟进 jasonwryan 的答案,我使用 cut 来修剪已知路径目标的开头:

_c ()
{
    local cur
    COMPREPLY=()
    cur=${COMP_WORDS[COMP_CWORD]}
    case "$cur" in
        *)
            COMPREPLY=( $(compgen -f /src/$cur | cut -c 6-) )
            ;;
    esac

    return 0
} &&
complete -o filenames -F _c c

这允许我直接操作下面的任何目录、子目录或文件名/src/

相关内容