いちいち確認するより他のパッケージのを参考にしていけば楽。/usr/share/bash-completion/completions/以下を参照。
case $prev in
-b|-h|--help|-p)
return 0
;;
-n)
COMPREPLY=( $( compgen -W "{1..$(_ncpus)}" -- "$cur" ) )
return 0
;;
esac
ほー bash だと echo "{1..100}" みたいにすると展開するのね
if [[ "$cur" == -* ]]; then
local helpopts=$( _parse_help "$1" )
COMPREPLY=( $( compgen -W "${helpopts//#/} -2 -3 -4 -5 -6 -7 -8 -9" \
-- "$cur" ) )
return 0
fi
なんで [[ ]] と二重にカッコなのか。
作った
_snapper()
{
local configdir="/etc/snapper/configs"
local cur prev words cword
_init_completion || return
local GLOGAL_SNAPPER_OPTIONS='
-q --quiet
-v --verbose
--utc
--iso
-t --table-style
-c --config
-r --root
--no-dbus
--version
--help
'
# see if the user selected a command already
local COMMANDS=(
"list-configs" "create-config" "delete-config" "set-config"
"list" "ls"
"create" "modify" "delete" "remove" "rm"
"mount" "umount"
"status" "diff" "xadiff"
"undochange" "rollback"
"setup-quota"
"cleanup")
local command i
for (( i=0; i < ${#words[@]}-1; i++ )); do
if [[ ${COMMANDS[@]} =~ ${words[i]} ]]; then
command=${words[i]}
break
fi
done
# supported options per command
if [[ "$cur" == -* ]]; then
case $command in
create-config)
COMPREPLY=( $( compgen -W '--fstype -f
--templete -t' -- "$cur" ) )
return 0
;;
list|ls)
COMPREPLY=( $( compgen -W '--type -t
--all-configs -a' -- "$cur" ) )
return 0
;;
create)
COMPREPLY=( $( compgen -W '--type -t
--pre-number
--print-number -p
--description -d
--cleanup-algorithm -c
--userdata -u
--command' -- "$cur" ) )
return 0
;;
modify)
COMPREPLY=( $( compgen -W '--description -d
--cleanup-algorithm -c
--userdata -u' -- "$cur" ) )
return 0
;;
delete|remove|rm)
COMPREPLY=( $( compgen -W '--sync -s
' -- "$cur" ) )
return 0
;;
status)
COMPREPLY=( $( compgen -W '--output -o
' -- "$cur" ) )
return 0
;;
diff)
COMPREPLY=( $( compgen -W '--input -i
--diff-cmd
--extensions -x' -- "$cur" ) )
return 0
;;
undochange)
COMPREPLY=( $( compgen -W '--input -i
' -- "$cur" ) )
return 0
;;
rollback)
COMPREPLY=( $( compgen -W '--print-number -p
--description -d
--cleanup-algorithm -c
--userdata -u' -- "$cur" ) )
return 0
;;
*)
COMPREPLY=( $( compgen -W "$GLOGAL_SNAPPER_OPTIONS" -- "$cur" ) )
return 0
;;
esac
fi
# specific command arguments
if [[ -n $command ]]; then
case $command in
create-config)
case "$prev" in
--fstype|-f)
COMPREPLY=( $( compgen -W 'btrfs ext4 lvm(xfs) lvm(ext4)
' -- "$cur" ) )
;;
esac
return 0
;;
list)
case "$prev" in
--type|-t)
COMPREPLY=( $( compgen -W 'all single pre-post
' -- "$cur" ) )
;;
esac
return 0
;;
create)
case "$prev" in
--type|-t)
COMPREPLY=( $( compgen -W 'single pre post
' -- "$cur" ) )
;;
--pre-number)
# get .snapshot directory
COMPREPLY=( $( compgen -W '
' -- "$cur" ) )
;;
--cleanup-algorithm|-c)
COMPREPLY=( $( compgen -W 'empty-pre-post timeline number
' -- "$cur" ) )
;;
esac
return 0
;;
modify)
case "$prev" in
--cleanup-algorithm|-c)
COMPREPLY=( $( compgen -W 'empty-pre-post timeline number
' -- "$cur" ) )
;;
esac
return 0
;;
status)
case "$prev" in
--output|-o)
COMPREPLY=( $( compgen -f -- "$cur" ) )
;;
esac
return 0
;;
diff)
return 0
;;
undochange)
return 0
;;
rollback)
case "$prev" in
--cleanup-algorithm|-c)
COMPREPLY=( $( compgen -W 'empty-pre-post timeline number
' -- "$cur" ) )
;;
esac
return 0
;;
esac
fi
# no command yet, show what commands we have
if [ "$command" = "" ]; then
COMPREPLY=( $( compgen -W '${COMMANDS[@]}' -- "$cur" ) )
fi
return 0
} &&
complete -F _snapper snapper