zsh completion


For general tools which support a GNU-like --help flag, you can use the _gnu_generic, like:

compdef _gnu_generic my_command ls youtube-dl

Sometimes if the --help description is multiple lines, it doesn’t include the entire description or may break.

There’s a similar command in bash; complete -F _longopt my_command

This Tutorial, and the corresponding zsh-completions is great for learning how to do zsh completion.


Examples

For basic completion which doesn’t need state, to autocomplete a command as the first argument, and then some filename as the second argument:

# for something named 'command'; if your command was 'hello', the function would be '_hello'
# you can always manually invoke a function to complete something with compdef as well:
# compdef _command command
function _command() {
	# typically this would be done with the built-in _path_files
	local files="$(command ls)"
	# 'files' and 'command' are just descriptions
	_arguments \
		'1:command:(create remove)' \
		"2:files:(${files})"
}

If you want to have 2 commands and complete multiple file arguments, you can use a glob:

function _command() {
	local files="$(command ls)"
	_arguments \
		'1:command:(create remove)' \
		'2:command:(force quiet)' \
		"*:files:(${files})"
}

e.g. command create force file_one file_two

_arguments is just one of the possible utility functions, there are a couple others.