bash_completion 的不同目录(指定目录下的自动完成子文件夹)
Different directory for bash_completion (auto-complete subfolders under specified directory)
能够在我系统的任何位置输入 dev my-[tab]
并接收自动完成,例如
$ dev my-[tab]
my-project
my-awesome-project
我在 /etc/bash_completion.d/
中创建了一个包含以下内容的文件:
_dev()
{
PROJECTS=$(ls /development)
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -W "${PROJECTS}" -- $cur) )
}
complete -F _dev dev
这很好用,但我也希望能够自动完成子文件夹:
[~] $ dev my-p[tab]
[~] $ dev my-project/[tab][tab]
src doc
[~] $ dev my-project/s[tab][enter]
[/development/my-project/src] $
所以基本上,我希望 dev
的自动完成方式与 cd
的自动完成方式相同。
dev
只是一个别名:
alias dev='gotodev'
gotodev ()
{
cd /development/
}
刚刚写了一个例子:
[/tmp] # cat compspec
g_proj_dir=/tmp/projects
dev()
{
cd $g_proj_dir/
}
_dev()
{
local cmd= cur= pre=
local _cur compreply
_cur=$g_proj_dir/$cur
compreply=( $( compgen -d "$_cur" ) )
COMPREPLY=( ${compreply[@]#$g_proj_dir/} )
if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
COMPREPLY[0]=${COMPREPLY[0]}/
fi
}
complete -F _dev -o nospace dev
[/tmp] # source ./compspec
[/tmp] #
[/tmp] # cd /tmp/
[/tmp] # mkdir -p projects/{bar,foo}{1,2}/mod{1,2}/submod{1,2}
[/tmp] # touch projects/{bar,foo}{1,2}/mod{1,2}/submod{1,2}/file{1,2}
[/tmp] # dev <TAB><TAB>
bar1 bar2 foo1 foo2
[/tmp] # dev f<TAB>
[/tmp] # dev foo
[/tmp] # dev foo<TAB><TAB>
foo1 foo2
[/tmp] # dev foo2<TAB>
[/tmp] # dev foo2/
[/tmp] # dev foo2/<TAB>
[/tmp] # dev foo2/mod
[/tmp] # dev foo2/mod<TAB><TAB>
foo2/mod1 foo2/mod2
[/tmp] # dev foo2/mod2<TAB>
[/tmp] # dev foo2/mod2/
... ...
能够在我系统的任何位置输入 dev my-[tab]
并接收自动完成,例如
$ dev my-[tab]
my-project
my-awesome-project
我在 /etc/bash_completion.d/
中创建了一个包含以下内容的文件:
_dev()
{
PROJECTS=$(ls /development)
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -W "${PROJECTS}" -- $cur) )
}
complete -F _dev dev
这很好用,但我也希望能够自动完成子文件夹:
[~] $ dev my-p[tab]
[~] $ dev my-project/[tab][tab]
src doc
[~] $ dev my-project/s[tab][enter]
[/development/my-project/src] $
所以基本上,我希望 dev
的自动完成方式与 cd
的自动完成方式相同。
dev
只是一个别名:
alias dev='gotodev'
gotodev ()
{
cd /development/
}
刚刚写了一个例子:
[/tmp] # cat compspec
g_proj_dir=/tmp/projects
dev()
{
cd $g_proj_dir/
}
_dev()
{
local cmd= cur= pre=
local _cur compreply
_cur=$g_proj_dir/$cur
compreply=( $( compgen -d "$_cur" ) )
COMPREPLY=( ${compreply[@]#$g_proj_dir/} )
if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
COMPREPLY[0]=${COMPREPLY[0]}/
fi
}
complete -F _dev -o nospace dev
[/tmp] # source ./compspec
[/tmp] #
[/tmp] # cd /tmp/
[/tmp] # mkdir -p projects/{bar,foo}{1,2}/mod{1,2}/submod{1,2}
[/tmp] # touch projects/{bar,foo}{1,2}/mod{1,2}/submod{1,2}/file{1,2}
[/tmp] # dev <TAB><TAB>
bar1 bar2 foo1 foo2
[/tmp] # dev f<TAB>
[/tmp] # dev foo
[/tmp] # dev foo<TAB><TAB>
foo1 foo2
[/tmp] # dev foo2<TAB>
[/tmp] # dev foo2/
[/tmp] # dev foo2/<TAB>
[/tmp] # dev foo2/mod
[/tmp] # dev foo2/mod<TAB><TAB>
foo2/mod1 foo2/mod2
[/tmp] # dev foo2/mod2<TAB>
[/tmp] # dev foo2/mod2/
... ...