diff options
Diffstat (limited to 'plugins/gitfast/_git')
| -rw-r--r-- | plugins/gitfast/_git | 200 | 
1 files changed, 128 insertions, 72 deletions
| diff --git a/plugins/gitfast/_git b/plugins/gitfast/_git index 78a6dbb3d..988f5b1c6 100644 --- a/plugins/gitfast/_git +++ b/plugins/gitfast/_git @@ -2,25 +2,24 @@  # zsh completion wrapper for git  # -# Copyright (c) 2012-2013 Felipe Contreras <felipe.contreras@gmail.com> +# Copyright (c) 2012-2020 Felipe Contreras <felipe.contreras@gmail.com>  # -# You need git's bash completion script installed somewhere, by default it -# would be the location bash-completion uses. +# The recommended way to install this script is to make a copy of it as a +# file named '_git' inside any directory in your fpath.  # -# If your script is somewhere else, you can configure it on your ~/.zshrc: +# For example, create a directory '~/.zsh/', copy this file to '~/.zsh/_git', +# and then add the following to your ~/.zshrc file:  # -#  zstyle ':completion:*:*:git:*' script ~/.git-completion.zsh +#  fpath=(~/.zsh $fpath)  # -# The recommended way to install this script is to copy to '~/.zsh/_git', and -# then add the following to your ~/.zshrc file: +# You need git's bash completion script installed. By default bash-completion's +# location will be used (e.g. pkg-config --variable=completionsdir bash-completion). +# +# If your bash completion script is somewhere else, you can specify the +# location in your ~/.zshrc: +# +#  zstyle ':completion:*:*:git:*' script ~/.git-completion.bash  # -#  fpath=(~/.zsh $fpath) - -complete () -{ -	# do nothing -	return 0 -}  zstyle -T ':completion:*:*:git:*' tag-order && \  	zstyle ':completion:*:*:git:*' tag-order 'common-commands' @@ -28,18 +27,32 @@ zstyle -T ':completion:*:*:git:*' tag-order && \  zstyle -s ":completion:*:*:git:*" script script  if [ -z "$script" ]; then  	local -a locations -	local e +	local e bash_completion + +	bash_completion=$(pkg-config --variable=completionsdir bash-completion 2>/dev/null) || +		bash_completion='/usr/share/bash-completion/completions/' +  	locations=( -		"$(dirname ${funcsourcetrace[1]%:*})/git-completion.bash" -		'/etc/bash_completion.d/git' # fedora, old debian -		'/usr/share/bash-completion/completions/git' # arch, ubuntu, new debian -		'/usr/share/bash-completion/git' # gentoo +		"$(dirname ${funcsourcetrace[1]%:*})"/git-completion.bash +		"$HOME/.local/share/bash-completion/completions/git" +		"$bash_completion/git" +		'/etc/bash_completion.d/git' # old debian  		)  	for e in $locations; do  		test -f $e && script="$e" && break  	done  fi -ZSH_VERSION='' . "$script" + +local old_complete="$functions[complete]" +functions[complete]=: +COMP_WORDBREAKS=':' +GIT_SOURCING_ZSH_COMPLETION=y . "$script" +functions[complete]="$old_complete" + +__gitcompadd () +{ +	compadd -Q -p "${2-}" -S "${3- }" ${@[4,-1]} -- ${=1} && _ret=0 +}  __gitcomp ()  { @@ -47,59 +60,85 @@ __gitcomp ()  	local cur_="${3-$cur}" -	case "$cur_" in -	--*=) -		;; -	*) -		local c IFS=$' \t\n' -		local -a array -		for c in ${=1}; do -			c="$c${4-}" +	[[ "$cur_" == *= ]] && return + +	local c IFS=$' \t\n' sfx +	for c in ${=1}; do +		if [[ $c == "--" ]]; then +			[[ "$cur_" == --no-* ]] && continue +			__gitcompadd "--no-..." +			break +		fi + +		if [[ -z "${4-}" ]]; then  			case $c in -			--*=*|*.) ;; -			*) c="$c " ;; +			*=) c="${c%=}"; sfx="=" ;; +			*.) sfx="" ;; +			*) sfx=" " ;;  			esac -			array+=("$c") -		done -		compset -P '*[=:]' -		compadd -Q -S '' -p "${2-}" -a -- array && _ret=0 -		;; -	esac +		else +			sfx="$4" +		fi +		__gitcompadd "$c" "${2-}" "$sfx" -q +	done  } -__gitcomp_direct () +__gitcomp_nl ()  {  	emulate -L zsh -	local IFS=$'\n' -	compset -P '*[=:]' -	compadd -Q -- ${=1} && _ret=0 +	IFS=$'\n' __gitcompadd "$1" "${2-}" "${4- }"  } -__gitcomp_nl () +__gitcomp_file ()  {  	emulate -L zsh -	local IFS=$'\n' -	compset -P '*[=:]' -	compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0 +	compadd -f -p "${2-}" -- ${(f)1} && _ret=0 +} + +__gitcomp_direct () +{ +	__gitcomp_nl "$1" "" "" "" +} + +__gitcomp_file_direct () +{ +	__gitcomp_file "$1" ""  }  __gitcomp_nl_append ()  { -	emulate -L zsh +	__gitcomp_nl "$@" +} + +__gitcomp_direct_append () +{ +	__gitcomp_direct "$@" +} -	local IFS=$'\n' -	compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0 +_git_zsh () +{ +	__gitcomp "v1.2"  } -__gitcomp_file () +__git_complete_command ()  {  	emulate -L zsh -	local IFS=$'\n'  	compset -P '*[=:]' -	compadd -Q -p "${2-}" -f -- ${=1} && _ret=0 + +	local command="$1" +	local completion_func="_git_${command//-/_}" +	if (( $+functions[$completion_func] )); then +		emulate ksh -c $completion_func +		return 0 +	elif emulate ksh -c "__git_support_parseopt_helper $command"; then +		emulate ksh -c "__git_complete_common $command" +		return 0 +	else +		return 1 +	fi  }  __git_zsh_bash_func () @@ -108,14 +147,12 @@ __git_zsh_bash_func ()  	local command=$1 -	local completion_func="_git_${command//-/_}" -	declare -f $completion_func >/dev/null && $completion_func && return +	__git_complete_command "$command" && return  	local expansion=$(__git_aliased_command "$command")  	if [ -n "$expansion" ]; then  		words[1]=$expansion -		completion_func="_git_${expansion//-/_}" -		declare -f $completion_func >/dev/null && $completion_func +		__git_complete_command "$expansion"  	fi  } @@ -140,9 +177,11 @@ __git_zsh_cmd_common ()  	push:'update remote refs along with associated objects'  	rebase:'forward-port local commits to the updated upstream head'  	reset:'reset current HEAD to the specified state' +	restore:'restore working tree files'  	rm:'remove files from the working tree and from the index'  	show:'show various types of objects'  	status:'show the working tree status' +	switch:'switch branches'  	tag:'create, list, delete or verify a tag object signed with GPG')  	_describe -t common-commands 'common commands' list && _ret=0  } @@ -150,8 +189,9 @@ __git_zsh_cmd_common ()  __git_zsh_cmd_alias ()  {  	local -a list -	list=(${${${(0)"$(git config -z --get-regexp '^alias\.')"}#alias.}%$'\n'*}) -	_describe -t alias-commands 'aliases' list $* && _ret=0 +	list=(${${(0)"$(git config -z --get-regexp '^alias\.*')"}#alias.}) +	list=(${(f)"$(printf "%s:alias for '%s'\n" ${(f@)list})"}) +	_describe -t alias-commands 'aliases' list && _ret=0  }  __git_zsh_cmd_all () @@ -166,33 +206,43 @@ __git_zsh_main ()  {  	local curcontext="$curcontext" state state_descr line  	typeset -A opt_args -	local -a orig_words +	local -a orig_words __git_C_args  	orig_words=( ${words[@]} )  	_arguments -C \ -		'(-p --paginate --no-pager)'{-p,--paginate}'[pipe all output into ''less'']' \ -		'(-p --paginate)--no-pager[do not pipe git output into a pager]' \ -		'--git-dir=-[set the path to the repository]: :_directories' \ -		'--bare[treat the repository as a bare repository]' \ +		'(-p --paginate -P --no-pager)'{-p,--paginate}'[pipe all output into ''less'']' \ +		'(-p --paginate -P --no-pager)'{-P,--no-pager}'[do not pipe git output into a pager]' \ +		'(--bare)--git-dir=[set the path to the repository]: :_directories' \ +		'(--git-dir)--bare[treat the repository as a bare repository]' \  		'(- :)--version[prints the git suite version]' \ -		'--exec-path=-[path to where your core git programs are installed]:: :_directories' \ -		'--html-path[print the path where git''s HTML documentation is installed]' \ -		'--info-path[print the path where the Info files are installed]' \ -		'--man-path[print the manpath (see `man(1)`) for the man pages]' \ -		'--work-tree=-[set the path to the working tree]: :_directories' \ -		'--namespace=-[set the git namespace]' \ +		'--exec-path=[path to where your core git programs are installed]: :_directories' \ +		'(- :)--exec-path[print the path where your core git programs are installed]' \ +		'(- :)--html-path[print the path where git''s HTML documentation is installed]' \ +		'(- :)--info-path[print the path where the Info files are installed]' \ +		'(- :)--man-path[print the manpath (see `man(1)`) for the man pages]' \ +		'--work-tree=[set the path to the working tree]: :_directories' \ +		'--namespace=[set the git namespace]:' \  		'--no-replace-objects[do not use replacement refs to replace git objects]' \  		'(- :)--help[prints the synopsis and a list of the most commonly used commands]: :->arg' \ +		'*-C[run as if git was started in the given path]: :_directories' \ +		'*-c[pass a configuration parameter to the command]: :->config' \  		'(-): :->command' \  		'(-)*:: :->arg' && return  	case $state in  	(command) -		_alternative \ -                         'alias-commands:alias:__git_zsh_cmd_alias' \ -                         'common-commands:common:__git_zsh_cmd_common' \ -                         'all-commands:all:__git_zsh_cmd_all' && _ret=0 +		_tags common-commands alias-commands all-commands +		while _tags; do +			_requested common-commands && __git_zsh_cmd_common +			_requested alias-commands && __git_zsh_cmd_alias +			_requested all-commands && __git_zsh_cmd_all +			let _ret || break +		done +		;; +	(config) +		compset -P '*[=:]' +		emulate ksh -c __git_complete_config_variable_name_and_value  		;;  	(arg)  		local command="${words[1]}" __git_dir @@ -200,9 +250,13 @@ __git_zsh_main ()  		if (( $+opt_args[--bare] )); then  			__git_dir='.'  		else -			__git_dir=${opt_args[--git-dir]} +			__git_dir=${~opt_args[--git-dir]}  		fi +		for x in ${(s.:.)opt_args[-C]}; do +			__git_C_args+=('-C' ${~x}) +		done +  		(( $+opt_args[--help] )) && command='help'  		words=( ${orig_words[@]} ) @@ -227,6 +281,8 @@ _git ()  		emulate ksh -c __${service}_main  	elif (( $+functions[_${service}] )); then  		emulate ksh -c _${service} +	elif ((	$+functions[_${service//-/_}] )); then +		emulate ksh -c _${service//-/_}  	fi  	let _ret && _default && _ret=0 | 
