76 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #  cdfunc - example completion function for cd
 | |
| #
 | |
| #  based on the cd completion function from the bash_completion package
 | |
| #
 | |
| #  Chet Ramey <chet.ramey@case.edu>
 | |
| #
 | |
| #  Copyright 2011 Chester Ramey
 | |
| #
 | |
| #   This program is free software; you can redistribute it and/or modify
 | |
| #   it under the terms of the GNU General Public License as published by
 | |
| #   the Free Software Foundation; either version 2, or (at your option)
 | |
| #   any later version.
 | |
| #
 | |
| #   TThis program is distributed in the hope that it will be useful,
 | |
| #   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| #   GNU General Public License for more details.
 | |
| #
 | |
| #   You should have received a copy of the GNU General Public License
 | |
| #   along with this program; if not, write to the Free Software Foundation,
 | |
| #   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 | |
| 
 | |
| _comp_cd()
 | |
| {
 | |
| 	local IFS=$' \t\n'	# normalize IFS
 | |
| 	local cur _skipdot _cdpath
 | |
| 	local i j k
 | |
| 
 | |
| 	# Tilde expansion, with side effect of expanding tilde to full pathname
 | |
| 	case "$2" in
 | |
| 	\~*)	eval cur="$2" ;;
 | |
| 	*)	cur=$2 ;;
 | |
| 	esac
 | |
| 
 | |
| 	# no cdpath or absolute pathname -- straight directory completion
 | |
| 	if [[ -z "${CDPATH:-}" ]] || [[ "$cur" == @(./*|../*|/*) ]]; then
 | |
| 		# compgen prints paths one per line; could also use while loop
 | |
| 		IFS=$'\n'
 | |
| 		COMPREPLY=( $(compgen -d -- "$cur") )
 | |
| 		IFS=$' \t\n'
 | |
| 	# CDPATH+directories in the current directory if not in CDPATH
 | |
| 	else
 | |
| 		IFS=$'\n'
 | |
| 		_skipdot=false
 | |
| 		# preprocess CDPATH to convert null directory names to .
 | |
| 		_cdpath=${CDPATH/#:/.:}
 | |
| 		_cdpath=${_cdpath//::/:.:}
 | |
| 		_cdpath=${_cdpath/%:/:.}
 | |
| 		for i in ${_cdpath//:/$'\n'}; do
 | |
| 			if [[ $i -ef . ]]; then _skipdot=true; fi
 | |
| 			k="${#COMPREPLY[@]}"
 | |
| 			for j in $( compgen -d -- "$i/$cur" ); do
 | |
| 				COMPREPLY[k++]=${j#$i/}		# cut off directory
 | |
| 			done
 | |
| 		done
 | |
| 		$_skipdot || COMPREPLY+=( $(compgen -d -- "$cur") )
 | |
| 		IFS=$' \t\n'
 | |
| 	fi
 | |
| 
 | |
| 	# variable names if appropriate shell option set and no completions
 | |
| 	if shopt -q cdable_vars && [[ ${#COMPREPLY[@]} -eq 0 ]]; then
 | |
| 		COMPREPLY=( $(compgen -v -- "$cur") )
 | |
| 	fi
 | |
| 
 | |
| 	# append slash to passed directory name that is the only completion.
 | |
| 	# readline will not do this if we complete from CDPATH
 | |
| 	if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
 | |
| 		i=${COMPREPLY[0]}	# shorthand
 | |
| 		if [[ "$cur" == "$i" ]] && [[ "$i" != "*/" ]]; then
 | |
| 			COMPREPLY[0]+=/
 | |
| 		fi
 | |
| 	fi
 | |
| 	return 0
 | |
| }
 | |
| 
 | |
| complete -o filenames -o nospace -o bashdefault -F _comp_cd cd
 | 
