mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-11-04 07:21:06 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			158 lines
		
	
	
	
		
			6.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
	
		
			6.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
#compdef vim gvim gex gview nvim rvim rview rgvim rgview evim eview vimdiff gvimdiff mvim
 | 
						|
 | 
						|
(( $+functions[_vim_files] )) ||
 | 
						|
_vim_files () {
 | 
						|
  case $PREFIX in
 | 
						|
    (+*) _files -P './' $* && return 0 ;;
 | 
						|
    ((scp|http(|s)|(|s)ftp):*) _urls ;;
 | 
						|
    (*) _files $* ;;
 | 
						|
  esac
 | 
						|
  case $PREFIX in
 | 
						|
    (+) _message -e 'start at a given line (default: end of file)' ;;
 | 
						|
    (+<1->) _message -e 'line number' ;;
 | 
						|
  esac
 | 
						|
}
 | 
						|
 | 
						|
local curcontext="$curcontext" state line expl ret=1
 | 
						|
typeset -A opt_args
 | 
						|
 | 
						|
local arguments
 | 
						|
 | 
						|
arguments=(
 | 
						|
  '-m[modifications (writing files) not allowed]'
 | 
						|
  '-M[modifications in text not allowed]'
 | 
						|
  '-b[binary mode]'
 | 
						|
  '-l[lisp mode]'
 | 
						|
  '-V-[verbosity level]::verbosity [10]:->verbosity'
 | 
						|
  '-D[debugging mode]'
 | 
						|
  '-n[no swap file (memory only)]'
 | 
						|
  {-r,-L}'[list swap files and exit or recover from a swap file]::swap file:_vim_files -g "*.sw?(-.)"'
 | 
						|
  '(   -H -F)-A[start in Arabic mode]'
 | 
						|
  '(-A    -F)-H[start in Hebrew mode]'
 | 
						|
  '(-A -H   )-F[start in Farsi mode]'
 | 
						|
  '-u[use given vimrc file instead of default .vimrc]:config:->config'
 | 
						|
  "--noplugin[don't load plugin scripts]"
 | 
						|
  '-o-[number of windows to open (default: one for each file)]::window count: '
 | 
						|
  '-O-[number of windows to vertically split open (default is one for each file)]::window count: '
 | 
						|
  '-p-[number of tabs to open (default: one for each file)]::tab count: '
 | 
						|
  '(* -t)-q+[quickfix file]::file:_files'
 | 
						|
  '*--cmd[execute given command before loading any RC files]:command: '
 | 
						|
  '-c[execute given command after loading the first file]:command: '
 | 
						|
  '-S[source a session file after loading the first file]::session file:_files'
 | 
						|
  '-s[read normal-mode commands from script file]:script file:_files'
 | 
						|
  '-w[append all typed commands to given file]:output file:_files'
 | 
						|
  '-W[write all typed commands to given file, overwriting existing file]:output file:_files'
 | 
						|
  '--startuptime[write startup timing messages to given file]:log file:_files'
 | 
						|
  '(- *)'{-h,--help}'[print help and exit]'
 | 
						|
  '(- *)--version[print version information and exit]'
 | 
						|
  '(* -q)-t+[edit file where tag is defined]:tag:_complete_tag'
 | 
						|
  '(-t -q)*:file:_vim_files'
 | 
						|
)
 | 
						|
if [[ $service = nvim ]]; then
 | 
						|
  arguments+=(
 | 
						|
    '(-e -E -es -Es -s -d)-e[ex mode, read stdin as ex command]'
 | 
						|
    '(-e -E -es -Es -s -d)-E[ex mode, read stdin as text]'
 | 
						|
    '(-e -E -es -Es -s -d)-es[silent mode, read stdin as ex command]'
 | 
						|
    '(-e -E -es -Es -s -d)-Es[silent mode, read stdin as text]'
 | 
						|
    '-i[use the specified shada file]:shada file:_files'
 | 
						|
    '(- *)-v[print version information and exit]'
 | 
						|
    '(- *)--api-info[print msgpack-encoded api-metadata and exit]'
 | 
						|
    '--headless[do not start user interface]'
 | 
						|
    '--embed[use standard input and output as a msgpack-rpc channel]'
 | 
						|
    '--listen[start RPC server on the specified socket or named pipe]:address'
 | 
						|
  )
 | 
						|
else
 | 
						|
  arguments+=(
 | 
						|
    '(-v    -E    -d -y)-e[ex mode]'
 | 
						|
    '(-v -e       -d -y)-E[improved ex mode]'
 | 
						|
    '(   -e -E -s -d -y)-v[vi mode]'
 | 
						|
    '(-v -e -E -s -d   )-y[easy mode]'
 | 
						|
    '-C[start in compatible mode]'
 | 
						|
    '-N[start in incompatible mode]'
 | 
						|
    '-nb[start as NetBean server]'
 | 
						|
    '-T[set terminal type]:::_terminals'
 | 
						|
    '--not-a-term[skip warning for input/output not being a terminal]'
 | 
						|
    '--ttyfail[exit if input or output is not a terminal]'
 | 
						|
    '-X[do not connect to X server]'
 | 
						|
    '-x[edit encrypted files]'
 | 
						|
    '--remote[edit given files in a vim server if possible]:*:file:_vim_files'
 | 
						|
    '--remote-silent[as --remote but without complaining if not possible]:*:file:_vim_files'
 | 
						|
    '--remote-wait[as --remote but wait for files to have been edited]:*:file:_vim_files'
 | 
						|
    '--remote-wait-silent[as --remote-wait but without complaining if not possible]:*:file:_vim_files'
 | 
						|
    '--remote-send[send given keys to vim server if possible]:keys: '
 | 
						|
    '--remote-tab[as --remote but open tab page for each file]:*:file:_vim_files'
 | 
						|
    '--remote-tab-silent[as --remote-silent but open tab page for each file]:*:file:_vim_files'
 | 
						|
    '--remote-tab-wait[as --remote-wait but open tab page for each file]:*:file:_vim_files'
 | 
						|
    '--remote-tab-wait-silent[as --remote-wait-silent but open tab page for each file]:*:file:_vim_files'
 | 
						|
    '--remote-expr[evaluate given expression in a vim server and print result]:expression: '
 | 
						|
    '--literal[do not expand wildcards in arguments (this is useless with ZSH)]'
 | 
						|
    '(- *)--serverlist[list available vim servers and exit]'
 | 
						|
    '--servername[name of vim server to send to or name of server to become]:server name:->server'
 | 
						|
    '--socketid[run GVIM in another window]'
 | 
						|
    '-i[use specified viminfo file]:viminfo file [~/.viminfo]:_files'
 | 
						|
    '--clean[start with defaults in non-compatible mode]'
 | 
						|
  )
 | 
						|
fi
 | 
						|
[[ $service != *g* && $service != nvim ]] && arguments+='-g[start with GUI]'
 | 
						|
[[ $service != r* ]] && arguments+='-Z[restricted mode]'
 | 
						|
[[ $service != *diff ]] && arguments+='(-v -e -E -es -Es -s -y)-d[diff mode]'
 | 
						|
[[ $service != *view ]] && arguments+='-R[readonly mode]'
 | 
						|
[[ $service = *g* ]] || (( ${words[(I)-g]} )) && arguments+=(
 | 
						|
  '(--nofork -f)'{--nofork,-f}'[do not detach the GUI version from the shell]'
 | 
						|
  '-font:font:_xft_fonts'
 | 
						|
  '-geometry:geometry:_x_geometry'
 | 
						|
  '(-rv -reverse)'{-rv,-reverse}'[use reverse video]'
 | 
						|
  '-display:display:_x_display'
 | 
						|
  '--role[set unique role to identify main window]:role'
 | 
						|
  '--socketid[open vim inside another GTK widget]:xid'
 | 
						|
  '--echo-wid[echo window ID on stdout]'
 | 
						|
  '-U[use given gvimrc file instead of default .gvimrc]:gui config:->configgui'
 | 
						|
)
 | 
						|
 | 
						|
_arguments -C -S $arguments && ret=0
 | 
						|
 | 
						|
if [[ "$state" = server ]]; then
 | 
						|
  local -a servers
 | 
						|
  servers=( ${(f)"$(_call_program servers $words[1] --serverlist 2>/dev/null)"} )
 | 
						|
  _wanted servers expl server compadd -M 'm:{a-z}={A-Z}' -a servers && ret=0
 | 
						|
elif [[ $state = verbosity ]]; then
 | 
						|
  _tags numbers files
 | 
						|
  while _tags; do
 | 
						|
    _requested numbers && _describe -V 'verbosity [10]' "(
 | 
						|
      0:don\'t' display any messages'
 | 
						|
      1:'display when viminfo file is read or written'
 | 
						|
      2:'display sourced files'
 | 
						|
      5:'display every searched tag-file'
 | 
						|
      8:'display files that trigger autocommands'
 | 
						|
      9:'display every triggered autocommand'
 | 
						|
      12:'display every executed function'
 | 
						|
      13:'report every thrown, caught, finished, or discarded exception'
 | 
						|
      14:'display anything pending in a :finally clause'
 | 
						|
      15:'display every executed ex-command'
 | 
						|
    )" && ret=0
 | 
						|
    if _requested files expl 'file for verbose output'; then
 | 
						|
      compset -P '[0-9]#'
 | 
						|
      _files "$expl[@]" && ret=0
 | 
						|
    fi
 | 
						|
    (( ret )) || break
 | 
						|
  done
 | 
						|
elif [[ "$state" = config* ]]; then
 | 
						|
  _tags special files
 | 
						|
  local names=(
 | 
						|
      "NONE:'skip initialization from files and environment variables'"
 | 
						|
      "NORC:'same as NONE, but load plugins'"
 | 
						|
  )
 | 
						|
  # gvim only supports -U NONE to skip GUI initialization.
 | 
						|
  [[ $state != configgui || $service != *g* ]] && names+=(
 | 
						|
      "DEFAULTS:'same as NONE, but loads defaults.vim'"
 | 
						|
  )
 | 
						|
  while _tags; do
 | 
						|
    _requested special && _describe -V 'special' "(${(F)names})" && ret=0
 | 
						|
    if _requested files expl 'rc file'; then
 | 
						|
      _files "$expl[@]" && ret=0
 | 
						|
    fi
 | 
						|
    (( ret )) || break
 | 
						|
  done
 | 
						|
fi
 | 
						|
 | 
						|
return ret
 |