contrib/zsh_completion
changeset 1362 246e1a00af6f
child 1365 74cf45f8bc19
equal deleted inserted replaced
1361:f6d73b26dbdb 1362:246e1a00af6f
       
     1 #compdef hg
       
     2 
       
     3 # Zsh completion script for mercurial.  Rename this file to _hg and copy
       
     4 # it into your zsh function path (/usr/share/zsh/site-functions for
       
     5 # instance)
       
     6 #
       
     7 # Copyright (C) 2005 Steve Borho
       
     8 #
       
     9 # This is free software; you can redistribute it and/or modify it under
       
    10 # the terms of the GNU General Public License as published by the Free
       
    11 # Software Foundation; either version 2 of the License, or (at your
       
    12 # option) any later version.
       
    13 #
       
    14 
       
    15 local curcontext="$curcontext" state line
       
    16 typeset -A opt_args
       
    17 local subcmds repos tags newFiles addedFiles
       
    18 
       
    19 tags=($(hg tags | sed -e 's/[0-9]*:[a-f0-9]\{40\}$//; s/ *$//'))
       
    20 subcmds=($(hg -v help | sed -e '1,/^list of commands:/d' \
       
    21       -e '/^global options:/,$d' -e '/^ [^ ]/!d; s/[,:]//g;'))
       
    22 
       
    23 if [[ $service == "hg" ]]; then
       
    24 	_arguments -C -A "-*" \
       
    25 	'-R+[repository root directory]' \
       
    26 	'-y[non-interactive]' \
       
    27 	'-v[verbose]' \
       
    28 	'-q[quiet]' \
       
    29 	'--time[time how long the command takes]' \
       
    30 	'--profile[profile]' \
       
    31 	'-h-[display help and exit]' \
       
    32 	'--version-[output version information and exit]' \
       
    33     '--cwd[change working directory]:new working directory:_files -/' \
       
    34 	'*::command:->subcmd' && return 0
       
    35 
       
    36 	if (( CURRENT == 1 )); then
       
    37 		_wanted commands expl 'hg command' compadd -a subcmds
       
    38 		return
       
    39 	fi
       
    40 	service="$words[1]"
       
    41 	curcontext="${curcontext%:*}=$service:"
       
    42 fi
       
    43 
       
    44 case $service in
       
    45     (addremove)
       
    46 		_arguments \
       
    47         '-I[include path in search]:dir:_files -W $(hg root) -/' \
       
    48         '-X[exclude path in search]:dir:_files -W $(hg root) -/' \
       
    49         '*:directories:_files -/'  # assume they want to add/remove a dir
       
    50     ;;
       
    51 
       
    52     (add)
       
    53         newFiles=( $(hg status -un) )
       
    54 		_arguments \
       
    55         '-I[include path in search]:dir:_files -W $(hg root) -/' \
       
    56         '-X[exclude path in search]:dir:_files -W $(hg root) -/'
       
    57         _wanted files expl 'unknown files' compadd -a newFiles
       
    58     ;;
       
    59 
       
    60     (remove|rm)
       
    61 		_arguments \
       
    62         '-I[include path in search]:dir:_files -W $(hg root) -/' \
       
    63         '-X[exclude path in search]:dir:_files -W $(hg root) -/' \
       
    64         '*:file:_files'
       
    65     ;;
       
    66 
       
    67 	(cat)
       
    68 		_arguments \
       
    69         '-I[include path in search]:dir:_files -W $(hg root) -/' \
       
    70         '-X[exclude path in search]:dir:_files -W $(hg root) -/' \
       
    71         '-o[output to file]:file:' \
       
    72         '-r[revision]:revision:($tags)' \
       
    73         '*:file:_files'
       
    74 	;;
       
    75 
       
    76 	(checkout|update|up|co)
       
    77 		_arguments \
       
    78         '-b[checkout the head of a specific branch]:tag:' \
       
    79         '-m[allow merging of conflicts]' \
       
    80         '-C[overwrite locally modified files]' \
       
    81         '*:revision:->revs'
       
    82         _wanted revs expl 'revision or tag' compadd -a tags
       
    83 	;;
       
    84 
       
    85 	(commit|ci)
       
    86 		_arguments \
       
    87         '-I[include path in search]:dir:_files -W $(hg root) -/' \
       
    88         '-X[exclude path in search]:dir:_files -W $(hg root) -/' \
       
    89 		'-A[run addremove during commit]' \
       
    90 		'-m[commit message]:string:' \
       
    91 		'-d[date code]:string:' \
       
    92 		'-u[user]:string:' \
       
    93         '*:file:_files'
       
    94 	;;
       
    95 
       
    96 	(tag)
       
    97 		_arguments \
       
    98 		'-l[make the tag local]:' \
       
    99 		'-m[commit message]:string:' \
       
   100 		'-d[date code]:string:' \
       
   101 		'-u[user]:string:' \
       
   102         '*:name and revision:'
       
   103 	;;
       
   104 
       
   105 	(clone)
       
   106 		_arguments \
       
   107 		'-U[skip update after cloning]' \
       
   108 		'-e[ssh command]:string:' \
       
   109 		'--pull[use pull protocol to copy metadata]' \
       
   110 		'--remotecmd[remote hg command]:command:->subcmd'
       
   111 	;;
       
   112 
       
   113 	(export)
       
   114 		_arguments \
       
   115         '-o[output to a file]:file:' \
       
   116         '-a-[tread all files as text]' \
       
   117         '*:revision:->revs'
       
   118         _wanted revs expl 'revision or tag' compadd -a tags
       
   119 	;;
       
   120 
       
   121 	(heads)
       
   122 		_arguments '-b[find branch info]'
       
   123 	;;
       
   124 
       
   125 	(outgoing|out)
       
   126 		_arguments '-p[show patch]'
       
   127 	;;
       
   128 
       
   129 	(paths)
       
   130 		_arguments '*:symbolic name:(default default-push)'
       
   131 	;;
       
   132 
       
   133 	(init)
       
   134 		_arguments '*:new repo directory:_files -/'
       
   135     ;;
       
   136 
       
   137 	(unbundle)
       
   138         _arguments '*:changegroup file:_files'
       
   139     ;;
       
   140 
       
   141 	(manifest)
       
   142 		_arguments \
       
   143         '*:revision:->revs'
       
   144         _wanted revs expl 'revision or tag' compadd -a tags
       
   145     ;;
       
   146 
       
   147 	(parents)
       
   148 		_arguments \
       
   149         '*:revision:->revs'
       
   150         _wanted revs expl 'revision or tag' compadd -a tags
       
   151     ;;
       
   152 
       
   153 	(serve)
       
   154         _arguments \
       
   155         '-A[access log file]:log file:_files' \
       
   156         '-E[error log file]:log file:_files' \
       
   157         '-p[listen port]:listen port:' \
       
   158         '-a[interface address]:interface address:' \
       
   159         '-n[repository name]:repository name:' \
       
   160         '--stdio[for remote clients]' \
       
   161         '-t[template directory]:template dir:_files -/' \
       
   162         '--style[template style]:style' \
       
   163         '-6[use IPv6 in addition to IPv4]'
       
   164     ;;
       
   165 
       
   166 	(pull)
       
   167         repos=( $(hg paths | sed -e 's/^.*= //') )
       
   168 		_arguments \
       
   169         '-u[update working directory]' \
       
   170         '-e[ssh command]:remote commands:' \
       
   171 		'--remotecmd[remote hg command]:command:->subcmd' \
       
   172         '*:pull source:->repo'
       
   173 		_wanted source expl 'source repository' compadd -a repos
       
   174     ;;
       
   175 
       
   176 	(pull)
       
   177         repos=( $(hg paths | sed -e 's/^.*= //') )
       
   178 		_arguments \
       
   179         '-f[force push]' \
       
   180         '-e[ssh command]:remote commands:' \
       
   181 		'--remotecmd[remote hg command]:command:->subcmd' \
       
   182         '*:pull source:->repo'
       
   183 		_wanted source expl 'source repository' compadd -a repos
       
   184     ;;
       
   185 
       
   186 	(id|identify)
       
   187 	;;
       
   188 
       
   189 	(recover)
       
   190 	;;
       
   191 
       
   192 	(rawcommit)
       
   193 		_arguments \
       
   194         '-p[parent]:revision:($tags)' \
       
   195         '-d[date]:date:' \
       
   196         '-u[user]:user:' \
       
   197         '-F[file list]:file list:_files' \
       
   198         '-m[commit message]:string:' \
       
   199         '-l[commit message file]:message file:_files -g *.txt' \
       
   200         '*:files to commit:_files'
       
   201 	;;
       
   202 
       
   203 	(copy|cp)
       
   204 		_arguments \
       
   205         '-I[include path in search]:dir:_files -W $(hg root) -/' \
       
   206         '-X[exclude path in search]:dir:_files -W $(hg root) -/' \
       
   207         '-A-[record a copy after it has happened]' \
       
   208         '-f[replace destination if it exists]' \
       
   209         '-p[append source path to dest]' \
       
   210         '*:destination:'
       
   211 	;;
       
   212 
       
   213 	(rename|mv)
       
   214 		_arguments \
       
   215         '-I[include path in search]:dir:_files -W $(hg root) -/' \
       
   216         '-X[exclude path in search]:dir:_files -W $(hg root) -/' \
       
   217         '-A-[record a copy after it has happened]' \
       
   218         '-f[replace destination if it exists]' \
       
   219         '-p[append source path to dest]' \
       
   220         '*:destination:'
       
   221 	;;
       
   222 
       
   223 	(forget)
       
   224         addedFiles=( $(hg status -an) )
       
   225 		_arguments \
       
   226         '-I[include path in search]:dir:_files -W $(hg root) -/' \
       
   227         '-X[exclude path in search]:dir:_files -W $(hg root) -/'
       
   228         _wanted files expl 'newly added files' compadd -a addedFiles
       
   229 	;;
       
   230 
       
   231 	(import|patch)
       
   232 		_arguments \
       
   233         '-p[path strip (default: 1)]:count:' \
       
   234         '-f[skip check for outstanding changes]' \
       
   235         '-b[base path]:file:_files -W $(hg root)' \
       
   236         '*:patch file:_files'
       
   237 	;;
       
   238 
       
   239 	(incoming|in)
       
   240 		_arguments \
       
   241         '-p[show patch]' \
       
   242         '*:mercurial repository:_files'
       
   243 	;;
       
   244 
       
   245 	(diff)
       
   246 		_arguments \
       
   247         '-I[include path in search]:dir:_files -W $(hg root) -/' \
       
   248         '-X[exclude path in search]:dir:_files -W $(hg root) -/' \
       
   249         '-r[revision]:revision:($tags)' \
       
   250         '-a-[tread all files as text]' \
       
   251         '*:file:_files'
       
   252 	;;
       
   253 
       
   254 	(log|history)
       
   255 		_arguments \
       
   256         '-I[include path in search]:dir:_files -W $(hg root) -/' \
       
   257         '-X[exclude path in search]:dir:_files -W $(hg root) -/' \
       
   258         '-r[revision]:revision:($tags)' \
       
   259         '-b[show branches]' \
       
   260         '-p[show patch]' \
       
   261         '*:file:_files'
       
   262 	;;
       
   263 
       
   264 	(grep)
       
   265 		_arguments \
       
   266         '-I[include path in search]:dir:_files -W $(hg root) -/' \
       
   267         '-X[exclude path in search]:dir:_files -W $(hg root) -/' \
       
   268         '-0[end fields with NUL]' \
       
   269         '--all[print all revisions with matches]' \
       
   270         '-i[ignore case]' \
       
   271         '-l[print names of files and revs with matches]' \
       
   272         '-n[print line numbers]' \
       
   273         '-r[search in revision rev]:revision:($tags)' \
       
   274         '-u[print user who made change]' \
       
   275         '*:search pattern, then files:_files'
       
   276 	;;
       
   277 
       
   278 	(status)
       
   279 		_arguments \
       
   280         '-I[include path in search]:dir:_files -W $(hg root) -/' \
       
   281         '-X[exclude path in search]:dir:_files -W $(hg root) -/' \
       
   282         '-0[end filenames with NUL]' \
       
   283         '-m[show only modified files]' \
       
   284         '-a[show only added files]' \
       
   285         '-r[show only removed files]' \
       
   286         '-u[show only unknown files]' \
       
   287         '-n[hide status prefix]' \
       
   288         '*:search pattern, then files:_files'
       
   289 	;;
       
   290 
       
   291 	(locate)
       
   292 		_arguments \
       
   293         '-r[search in revision rev]:revision:($tags)' \
       
   294         '-0[end fields with NUL]' \
       
   295         '-f[print complete paths]' \
       
   296         '-I[include path in search]:dir:_files -W $(hg root) -/' \
       
   297         '-X[exclude path in search]:dir:_files -W $(hg root) -/' \
       
   298         '*:search pattern:'
       
   299 	;;
       
   300 
       
   301 	(help)
       
   302 		_wanted commands expl 'hg command' compadd -a subcmds
       
   303 	;;
       
   304 
       
   305     (root|undo|view|verify|version)
       
   306         # no arguments for these commands
       
   307     ;;
       
   308 
       
   309 	(*)
       
   310 		_message "unknown hg command completion: $service"
       
   311 	;;
       
   312 esac