diff options
Diffstat (limited to '')
-rw-r--r-- | completions/ri | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/completions/ri b/completions/ri new file mode 100644 index 0000000..9c34b27 --- /dev/null +++ b/completions/ri @@ -0,0 +1,120 @@ +# ri completion for Ruby documentation -*- shell-script -*- +# by Ian Macdonald <ian@caliban.org> + +_ri_get_methods() +{ + local regex + + if [[ $ri_version == integrated ]]; then + if [[ -z $separator ]]; then + regex="(Instance|Class)" + elif [[ $separator == "#" ]]; then + regex=Instance + else + regex=Class + fi + + 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 + COMPREPLY+=( + "$(ruby -W0 $ri_path "${classes[@]}" 2>/dev/null | ruby -ane \ + 'if /^-/.../^-/ and ! /^-/ and ! /^ +(class|module): / then \ + print $_.split(/, |,$| +/).grep(/^[^\[]*$/).join("\n"); \ + end' | sort -u)") + fi + COMPREPLY=($(compgen $prefix -W '${COMPREPLY[@]}' -- $method)) +} + +# needs at least Ruby 1.8.0 in order to use -W0 +_ri() +{ + local cur prev words cword split + _init_completion -s -n : || return + + case $prev in + --help | --width | -!(-*)[hw]) + return + ;; + --format | -!(-*)f) + COMPREPLY=($(compgen -W 'ansi bs html rdoc' -- "$cur")) + return + ;; + --doc-dir | -!(-*)d) + _filedir -d + return + ;; + --dump) + _filedir ri + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + local class method prefix ri_path ri_version ri_major separator IFS + local -a classes + + 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 + ri_version="$(ruby -W0 $ri_path -v 2>&1)" || ri_version=integrated + [[ $ri_version != "${ri_version%200*}" ]] && ri_version=integrated + [[ $ri_version =~ ri[[:space:]]v?([0-9]+) ]] && ri_major=${BASH_REMATCH[1]} + + # need to also split on commas + IFS=$', \n\t' + if [[ $cur == [A-Z]*[#.]* ]]; then + [[ $cur == *#* ]] && separator=# || separator=. + # we're completing on class and method + class=${cur%$separator*} + method=${cur#*$separator} + classes=($class) + prefix="-P $class$separator" + _ri_get_methods + return + fi + + if [[ $ri_version == integrated ]]; then + # integrated ri from Ruby 1.9 + 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 ]]; then + classes=($(ri -l 2>/dev/null)) + elif [[ $ri_version == "ri 1.8a" ]]; then + classes=($(ruby -W0 $ri_path | + ruby -ne 'if /^'"'"'ri'"'"' has/..$stdin.eof then \ + if /^ .*[A-Z]/ then print; end; end')) + else + classes=($(ruby -W0 $ri_path | + ruby -ne 'if /^I have/..$stdin.eof then \ + if /^ .*[A-Z]/ then print; end; end')) + fi + + COMPREPLY=($(compgen -W '${classes[@]}' -- "$cur")) + __ltrim_colon_completions "$cur" + + if [[ $cur == [A-Z]* ]]; then + # we're completing on class or module alone + return + fi + + # we're completing on methods + method=$cur + _ri_get_methods +} && + complete -F _ri ri + +# ex: filetype=sh |