mirror of
				https://github.com/ohmyzsh/ohmyzsh.git
				synced 2025-11-04 13:21:19 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			61 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
#compdef scd
 | 
						|
#description smart change directory
 | 
						|
 | 
						|
local curcontext="$curcontext" state line expl ret=1
 | 
						|
typeset -A opt_args
 | 
						|
 | 
						|
local -a indexopts myargs
 | 
						|
indexopts=( --add -a --unindex )
 | 
						|
 | 
						|
myargs=(
 | 
						|
    # common options
 | 
						|
    "(--help -h)"{--help,-h}"[print help and exit]"
 | 
						|
 | 
						|
    # options for manipulating directory index
 | 
						|
    - index
 | 
						|
    "(--recursive -r)"{--recursive,-r}"[use recursive --add or --unindex]"
 | 
						|
    "($indexopts)"{--add,-a}"[add specified directories to the index]"
 | 
						|
    "($indexopts)--unindex[remove specified directories from the index]"
 | 
						|
    "*:directory:{ (( ${words[(I)-a|--add|--unindex]} )) && _path_files -/ }"
 | 
						|
 | 
						|
    # define new directory alias
 | 
						|
    - alias
 | 
						|
    "--alias=[create alias for this or given directory]:directory-alias:()"
 | 
						|
    '1:directory:{ (( words[(I)--alias*] )) && _path_files -/ }'
 | 
						|
 | 
						|
    # remove definition of directory alias
 | 
						|
    - unalias
 | 
						|
    "--unalias[remove definition of directory alias]"
 | 
						|
    "*::directory alias:->scd-alias-target"
 | 
						|
 | 
						|
    # act on the directory change
 | 
						|
    - scd
 | 
						|
    "(--all -A)"{--all,-A}"[include less likely and ignored paths]"
 | 
						|
    "--list[print matching directories and exit]"
 | 
						|
    "(--verbose -v)"{--verbose,-v}"[show directory ranking and full paths]"
 | 
						|
    "(--push -p)"{--push,-p}"[change directory with 'pushd']"
 | 
						|
    "1::directory alias:->scd-alias-target"
 | 
						|
    "*:patterns:()"
 | 
						|
)
 | 
						|
 | 
						|
_arguments -S -C $myargs && ret=0
 | 
						|
 | 
						|
 | 
						|
if [[ "$state" == scd-alias-target && -s ~/.scdalias.zsh ]]; then
 | 
						|
    local -a scdaliases
 | 
						|
    scdaliases=( )
 | 
						|
    eval "$(setopt extendedglob
 | 
						|
            phome="(#b)(#s)${HOME}(/*)#(#e)"
 | 
						|
            builtin hash -dr
 | 
						|
            source ~/.scdalias.zsh &&
 | 
						|
            for k v in ${(kv)nameddirs}; do
 | 
						|
                scdaliases+=( $k:${v/${~phome}/"~"${match[1]}} )
 | 
						|
            done
 | 
						|
            complete_unalias=${+opt_args[unalias---unalias]}
 | 
						|
            if (( complete_unalias && ! ${+nameddirs[OLD]} )); then
 | 
						|
                scdaliases+=( 'OLD:all aliases to non-existent paths' )
 | 
						|
            fi
 | 
						|
            typeset -p scdaliases )"
 | 
						|
    _describe -t scdaliases scdalias scdaliases
 | 
						|
fi
 |