[Bash-completion-devel] Review Request: hellanzb

Stefano Rivera stefano at rivera.za.net
Sun Dec 5 12:58:38 UTC 2010


I just fell down the rabbit hole of writing bash completion scripts. I
wish I knew where my Sunday morning went... :)

Here's a completion script for hellanzb. Review please?

One question:
"_filedir -d" doesn't seem interested in subdirectories, it adds a space
as soon as there's an unambiguous completion. It doesn't do this without
the -d. Is that really the desired behaviour?

BTW: Are there guidelines about when bash completion scripts belong in
bash-completion and when they belong in the package they complete for? I
couldn't find any...

SR

-- 
Stefano Rivera
  http://tumbleweed.org.za/
  H: +27 21 465 6908 C: +27 72 419 8559  UCT: x3127
-------------- next part --------------
# hellanzb(1) completion script
# Copyright 2010, Stefano Rivera <stefano at rivera.za.net>

have hellanzb && _hellanzb_opts() {
	# First extract long options then short options & rpc commands
	hellanzb -h 2> /dev/null \
		| sed -nre '/^  .*, --/ {h; s/.*(--[a-z-]+).*/\1/ p; g}' \
	              -e 's/^  ([a-zA-Z-]+)[, ].*/\1/ p'
}
[ -n "${have:-}" ] && _hellanzb() {
	local cur prev
	COMPREPLY=()
	cur="${COMP_WORDS[COMP_CWORD]}"
	prev="${COMP_WORDS[COMP_CWORD-1]}"

	if [[ $COMP_CWORD -eq 1 ]]; then
		COMPREPLY=( $(compgen -W "$(_hellanzb_opts)" -- "$cur") )
		return
	fi
	if [[ "$prev" = "enqueue" ]]; then
		_filedir '@(nzb|NZB|zip|ZIP)'
		return
	fi

	local dir_options file_options
	file_options="-c --config -l --log-file -d --debug-file"
	if echo "" $file_options | grep -Fwq -- "$prev"; then
		_filedir
		return
	fi	
	dir_options="process -p --post-process-dir"
	if echo "" $dir_options | grep -Fwq -- "$prev"; then
		_filedir -d
		return
	fi

	# Complete commands if we haven't had one yet
	local i hellanzb_opts commands
	hellanzb_opts="$(_hellanzb_opts)"
	commands="$(echo "" $hellanzb_opts | tr ' ' '\n' | grep -v '^-')"
	for ((i=0; i < COMP_CWORD; i++)); do
		if echo "" $commands | grep -Fwq -- "${COMP_WORDS[i]}"; then
			return
		fi
	done
	COMPREPLY=( $(compgen -W "$hellanzb_opts" -- "$cur") )
}
[ -n "${have:-}" ] && complete -F _hellanzb hellanzb


More information about the Bash-completion-devel mailing list