# ri completion for Ruby documentation -*- shell-script -*- # by Ian Macdonald proc _ri_get_methods { var regex = '' if [[ $ri_version == integrated ]] { if [[ -z $separator ]] { set regex = '"(Instance|Class)'" } elif [[ $separator == "#" ]] { set regex = 'Instance' } else { set regex = 'Class' } setglobal COMPREPLY = '( \ '"$( ri ${classes[@]} 2>/dev/null | ruby -ane \ 'if /^'"$regex"' methods:/.../^------------------|^$/ and \ /^ / then print $_.split(/, |,$/).grep(/^[^\[]*$/).join("\n"); \ end' 2>/dev/null | sort -u )" ) } else { # older versions of ri didn't distinguish between class/module and # instance methods setglobal COMPREPLY = '( \ '"$( ruby -W0 $ri_path ${classes[@]} | ruby -ane \ 'if /^-/.../^-/ and ! /^-/ and ! /^ +(class|module): / then \ print $_.split(/, |,$| +/).grep(/^[^\[]*$/).join("\n"); \ end' | sort -u )" ) } setglobal COMPREPLY = '( '$( compgen $prefix -W '${COMPREPLY[@]}' -- $method ) ) } # needs at least Ruby 1.8.0 in order to use -W0 proc _ri { var cur = '', prev = '', words = '', cword = '' _init_completion -n : || return var class = '', method = '', prefix = '', ri_path = '', ri_version = '', ri_major = '', separator = '', IFS = '' var -a classes = '' set ri_path = $[type -p ri] # which version of ri are we using? # -W0 is required here to stop warnings from older versions of ri # from being captured when used with Ruby 1.8.1 and later set ri_version = $[ruby -W0 $ri_path -v !2 > !1] || set ri_version = 'integrated' [[ $ri_version != ${ri_version%200*} ]] && set ri_version = 'integrated' [[ $ri_version =~ ri[[:space:]]v?([0-9]+) ]] && set ri_major = $(BASH_REMATCH[1]) # need to also split on commas set IFS = '$', \n\t'' if [[ "$cur" == [A-Z]*[#.]* ]] { [[ "$cur" == *#* ]] && set separator = '#' || set separator = '.' # we're completing on class and method set class = $(cur%$separator*) set method = $(cur#*$separator) set classes = '( '$class ) set prefix = ""-P $class$separator"" _ri_get_methods return 0 } if [[ $ri_version == integrated ]] { # integrated ri from Ruby 1.9 set classes = '( '$( ri -c 2>/dev/null | ruby -ne 'if /^\s*$/..$stdin.eof then \ if /, [A-Z]+/ then print; end; end' 2>/dev/null ) ) } elif [[ $ri_major && $ri_major -ge 3 ]] { set classes = '( '$( ri -l 2>/dev/null ) ) } elif [[ $ri_version == "ri 1.8a" ]] { set classes = '( '$( ruby -W0 $ri_path | \ ruby -ne 'if /^'"'"'ri'"'"' has/..$stdin.eof then \ if /^ .*[A-Z]/ then print; end; end' )) } else { set classes = '( '$( ruby -W0 $ri_path | \ ruby -ne 'if /^I have/..$stdin.eof then \ if /^ .*[A-Z]/ then print; end; end' )) } setglobal COMPREPLY = '( '$( compgen -W '${classes[@]}' -- "$cur" ) ) __ltrim_colon_completions $cur if [[ "$cur" == [A-Z]* ]] { # we're completing on class or module alone return 0 } # we're completing on methods set method = $cur _ri_get_methods } && complete -F _ri ri # ex: ts=4 sw=4 et filetype=sh