about summary refs log tree commit diff
path: root/Completion/Unix/Command/_vim
blob: d9dc1a5b3ca5d7bf870f3e0866b857b5043563d2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#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