自定义目录完成附加空格

tic*_*chy 5 directory bash bash-completion

我有以下目录结构:

/home/tichy/xxx/yyy/aaa
/home/tichy/xxx/yyy/aab
/home/tichy/xxx/yyy/aac
Run Code Online (Sandbox Code Playgroud)

我想输入cdw y <TAB>并得到cdw yyy/<CURSOR>,所以我可以添加cdw yyy/a <TAB>并获得cdw yyy/aa <CURSOR>

我想出的解决方案给了我以下内容:
cdw y <TAB> => cdw yyy <SPACE> <CURSOR>

以下代码我到目前为止:

_cdw () {
    local cur prev dirs
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    COMPREPLY=($(compgen -d -- /home/tichy/xxx/${cur}|perl -pe 's{^/home/tichy/xxx/}{}'))
    # no difference, a bit more logical:
    dirs=$(compgen -o nospace -d /home/tichy/xxx/${cur}|perl -pe 's/{^/home/tichy/xxx/}{}')
    COMPREPLY=($(compgen -d -W ${dir} ${cur}|perl -pe 's{^/home/tichy/xxx/}{}'))
    return 0
}
complete -F _cdw cdw
cdw () {
    cd /home/tichy/xxx/$@
}
Run Code Online (Sandbox Code Playgroud)

有什么想法有什么不对吗?在我看来,完成过程似乎已经完成,并没有期待任何更多的输入.

cod*_*hot 8

到目前为止我发现的最简单的解决方案是生成如下所示的完成:

COMPREPLY=( $( compgen -W "file1 file2 file3 dir1/ dir2/ dir3/" ) )
Run Code Online (Sandbox Code Playgroud)

并在返回之前添加此行

[[ $COMPREPLY == */ ]] && compopt -o nospace
Run Code Online (Sandbox Code Playgroud)

这样就可以在完成时填写nospace选项,直到斜杠为止,以便用户最终得到:

cmd dir1/<cursorhere>
Run Code Online (Sandbox Code Playgroud)

代替:

cmd dir1/ <cursorhere>
Run Code Online (Sandbox Code Playgroud)

并且只要完成可以填写直到完整文件名,它就不会设置nospace选项,以便用户最终得到:

cmd file1 <cursorhere>
Run Code Online (Sandbox Code Playgroud)

代替:

cmd file1<cursorhere>
Run Code Online (Sandbox Code Playgroud)


小智 5

如果我理解正确,你想bash-autocomplete一个目录名,而没有额外的空间?(当我到达这个页面时,这就是我想要的).

如果是这样,当您注册完成功能时,请使用"-o nospace".

complete -o nospace -F _cdw cdw
Run Code Online (Sandbox Code Playgroud)

我不知道nospace是否适用于compgen.


Tan*_*lus 2

像这样的事情怎么样:

COMPREPLY=( $(cdw; compgen -W "$(for d in ${cur}* ${cur}*/*; do [[ -d "$d" ]] && echo $d/; done)" -- ${cur}) )
Run Code Online (Sandbox Code Playgroud)

(我不确定您是否可以从这里调用 shell 函数,否则您可能需要稍微重复一下。)

这也摆脱了你的 perl hack :-)