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)
有什么想法有什么不对吗?在我看来,完成过程似乎已经完成,并没有期待任何更多的输入.
到目前为止我发现的最简单的解决方案是生成如下所示的完成:
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.
像这样的事情怎么样:
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 :-)
| 归档时间: |
|
| 查看次数: |
1683 次 |
| 最近记录: |