diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-11-19 12:07:09 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-11-19 12:07:09 +0000 |
commit | 91c0ff4f7d28856645b72d09f58dbabfa5e862ad (patch) | |
tree | 3df4b21c3dd67b8969019c7dd190bddc142cb11a /lib/optparse.rb | |
parent | 67f3280cfe75391f97bb342da10186fa190373b2 (diff) | |
download | ruby-91c0ff4f7d28856645b72d09f58dbabfa5e862ad.tar.gz |
* lib/optparse.rb: shell completion support for zsh. based on
<http://d.hatena.ne.jp/rubikitch/20071002/zshcomplete>
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29834 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/optparse.rb')
-rw-r--r-- | lib/optparse.rb | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/optparse.rb b/lib/optparse.rb index e36b52f7ec..b21bd935c7 100644 --- a/lib/optparse.rb +++ b/lib/optparse.rb @@ -441,6 +441,24 @@ class OptionParser (long.first || short.first).sub(/\A-+(?:\[no-\])?/, '') end + def compsys(sdone, ldone) # :nodoc: + sopts, lopts, s = [], [], nil + @short.each {|s| sdone.fetch(s) {sopts << s}; sdone[s] = true} if @short + @long.each {|s| ldone.fetch(s) {lopts << s}; ldone[s] = true} if @long + return if sopts.empty? and lopts.empty? # completely hidden + + (sopts+lopts).each do |opt| + # "(-x -c -r)-l[left justify]" \ + if opt =~ /^--\[no-\](.+)$/ + o = $1 + yield("--#{o}", desc.join("")) + yield("--no-#{o}", desc.join("")) + else + yield("#{opt}", desc.join("")) + end + end + end + # # Switch that takes no arguments. # @@ -679,6 +697,14 @@ class OptionParser end to end + + def compsys(*args, &block) # :nodoc: + list.each do |opt| + if opt.respond_to?(:compsys) + opt.compsys(*args, &block) + end + end + end end # @@ -725,6 +751,24 @@ class OptionParser DefaultList.short['-'] = Switch::NoArgument.new {} DefaultList.long[''] = Switch::NoArgument.new {throw :terminate} + + COMPSYS_HEADER = <<'XXX' # :nodoc: + +typeset -A opt_args +local context state line + +_arguments -s -S \ +XXX + + def compsys(to, name = File.basename($0)) # :nodoc: + to << "#compdef #{name}\n" + to << COMPSYS_HEADER + visit(:compsys, {}, {}) {|o, d| + to << %Q[ "#{o}[#{d.gsub(/\"/, '\"')}]" \\\n] + } + to << " '*:file:_files' && return 0\n" + end + # # Default options for ARGV, which never appear in option summary. # @@ -737,11 +781,16 @@ class OptionParser # --help=complete=WORD # Shows candidates for command line completion. # + # --help=zshcomplete[=NAME:FILE] + # Creates zsh completion file. + # Officious['help'] = proc do |parser| Switch::OptionalArgument.new do |arg| case arg when /\Acomplete=(.*)/ puts parser.candidate($1) + when /\Azshcomplete(?:=(.+))?/ + parser.compsys(STDOUT, $1) else puts parser.help end |