122 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
| # Based on:
 | |
| # https://github.com/Valodim/zsh-capture-completion/blob/master/.zshrc
 | |
| 
 | |
| ZLE_DISABLE_AUTOSUGGEST=1
 | |
| # no prompt!
 | |
| PROMPT=
 | |
| 
 | |
| # load completion system
 | |
| autoload compinit
 | |
| compinit
 | |
| 
 | |
| # never run a command
 | |
| bindkey '\C-m' .kill-buffer
 | |
| bindkey '\C-j' .kill-buffer
 | |
| bindkey '\C-i' complete-word
 | |
| 
 | |
| # send an emtpy line before completions are output
 | |
| empty-line() {
 | |
| 	print
 | |
| 	# handler needs to reinsert itself after being called
 | |
| 	compprefuncs+=empty-line
 | |
| }
 | |
| compprefuncs+=empty-line
 | |
| 
 | |
| # send a line with null-byte after completions are output
 | |
| null-line() {
 | |
| 	print $'\0'
 | |
| 	# handler needs to reinsert itself after being called
 | |
| 	comppostfuncs+=null-line
 | |
| }
 | |
| comppostfuncs+=null-line
 | |
| 
 | |
| zstyle ':completion:*' completer _complete
 | |
| # never group stuff!
 | |
| zstyle ':completion:*' list-grouped false
 | |
| # don't insert tab when attempting completion on empty line
 | |
| zstyle ':completion:*' insert-tab false
 | |
| # no list separator, this saves some stripping later on
 | |
| zstyle ':completion:*' list-separator ''
 | |
| # dont use matchers
 | |
| zstyle -d ':completion:*' matcher-list
 | |
| # dont format
 | |
| zstyle -d ':completion:*' format
 | |
| # no color formatting
 | |
| zstyle -d ':completion:*' list-colors
 | |
| 
 | |
| # we use zparseopts
 | |
| zmodload zsh/zutil
 | |
| 
 | |
| # override compadd (this our hook)
 | |
| compadd () {
 | |
| 
 | |
| 	# check if any of -O, -A or -D are given
 | |
| 	if [[ ${@[1,(i)(-|--)]} == *-(O|A|D)\ * ]]; then
 | |
| 		# if that is the case, just delegate and leave
 | |
| 		builtin compadd "$@"
 | |
| 		return $?
 | |
| 	fi
 | |
| 
 | |
| 	# be careful with namespacing here, we don't want to mess with stuff that
 | |
| 	# should be passed to compadd!
 | |
| 	typeset -a __hits __dscr __tmp
 | |
| 
 | |
| 	# do we have a description parameter?
 | |
| 	# note we don't use zparseopts here because of combined option parameters
 | |
| 	# with arguments like -default- confuse it.
 | |
| 	if (( $@[(I)-d] )); then # kind of a hack, $+@[(r)-d] doesn't work because of line noise overload
 | |
| 		# next param after -d
 | |
| 		__tmp=${@[$[${@[(i)-d]}+1]]}
 | |
| 		# description can be given as an array parameter name, or inline () array
 | |
| 		if [[ $__tmp == \(* ]]; then
 | |
| 			eval "__dscr=$__tmp"
 | |
| 		else
 | |
| 			__dscr=( "${(@P)__tmp}" )
 | |
| 		fi
 | |
| 	fi
 | |
| 
 | |
| 	# capture completions by injecting -A parameter into the compadd call.
 | |
| 	# this takes care of matching for us.
 | |
| 	builtin compadd -A __hits -D __dscr "$@"
 | |
| 
 | |
| 	# JESUS CHRIST IT TOOK ME FOREVER TO FIGURE OUT THIS OPTION WAS SET AND WAS MESSING WITH MY SHIT HERE
 | |
| 	setopt localoptions norcexpandparam extendedglob
 | |
| 
 | |
| 	# extract prefixes and suffixes from compadd call. we can't do zsh's cool
 | |
| 	# -r remove-func magic, but it's better than nothing.
 | |
| 	typeset -A apre hpre hsuf asuf
 | |
| 	zparseopts -E P:=apre p:=hpre S:=asuf s:=hsuf
 | |
| 
 | |
| 	# append / to directories? we are only emulating -f in a half-assed way
 | |
| 	# here, but it's better than nothing.
 | |
| 	integer dirsuf=0
 | |
| 	# don't be fooled by -default- >.>
 | |
| 	if [[ -z $hsuf && "${${@//-default-/}% -# *}" == *-[[:alnum:]]#f* ]]; then
 | |
| 		dirsuf=1
 | |
| 	fi
 | |
| 
 | |
| 	# just drop
 | |
| 	[[ -n $__hits ]] || return
 | |
| 
 | |
| 	# this is the point where we have all matches in $__hits and all
 | |
| 	# descriptions in $__dscr!
 | |
| 
 | |
| 	# display all matches
 | |
| 	local dsuf dscr
 | |
| 	for i in {1..$#__hits}; do
 | |
| 
 | |
| 		# add a dir suffix?
 | |
| 		(( dirsuf )) && [[ -d $__hits[$i] ]] && dsuf=/ || dsuf=
 | |
| 		# description to be displayed afterwards
 | |
| 		# (( $#__dscr >= $i )) && dscr=" -- ${${__dscr[$i]}##$__hits[$i] #}" || dscr=
 | |
| 
 | |
| 		print - $'\1'$IPREFIX$apre$hpre$__hits[$i]$dsuf$hsuf$asuf$dscr
 | |
| 
 | |
| 	done
 | |
| 
 | |
| 	unset __hits __dscr __tmp
 | |
| }
 | |
| 
 | |
| # signal the daemon we are ready for input
 | |
| print $'\0'
 |