#compdef ruby irb erb ruby-mri -P (ruby|[ei]rb)[0-9.]# -value-,RUBY(LIB|OPT|PATH),-default-
local curcontext="$curcontext" state line expl desc RUBY ret=1
typeset -A opt_args
local -a opts irb erb all common charsets suf
all=(
'*-r+[require the library before executing your script]:library name:->library'
'(--internal-encoding)-U[set internal encoding to UTF-8]'
'(-E --encoding -K --external-encoding)'{-E+,--encoding=}'[specify default external and internal character encodings]:charset:->charsets'
'(1 * -)'{-h,--help}'[print help message]'
'(1 * -)--version[print the version]'
)
common=(
'*-I+[specify $LOAD_PATH directory (may be used more than once)]:library directory:_files -/'
'-w[turn warnings on for your script]'
'-W-[set warning level]:warning level:((0\:silent 1\:medium 2\:verbose))'
'(-)1:ruby script:_files -g "*.rb(-.)"'
'*::script argument:= ->normal'
)
opts=(
'-0-[specify record separator]:input record separator in octal [default \0]'
'-a[autosplit mode with -n or -p (splits $_ into $F)]'
'-c[check syntax only]'
'-C+[cd to directory before executing your script]:directory:_files -/'
'(-d --debug)'{-d,--debug}'[set debugging flags (set $DEBUG to true)]'
"(1)*-e+[one line script (several -e's allowed, omit program file)]:one line of script"
'-F-[split() pattern for autosplit (-a)]:input field separator:'
'-i-[edit ARGV files in place (make backup if extension supplied)]:suffix for in-place-edit mode:(.bak)'
'-K-[specifies KANJI (Japanese) code-set]:KANJI encoding:((e\:EUC-JP s\:Shift_JIS u\:UTF-8 N\:None))'
"-l[assume 'while gets(); ... end' loop around your script]"
"(-p)-n[assume 'while gets(); ... end' loop around your script]"
'(-n)-p[assume loop like -n but print line also like sed]'
'-s[enable some switch parsing for switches after script name]'
'-S[look for the script using PATH environment variable]'
'-T-[turn on tainting checks]::taint level [1]:((0\:strings\ from\ streams/environment/ARGV\ are\ tainted 1\:no\ dangerous\ operation\ by\ tainted\ value 2\:process/file\ operations\ prohibited 3\:all\ generated\ objects\ are\ tainted 4\:no\ global\ \(non-tainted\)\ variable\ modification/no\ direct\ output))'
'(-v --verbose)'{-v,--verbose}'[print version number, then turn on verbose mode]'
'-x-[strip off text before #!ruby line and perhaps cd to directory]:directory:_files -/'
'(1 * -)--copyright[print the copyright]'
--{en,dis}'able=[enable or disable features]:feature:(gems did_you_mean rubyopt frozen_string_literal all)'
\!--{en,dis}able-{gems,rubyopt,all}
'--dump=[dump debug information]:information:_sequence compadd - insns yydebug parsetree parsetree_with_comment'
--{external,internal}'-encoding=:charset:->charsets'
'!'{-y,--yydebug}
'!--dump=:target:(version copyright usage yydebug syntax parsetree parsetree_with_comment insns)'
)
irb=(
'-f[suppress read of ~/.irbrc]'
'(--noinspect)-m[bc mode (load mathn, fraction, matrix)]'
$opts[(r)*-d\[*]
'(--noinspect)--inspect[use inspect for output]'
"(--inspect)--noinspect[don't use inspect for output]"
'(--noreadline)--readline[use readline extension]'
"(--readline)--noreadline[don't use readline extension]"
'(--prompt --prompt-mode --inf-ruby-mode --simple-prompt --noprompt)'{--prompt,--prompt-mode}'[switch prompt mode]:prompt mode:(default simple xmp inf-ruby)'
'(--prompt --prompt-mode --inf-ruby-mode --simple-prompt --noprompt)'{--inf-ruby-mode,--simple-prompt,--noprompt}
'--tracer[display trace for each command execution]'
'--back-trace-limit[set limit for backtraces]:limit [16]:'
'!--irb_debug:level'
'--context-mode:n'
'(--noecho)--echo[show result]'
"(--echo)--noecho[don't show result]"
'--single-irb[share self with sub-irb]'
'(--noverbose)--verbose[show details]'
"(--verbose)--noverbose[don't show details]"
)
erb=(
"-P[don't evaluate lines which start with %]"
'-S[specify safe level for running script]:level:(1 2 3 4)'
'-T[specify trim mode]:mode [0]:((0\:EOL\ remains 1\:EOL\ removed\ if\ line\ ends\ with\ %\> 2\:EOL\ removed\ if\ line\ starts\ with\ \<%\ and\ ends\ with\ %\> -\:EOL\ is\ removed\ if\ line\ ends\ with\ -%\>,\ leading\ whitespace\ removed\ after\ \<%-))'
'(-d --debug)'{-d,--debug}'[set debugging flags (set $DEBUG to true)]'
'-n[used with -x, prepends line number to output]'
'-x[convert eRuby to Ruby]'
)
case "$service" in
*RUBY(LIB|PATH)*)
_dir_list && return 0
;;
*RUBYOPT*)
compset -q
words=( fake "$words[@]" )
(( CURRENT++ ))
_arguments -C -s : "${(@M)opts:#*-[IdvwrK](|[-+])\[*}" && ret=0
RUBY=ruby
;;
ruby[0-9.]#)
RUBY=$words[1]
_arguments -C -s -S : $opts $all $common && ret=0
;;
irb[0-9.]#)
RUBY=${words[1]/irb/ruby}
_arguments -C -s : $irb $all $common && ret=0
;;
erb[0-9.]#)
RUBY=${words[1]/erb/ruby}
_arguments -C -s : $erb $all \
'*:erb file:_files -g "*.erb(-.)"' && ret=0
;;
esac
case "$state" in
normal)
if (( ! $+opt_args[-e] )); then
shift words
(( CURRENT-- ))
fi
_normal && ret=0
;;
charsets)
charsets=( $(_call_program charsets $RUBY -e 'puts\ Encoding.list' 2>/dev/null) )
# could also add Encoding.aliases.map(&:first) for aliases
desc='charset'
if [[ $curcontext = *option-(E|-encoding)-1 ]]; then
if compset -P '*:'; then
desc='internal charset'
else
desc='external charset'
compset -S ':*' || suf=( -S: )
fi
fi
_wanted charsets expl $desc compadd $suf -a charsets && ret=0
;;
library)
local -a dirs
dirs=( $(_call_program libraries $RUBY -e 'puts\ \$:' 2>/dev/null) ${(s.:.)opt_args[-I]} )
_wanted libraries expl library _path_files -W dirs && ret=0
;;
esac
return ret