shell命令自动补全

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# github相关操作
github() {
cd_github_code
my_github=git@github.com/cyy053xc/
case $1 in
"c"|"clone")
git clone $my_github$2".git"
;;
"l"|"pull")
pushd $my_github$2
git pull
popd
;;
"s"|"push")
pushd $my_github$2
git pull
git commit -am 'script commit'
git push
popd
;;
"h"|"help"|*)
cat <<EOF
github [hcls] [path]
usage:
h|help : help
c|clone project : git clone {$my_github}project.git
l|pull project : git pull
s|push project : git push
EOF
;;
esac
}
# 补全函数
function _github() {
COMPREPLY=()
local cur=${COMP_WORDS[COMP_CWORD]};
local com=${COMP_WORDS[COMP_CWORD-1]};
case $com in
'github')
COMPREPLY=($(compgen -W 'c clone l pull s push h help' -- $cur))
;;
'compile')
local pro=($(awk '{print $1}' project.list))
COMPREPLY=($(compgen -W '${pro[@]}' -- $cur))
;;
*)
;;
esac
return 0
}
# 绑定自动补全函数
complete -F _github github

从效果上,可以说已经实现了tab键自动补全,不过不是很完美:

  • 每个函数需要搭配一个额外的补全函数
  • 补全函数的实现有大量的重复代码
  • 另外还需要一个额外的命令进行绑定

理想的应该是:在函数的内部加上一条命令或者一个配置来解决。