aboutsummaryrefslogtreecommitdiff
path: root/src/dmtool.bash
blob: 41f70e96535a8650b3bc16a186718c7182d6c241 (plain)
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# bash completion file for dmtool

# Modified from bash completion for password-store

_dmtool_complete_entries () {
	local prefix1="${HOME}/.dmtool/"
	prefix1="${prefix1%/}/"
        local prefix2="/usr/share/dmtool/"
	prefix2="${prefix2%/}/"
	local suffix=".json"
	local autoexpand=${1:-0}

	local IFS=$'\n'
	local items=($(compgen -f $prefix1$cur))
        items+=($(compgen -f $prefix2$cur))

	# Remember the value of the first item, to see if it is a directory. If
	# it is a directory, then don't add a space to the completion
	local firstitem=""
	# Use counter, can't use ${#items[@]} as we skip hidden directories
	local i=0 item

	for item in ${items[@]}; do
		[[ $item =~ /\.[^/]*$ ]] && continue

		# if there is a unique match, and it is a directory with one entry
		# autocomplete the subentry as well (recursively)
		if [[ ${#items[@]} -eq 1 && $autoexpand -eq 1 ]]; then
			while [[ -d $item ]]; do
				local subitems=($(compgen -f "$item/"))
				local filtereditems=( ) item2
				for item2 in "${subitems[@]}"; do
					[[ $item2 =~ /\.[^/]*$ ]] && continue
					filtereditems+=( "$item2" )
				done
				if [[ ${#filtereditems[@]} -eq 1 ]]; then
					item="${filtereditems[0]}"
				else
					break
				fi
			done
		fi

		# append / to directories
		[[ -d $item ]] && item="$item/"

		item="${item%$suffix}"
                local prefix1ed="${item#$prefix1}"
		COMPREPLY+=("${prefix1ed#$prefix2}")
		if [[ $i -eq 0 ]]; then
			firstitem=$item
		fi
		let i+=1
	done

	# The only time we want to add a space to the end is if there is only
	# one match, and it is not a directory
	if [[ $i -gt 1 || ( $i -eq 1 && -d $firstitem ) ]]; then
		compopt -o nospace
	fi
}

_dmtool()
{
	COMPREPLY=()
	local cur="${COMP_WORDS[COMP_CWORD]}"
	local commands="ls cp mkdir mv rm roll damage heal reset set help"
	if [[ $COMP_CWORD -gt 1 ]]; then
		local lastarg="${COMP_WORDS[$COMP_CWORD-1]}"
		case "${COMP_WORDS[1]}" in
                        ls|mkdir|rm|reset)
                                _dmtool_complete_entries
                                ;;
                        cp|mv)
                                if [[ $COMP_CWORD -le 3 ]]; then
                                    _dmtool_complete_entries
                                fi
                                ;;
                        roll|damage|heal|set|add)
                                if [[ $COMP_CWORD -le 2 ]]; then
                                    _dmtool_complete_entries
                                else
                                    # Other various stuff
                                    :
                                fi
                                ;;
		esac
	else
		COMPREPLY+=($(compgen -W "${commands}" -- ${cur}))
		_dmtool_complete_entries 1
	fi
}

complete -o filenames -F _dmtool dmtool