summaryrefslogtreecommitdiffstats
path: root/completions/ri
diff options
context:
space:
mode:
Diffstat (limited to 'completions/ri')
-rw-r--r--completions/ri120
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