##// END OF EJS Templates
zsh completion improvements....
Steve Borho -
r1484:840808c5 default
parent child Browse files
Show More
@@ -1,423 +1,423 b''
1 1 #compdef hg
2 2
3 3 # Zsh completion script for mercurial. Rename this file to _hg and copy
4 4 # it into your zsh function path (/usr/share/zsh/site-functions for
5 5 # instance)
6 6 #
7 7 # Copyright (C) 2005 Steve Borho
8 8 #
9 9 # This is free software; you can redistribute it and/or modify it under
10 10 # the terms of the GNU General Public License as published by the Free
11 11 # Software Foundation; either version 2 of the License, or (at your
12 12 # option) any later version.
13 13 #
14 14
15 15 local curcontext="$curcontext" state line
16 16 typeset -A opt_args
17 17 local subcmds repos tags newFiles addedFiles includeExclude
18 18
19 19 tags=($(hg tags 2> /dev/null | sed -e 's/[0-9]*:[a-f0-9]\{40\}$//; s/ *$//'))
20 20 subcmds=($(hg -v help | sed -e '1,/^list of commands:/d' \
21 21 -e '/^global options:/,$d' -e '/^ [^ ]/!d; s/[,:].*//g;'))
22 22
23 23 # A lot of commands have these arguments
24 24 includeExclude=(
25 25 '*-I-[include names matching the given patterns]:dir:_files -W $(hg root) -/'
26 26 '*--include-[include names matching the given patterns]:dir:_files -W $(hg root) -/'
27 27 '*-X-[exclude names matching the given patterns]:dir:_files -W $(hg root) -/'
28 28 '*--exclude-[exclude names matching the given patterns]:dir:_files -W $(hg root) -/')
29 29
30 30 if [[ $service == "hg" ]]; then
31 31 _arguments -C -A "-*" \
32 32 '(--repository)-R[repository root directory]:root:_files -/' \
33 33 '(-R)--repository[repository root directory]:root:_files -/' \
34 34 '--cwd[change working directory]:new working directory:_files -/' \
35 35 '(--noninteractive)-y[do not prompt, assume yes for any required answers]' \
36 36 '(-y)--noninteractive[do not prompt, assume yes for any required answers]' \
37 37 '(--verbose)-v[enable additional output]' \
38 38 '(-v)--verbose[enable additional output]' \
39 39 '(--quiet)-q[suppress output]' \
40 40 '(-q)--quiet[suppress output]' \
41 41 '(--help)-h[display help and exit]' \
42 42 '(-h)--help[display help and exit]' \
43 43 '--debug[debug mode]' \
44 44 '--debugger[start debugger]' \
45 45 '--traceback[print traceback on exception]' \
46 46 '--time[time how long the command takes]' \
47 47 '--profile[profile]' \
48 48 '--version[output version information and exit]' \
49 49 '*::command:->subcmd' && return 0
50 50
51 51 if (( CURRENT == 1 )); then
52 52 _wanted commands expl 'hg command' compadd -a subcmds
53 53 return
54 54 fi
55 55 service="$words[1]"
56 56 curcontext="${curcontext%:*}=$service:"
57 57 fi
58 58
59 59 case $service in
60 60 (add)
61 newFiles=( $(hg status -un) )
61 newFiles=(${(ps:\0:)"$(hg status -0un .)"})
62 62 _arguments $includeExclude \
63 63 '*:file:->unknown'
64 64 _wanted files expl 'unknown files' compadd -a newFiles
65 65 ;;
66 66
67 67 (addremove)
68 68 _arguments $includeExclude \
69 69 '*:directories:_files -/' # assume they want to add/remove a dir
70 70 ;;
71 71
72 72 (forget)
73 addedFiles=( $(hg status -an) )
73 addedFiles=(${(ps:\0:)"$(hg status -0an .)"})
74 74 _arguments $includeExclude \
75 75 '*:file:->added'
76 76 _wanted files expl 'newly added files' compadd -a addedFiles
77 77 ;;
78 78
79 79 (remove|rm)
80 80 _arguments $includeExclude \
81 81 '*:file:_files'
82 82 ;;
83 83
84 84 (copy|cp)
85 85 _arguments $includeExclude \
86 86 '(--after)-A[record a copy that has already occurred]' \
87 87 '(-A)--after[record a copy that has already occurred]' \
88 88 '(--force)-f[forcibly copy over an existing managed file]' \
89 89 '(-f)--force[forcibly copy over an existing managed file]' \
90 90 '(--parents)-p[append source path to dest]' \
91 91 '(-p)--parents[append source path to dest]' \
92 92 '*:files:_files'
93 93 ;;
94 94
95 95 (rename|mv)
96 96 if (( CURRENT == 2 )); then
97 97 _arguments $includeExclude \
98 98 '(--after)-A[record a rename that has already occurred]' \
99 99 '(-A)--after[record a rename that has already occurred]' \
100 100 '(--force)-f[replace destination if it exists]' \
101 101 '(-F)--force[replace destination if it exists]' \
102 102 '(--parents)-p[append source path to dest]' \
103 103 '(-p)--parents[append source path to dest]' \
104 104 '*:files:_files'
105 105 else
106 106 _arguments '*:destination:_files'
107 107 fi
108 108 ;;
109 109
110 110 (diff)
111 111 _arguments $includeExclude \
112 112 '*-r[revision]:revision:($tags)' \
113 113 '*--rev[revision]:revision:($tags)' \
114 114 '(--text)-a[treat all files as text]' \
115 115 '(-a)--text[treat all files as text]' \
116 116 '*:file:_files'
117 117 ;;
118 118
119 119 (status)
120 120 _arguments $includeExclude \
121 121 '(--no-status)-n[hide status prefix]' \
122 122 '(-n)--no-status[hide status prefix]' \
123 123 '(--print0)-0[end filenames with NUL, for use with xargs]' \
124 124 '(-0)--print0[end filenames with NUL, for use with xargs]' \
125 125 '(--modified)-m[show only modified files]' \
126 126 '(-m)--modified[show only modified files]' \
127 127 '(--added)-a[show only added files]' \
128 128 '(-a)--added[show only added files]' \
129 129 '(--removed)-r[show only removed files]' \
130 130 '(-r)--removed[show only removed files]' \
131 131 '(--unknown)-u[show only unknown files]' \
132 132 '(-u)--unknown[show only unknown files]' \
133 133 '*:search pattern, then files:_files'
134 134 ;;
135 135
136 136 (revert)
137 addedFiles=( $(hg status -mrn) ) # modified, removed
137 addedFiles=(${(ps:\0:)"$(hg status -0amrn .)"})
138 138 _arguments \
139 139 '(--rev)-r[revision to revert to]:revision:($tags)' \
140 140 '(-r)--rev[revision to revert to]:revision:($tags)' \
141 141 '(--nonrecursive)-n[do not recurse into subdirectories]' \
142 142 '(-n)--nonrecursive[do not recurse into subdirectories]' \
143 143 '*:file:->modified'
144 144 _wanted files expl 'mofified files' compadd -a addedFiles
145 145 ;;
146 146
147 147 (commit|ci)
148 addedFiles=( $(hg status -amrn) ) # added, modified, removed
148 addedFiles=(${(ps:\0:)"$(hg status -0amrn .)"})
149 149 _arguments $includeExclude \
150 150 '(--addremove)-A[run addremove during commit]' \
151 151 '(-A)--addremove[run addremove during commit]' \
152 152 '(--message)-m[use <txt> as commit message]:string:' \
153 153 '(-m)--message[use <txt> as commit message]:string:' \
154 154 '(--logfile)-l[read commit message from <file>]:.log file:_file -g \*.txt' \
155 155 '(-l)--logfile[read commit message from <file>]:.log file:_file -g \*.txt' \
156 156 '(--date)-d[record datecode as commit date]:date code:' \
157 157 '(-d)--date[record datecode as commit date]:date code:' \
158 158 '(--user)-u[record user as commiter]:user:' \
159 159 '(-u)--user[record user as commiter]:user:' \
160 160 '*:file:->modified'
161 161 _wanted files expl 'mofified files' compadd -a addedFiles
162 162 ;;
163 163
164 164 (cat)
165 165 _arguments $includeExclude \
166 166 '(--output)-o[print output to file with formatted name]:filespec:' \
167 167 '(-o)--output[print output to file with formatted name]:filespec:' \
168 168 '(--rev)-r[revision]:revision:($tags)' \
169 169 '(-r)--rev[revision]:revision:($tags)' \
170 170 '*:file:_files'
171 171 ;;
172 172
173 173 (annotate)
174 174 _arguments $includeExclude \
175 175 '(--rev)-r[annotate the specified revision]:revision:($tags)' \
176 176 '(-r)--rev[annotate the specified revision]:revision:($tags)' \
177 177 '(--text)-a[treat all files as text]' \
178 178 '(-a)--text[treat all files as text]' \
179 179 '(--user)-u[list the author]' \
180 180 '(-u)--user[list the author]' \
181 181 '(--changeset)-c[list the changeset]' \
182 182 '(-c)--changeset[list the changeset]' \
183 183 '(--number)-n[list the revision number (default)]' \
184 184 '(-n)--number[list the revision number (default)]' \
185 185 '*:files:_files'
186 186 ;;
187 187
188 188 (grep)
189 189 _arguments $includeExclude \
190 190 '*-r[search in given revision range]:revision:($tags)' \
191 191 '*--rev[search in given revision range]:revision:($tags)' \
192 192 '--all[print all revisions with matches]' \
193 193 '(-print0)-0[end filenames with NUL, for use with xargs]' \
194 194 '(-0)--print0[end filenames with NUL, for use with xargs]' \
195 195 '(--ignore-case)-i[ignore case when matching]' \
196 196 '(-i)--ignore-case[ignore case when matching]' \
197 197 '(--files-with-matches)-l[print names of files and revs that match]' \
198 198 '(-l)--files-with-matches[print names of files and revs that match]' \
199 199 '(--line-number)-n[print matching line numbers]' \
200 200 '(-n)--line-number[print matching line numbers]' \
201 201 '(--user)-u[print user who committed change]' \
202 202 '(-u)--user[print user who committed change]' \
203 203 '*:search pattern:'
204 204 ;;
205 205
206 206 (locate)
207 207 _arguments $includeExclude \
208 208 '(--rev)-r[search repository as it stood at revision]:revision:($tags)' \
209 209 '(-r)--rev[search repository as it stood at revision]:revision:($tags)' \
210 210 '(--print0)-0[end filenames with NUL, for use with xargs]' \
211 211 '(-0)--print0[end filenames with NUL, for use with xargs]' \
212 212 '(--fullpath)-f[print complete paths]' \
213 213 '(-f)--fullpath[print complete paths]' \
214 214 '*:search pattern:'
215 215 ;;
216 216
217 217 (log|history)
218 218 _arguments $includeExclude \
219 219 '*-r[show the specified revision or range]:revision:($tags)' \
220 220 '*--rev[show the specified revision or range]:revision:($tags)' \
221 221 '(--no-merges -M --only-merges)-m[show only merge revisions]' \
222 222 '(--no-merges -M -m)--only-merges[show only merge revisions]' \
223 223 '(--only-merges -m --no-merges)-M[do not show merge revisions]' \
224 224 '(--only-merges -m -M)--no-merges[do not show merge revisions]' \
225 225 '(--keyword)-k[search for a keyword]:keyword:' \
226 226 '(-k)--keyword[search for a keyword]:keyword:' \
227 227 '(--branch)-b[show branches]' \
228 228 '(-b)--branch[show branches]' \
229 229 '(--patch)-p[show patch]' \
230 230 '(-p)--patch[show patch]' \
231 231 '*:file:_files'
232 232 ;;
233 233
234 234 (update|checkout|co)
235 235 _arguments \
236 236 '(--branch)-b[checkout the head of a specific branch]' \
237 237 '(-b)--branch[checkout the head of a specific branch]' \
238 238 '(-C --clean --merge)-m[allow merging of branches]' \
239 239 '(-C --clean -m)--merge[allow merging of branches]' \
240 240 '(-m --merge --clean)-C[overwrite locally modified files]' \
241 241 '(-m --merge -C)--clean[overwrite locally modified files]' \
242 242 '*:revision or tag:($tags)'
243 243 ;;
244 244
245 245 (tag)
246 246 _arguments \
247 247 '(--local)-l[make the tag local]' \
248 248 '(-l)--local[make the tag local]' \
249 249 '(--message)-m[message for tag commit log entry]:string:' \
250 250 '(-m)--message[message for tag commit log entry]:string:' \
251 251 '(--date)-d[record datecode as commit date]:date code:' \
252 252 '(-d)--date[record datecode as commit date]:date code:' \
253 253 '(--user)-u[record user as commiter]:user:' \
254 254 '(-u)--user[record user as commiter]:user:' \
255 255 '*:name, then revision:($tags)'
256 256 ;;
257 257
258 258 (clone)
259 259 if (( CURRENT == 2 )); then
260 260 _arguments \
261 261 '(--no-update)-U[do not update the new working directory]' \
262 262 '(-U)--no-update[do not update the new working directory]' \
263 263 '(--ssh)-e[specify ssh command to use]:string:' \
264 264 '(-e)--ssh[specify ssh command to use]:string:' \
265 265 '--pull[use pull protocol to copy metadata]' \
266 266 '--remotecmd[specify hg command to run on the remote side]:remote hg:' \
267 267 '*:local repo:_files -/'
268 268 elif (( CURRENT == 3 )); then
269 269 _arguments '*:dest repo:_files -/'
270 270 fi
271 271 ;;
272 272
273 273 (rawcommit)
274 274 _arguments \
275 275 '(--parent)-p[parent revision]:revision:($tags)' \
276 276 '(-p)--parent[parent revision]:revision:($tags)' \
277 277 '(--date)-d[record datecode as commit date]:date code:' \
278 278 '(-d)--date[record datecode as commit date]:date code:' \
279 279 '(--user)-u[record user as commiter]:user:' \
280 280 '(-u)--user[record user as commiter]:user:' \
281 281 '(--message)-m[use <txt> as commit message]:string:' \
282 282 '(-m)--message[use <txt> as commit message]:string:' \
283 283 '(--logfile)-l[read commit message from <file>]:.log file:_file -g \*.txt' \
284 284 '(-l)--logfile[read commit message from <file>]:.log file:_file -g \*.txt' \
285 285 '(--files)-F[file list]:file list:_files' \
286 286 '(-F)--files[file list]:file list:_files' \
287 287 '*:files to commit:_files'
288 288 ;;
289 289
290 290 (bundle)
291 291 if (( CURRENT == 2 )); then
292 292 _arguments '*:changegroup file:_files -g \*.hg'
293 293 elif (( CURRENT == 3 )); then
294 294 _arguments '*:other repo:_files -/'
295 295 fi
296 296 ;;
297 297
298 298 (unbundle)
299 299 _arguments '*:changegroup .hg file:_files -g \*.hg'
300 300 ;;
301 301
302 302 (incoming)
303 303 _arguments \
304 304 '(--patch)-p[show patch]' \
305 305 '(-p)--patch[show patch]' \
306 306 '(--no-merges)-M[do not show merge revisions]' \
307 307 '(-M)--no-merges[do not show merge revisions]' \
308 308 '(--newest-first)-n[show newest record first]' \
309 309 '(-n)--newest-first[show newest record first]' \
310 310 '*:mercurial repository:_files -/'
311 311 ;;
312 312
313 313 (import|patch)
314 314 _arguments \
315 315 '(--strip)-p[directory strip option for patch (default: 1)]:count:' \
316 316 '(-p)--strip[directory strip option for patch (default: 1)]:count:' \
317 317 '(--force)-f[skip check for outstanding uncommitted changes]' \
318 318 '(-f)--force[skip check for outstanding uncommitted changes]' \
319 319 '(--base)-b[base directory to read patches from]:file:_files -W $(hg root) -/' \
320 320 '(-b)--base[base directory to read patches from]:file:_files -W $(hg root) -/' \
321 321 '*:patch file:_files'
322 322 ;;
323 323
324 324 (pull)
325 325 repos=( $(hg paths | sed -e 's/^.*= //') )
326 326 _arguments \
327 327 '(--update)-u[update working directory to tip after pull]' \
328 328 '(-u)--update[update working directory to tip after pull]' \
329 329 '(--ssh)-e[specify ssh command to use]:ssh command:' \
330 330 '(-e)--ssh[specify ssh command to use]:ssh command:' \
331 331 '--remotecmd[specify hg command to run on the remote side]:remote hg:' \
332 332 '*:local repo:_files -/'
333 333 _wanted source expl 'source repository' compadd -a repos
334 334 ;;
335 335
336 336 (outgoing)
337 337 _arguments \
338 338 '(--patch)-p[show patch]' \
339 339 '(-p)--patch[show patch]' \
340 340 '(--no-merges)-M[do not show merge revisions]' \
341 341 '(-M)--no-merges[do not show merge revisions]' \
342 342 '(--newest-first)-n[show newest record first]' \
343 343 '(-n)--newest-first[show newest record first]' \
344 344 '*:local repo:_files -/'
345 345 _wanted source expl 'source repository' compadd -a repos
346 346 ;;
347 347
348 348 (export)
349 349 _arguments \
350 350 '(--outout)-o[print output to file with formatted name]:filespec:' \
351 351 '(-o)--output[print output to file with formatted name]:filespec:' \
352 352 '(--text)-a[treat all files as text]' \
353 353 '(-a)--text[treat all files as text]' \
354 354 '*:revision:->revs'
355 355 _wanted revs expl 'revision or tag' compadd -a tags
356 356 ;;
357 357
358 358 (push)
359 359 repos=( $(hg paths | sed -e 's/^.*= //') )
360 360 _arguments \
361 361 '(--force)-f[force push]' \
362 362 '(-f)--force[force push]' \
363 363 '(--ssh)-e[specify ssh command to use]:ssh command:' \
364 364 '(-e)--ssh[specify ssh command to use]:ssh command:' \
365 365 '--remotecmd[specify hg command to run on the remote side]:remote hg:' \
366 366 '*:local repo:_files -/'
367 367 _wanted source expl 'source repository' compadd -a repos
368 368 ;;
369 369
370 370 (serve)
371 371 _arguments \
372 372 '(--accesslog)-A[name of access log file]:log file:_files' \
373 373 '(-A)--accesslog[name of access log file]:log file:_files' \
374 374 '(--errorlog)-E[name of error log file]:log file:_files' \
375 375 '(-E)--errorlog[name of error log file]:log file:_files' \
376 376 '(--port)-p[listen port]:listen port:' \
377 377 '(-p)--port[listen port]:listen port:' \
378 378 '(--address)-a[interface address]:interface address:' \
379 379 '(-a)--address[interface address]:interface address:' \
380 380 '(--name)-n[name to show in web pages]:repository name:' \
381 381 '(-n)--name[name to show in web pages]:repository name:' \
382 382 '(--templates)-t[web template directory]:template dir:_files -/' \
383 383 '(-t)--templates[web template directory]:template dir:_files -/' \
384 384 '--style[web template style]:style' \
385 385 '--stdio[for remote clients]' \
386 386 '(--ipv6)-6[use IPv6 in addition to IPv4]' \
387 387 '(-6)--ipv6[use IPv6 in addition to IPv4]'
388 388 ;;
389 389
390 390 (help)
391 391 _wanted commands expl 'hg command' compadd -a subcmds
392 392 ;;
393 393
394 394 (heads)
395 395 _arguments \
396 396 '(--branches)-b[find branch info]' \
397 397 '(-b)--branches[find branch info]'
398 398 ;;
399 399
400 400 (paths)
401 401 _arguments '*:symbolic name:(default default-push)'
402 402 ;;
403 403
404 404 (init)
405 405 _arguments '*:new repo directory:_files -/'
406 406 ;;
407 407
408 408 (manifest)
409 409 _arguments '*:revision:($tags)'
410 410 ;;
411 411
412 412 (parents)
413 413 _arguments '*:revision:($tags)'
414 414 ;;
415 415
416 416 (identify|recover|root|undo|view|verify|version|ct|tags)
417 417 # no arguments for these commands
418 418 ;;
419 419
420 420 (*)
421 421 _message "unknown hg command completion: $service"
422 422 ;;
423 423 esac
General Comments 0
You need to be logged in to leave comments. Login now