Skip to content
Snippets Groups Projects
Select Git revision
  • master
  • commit-alias
  • editor-modeline
  • commit-abbreviation
  • make-hooks-work-as-advertised
  • lyda-home-version
  • feature-aliases
  • git-version-bsd-fix
  • hook-changes
  • v1.20151229-1
  • v1.20151229
  • v1.20150502-1
  • v1.20150502
  • v1.20141026-manpage-static
  • v1.20141026-1
  • v1.20141026
  • v1.20141025-1
  • v1.20141025
  • v1.20141009-manpage-static
  • v1.20141009-1
  • v1.20141009
  • v1.20140508-1-bpo70+1
  • v1.20140508-1
  • v1.20140508-manpage-static
  • v1.20140508
  • v1.20140507
  • v1.20140313
  • v1.20131229-homebrew
  • v1.20131229-1-bpo60+1
29 results

_vcsh_bash

Blame
  • user avatar
    Roland Hopferwieser authored
    6d52838a
    History
    _vcsh_bash 3.04 KiB
    # bash completion for vcsh.
    
    # run git command
    #   based on bash_completion:_command_offset()
    _vcsh_git_command () {
    	local word_offset=$1
    	for (( i=0; i < $word_offset; i++ )); do
    		for (( j=0; j <= ${#COMP_LINE}; j++ )); do
    			[[ "$COMP_LINE" == "${COMP_WORDS[i]}"* ]] && break
    			COMP_LINE=${COMP_LINE:1}
    			((COMP_POINT--))
    		done
    		COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"}
    		((COMP_POINT-=${#COMP_WORDS[i]}))
    	done
    	COMP_LINE="git $COMP_LINE"
    	((COMP_POINT+=4))
    
    	# shift COMP_WORDS elements and adjust COMP_CWORD
    	for (( i=1; i <= COMP_CWORD - $word_offset + 1; i++ )); do
    		COMP_WORDS[i]=${COMP_WORDS[i+$word_offset-1]}
    	done
    	for (( i; i <= COMP_CWORD; i++ )); do
    		unset 'COMP_WORDS[i]'
    	done
    	COMP_WORDS[0]=git
    	((COMP_CWORD -= $word_offset - 1))
    
    	local cspec=$( complete -p git 2>/dev/null )
    	if [[ -n $cspec ]]; then
    		if [[ ${cspec#* -F } != $cspec ]]; then
    			local func=${cspec#*-F }
    			func=${func%% *}
    
    			if [[ ${#COMP_WORDS[@]} -ge 2 ]]; then
    				$func git "${COMP_WORDS[${#COMP_WORDS[@]}-1]}" "${COMP_WORDS[${#COMP_WORDS[@]}-2]}"
    			else
    				$func git "${COMP_WORDS[${#COMP_WORDS[@]}-1]}"
    			fi
    
    			# restore initial compopts
    			local opt
    			while [[ $cspec == *" -o "* ]]; do
    				# FIXME: should we take "+o opt" into account?
    				cspec=${cspec#*-o }
    				opt=${cspec%% *}
    				compopt -o $opt
    				cspec=${cspec#$opt}
    			done
    		fi
    	fi
    }
    
    _vcsh () {
    	local cur prev words cword OPTS
    	_init_completion -n = || return
    
    	local repos cmds
    	repos=( $(command vcsh list) )
    	cmds="clone delete enter foreach help init list list-tracked list-untracked
    		  pull push rename run status upgrade version which write-gitignore"
    
    	local subcword cmd subcmd
    	for (( subcword=1; subcword < ${#words[@]}-1; subcword++ )); do
    		[[ -n $cmd && ${words[subcword]} != -* ]] && subcmd=${words[subcword]} && break
    		[[ ${words[subcword]} != -* ]] && cmd=${words[subcword]}
    	done
    
    	if [[ -z $cmd ]]; then
    		case $prev in
    			-c)
    				COMPREPLY=( $(compgen -f -- $cur) )
    				return
    				;;
    		esac
    
    		case $cur in
    			-*)
    				OPTS='-c -d -h -v'
    				COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) )
    				return
    				;;
    		esac
    		COMPREPLY=( $(compgen -W "${repos[*]} ${cmds[*]}" -- $cur) )
    		return 0
    	fi
    
    	case $cmd in
    		help|init|list|pull|push|version|which)
    			return
    			;;
    
    		list-untracked)
    			[[ $cur == -* ]] && \
    				COMPREPLY=( $(compgen -W '-a -r' -- $cur) ) && return
    			;;&
    
    		run)
    			if [[ -n $subcmd && -n "${repos[$subcmd]}" ]]; then
    				_command_offset $(( $subcword+1 ))
    				return
    			fi
    			;;&
    
    		delete|enter|list-tracked|list-untracked|rename|run|status|upgrade|write-gitignore)
    			# return repos
    			if [[ -z $subcmd ]]; then
    				COMPREPLY=( $(compgen -W "${repos[*]}" -- $cur) )
    				return
    			fi
    			return
    			;;
    
    		clone)
    			[[ $cur == -* ]] && \
    				COMPREPLY=( $(compgen -W '-b' -- $cur) )
    			return
    			;;
    
    		foreach)
    			[[ $cur == -* ]] \
    				&& COMPREPLY=( $(compgen -W "-g" -- $cur) ) && return
    			_vcsh_git_command $subcword
    			return
    			;;
    
    	esac
    
    	# git command on repository
    	if [[ -n "${repos[$cmd]}" ]]; then
    		_vcsh_git_command $subcword
    	fi
    	return 0
    }
    
    complete -F _vcsh vcsh
    
    # vim: ft=sh: