mirror of
https://github.com/Gator96100/ProxSpace.git
synced 2025-03-12 04:36:22 -07:00
121 lines
3.6 KiB
Bash
121 lines
3.6 KiB
Bash
# 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
|