Sample Header Ad - 728x90

compgen -o nospace option without effect

0 votes
1 answer
555 views
I'm trying to create a command completion function, and I was following this guide . This is approximately how it looks:
function __my_completion ()
{
	local cur prev opts opts_log opts_import
	COMPREPLY=()
	cur="${COMP_WORDS[COMP_CWORD]}"
	prev="${COMP_WORDS[COMP_CWORD-1]}"
	opts="-h --help -d --directory -v --version -l --log-level -q --quiet"
	opts_log="trace debug info warn err critical off"

	if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
		COMPREPLY=( $(compgen -o nospace -d -W "${opts}" -- ${cur}) )
		return 0
	fi
	case "${prev}" in
		-d|--directory)
			COMPREPLY=( $(compgen -o nospace -d ${cur}) )
		;;
		-l|--log-level)
			COMPREPLY=( $(compgen -W "${opts_log}" -- ${cur}) )
		;;
	esac
}

complete -F __my_completion myProg
My problem is: whenever any word is completed, a space is added to the end. That's fine for normal options, but it's also done with directories, despite the -o nospace -d option combination. That is very annoying, as it slows down navigation and is very unintuitive. Why is that and how can I correct it? Also, while I'm here, what's the single ? for in one of the examples in the linked guide? It's in the line
COMPREPLY=( $(compgen -f ? ${cur}) )
Asked by RL-S (141 rep)
Sep 9, 2022, 09:27 PM
Last activity: Sep 13, 2022, 10:15 AM