summaryrefslogtreecommitdiffstats
path: root/completions/ri
diff options
context:
space:
mode:
Diffstat (limited to 'completions/ri')
-rw-r--r--completions/ri101
1 files changed, 53 insertions, 48 deletions
diff --git a/completions/ri b/completions/ri
index 9c34b27..514bf6d 100644
--- a/completions/ri
+++ b/completions/ri
@@ -1,110 +1,116 @@
# ri completion for Ruby documentation -*- shell-script -*-
# by Ian Macdonald <ian@caliban.org>
-_ri_get_methods()
+# @var[in] ri_version
+# @var[in] prefix
+# @var[in] classes
+_comp_cmd_ri__compgen_methods()
{
- local regex
+ local _regex
+ local IFS=$' \t\n' # needed for ${classes[@]+"${classes[@]}"} in bash-5.2
+ local _methods
if [[ $ri_version == integrated ]]; then
- if [[ -z $separator ]]; then
- regex="(Instance|Class)"
+ if [[ ! $separator ]]; then
+ _regex="(Instance|Class)"
elif [[ $separator == "#" ]]; then
- regex=Instance
+ _regex=Instance
else
- regex=Class
+ _regex=Class
fi
- COMPREPLY+=(
- "$(ri "${classes[@]}" 2>/dev/null | ruby -ane \
- 'if /^'"$regex"' methods:/.../^------------------|^$/ and \
+ _comp_split -la _methods \
+ "$(ri ${classes[@]+"${classes[@]}"} 2>/dev/null | ruby -ane \
+ 'if /^'"$_regex"' methods:/.../^------------------|^$/ and \
/^ / then print $_.split(/, |,$/).grep(/^[^\[]*$/).join("\n"); \
- end' 2>/dev/null | sort -u)")
+ 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 \
+ _comp_split -la _methods \
+ "$(ruby -W0 "$ri_path" ${classes[@]+"${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))
+ end' | sort -u)"
+ fi &&
+ _comp_compgen -- -P "$prefix" -W '"${_methods[@]}"'
}
# needs at least Ruby 1.8.0 in order to use -W0
-_ri()
+_comp_cmd_ri()
{
- local cur prev words cword split
- _init_completion -s -n : || return
+ local cur prev words cword was_split comp_args
+ _comp_initialize -s -n : -- "$@" || return
+ local noargopts='!(-*|*[wfd]*)'
+ # shellcheck disable=SC2254
case $prev in
- --help | --width | -!(-*)[hw])
+ --help | --width | -${noargopts}[hw])
return
;;
- --format | -!(-*)f)
- COMPREPLY=($(compgen -W 'ansi bs html rdoc' -- "$cur"))
+ --format | -${noargopts}f)
+ _comp_compgen -- -W 'ansi bs html rdoc'
return
;;
- --doc-dir | -!(-*)d)
- _filedir -d
+ --doc-dir | -${noargopts}d)
+ _comp_compgen_filedir -d
return
;;
--dump)
- _filedir ri
+ _comp_compgen_filedir ri
return
;;
esac
- $split && return
+ [[ $was_split ]] && return
if [[ $cur == -* ]]; then
- COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur"))
+ _comp_compgen_help
[[ ${COMPREPLY-} == *= ]] && compopt -o nospace
return
fi
- local class method prefix ri_path ri_version ri_major separator IFS
+ local class method prefix="" ri_path ri_version ri_major="" separator
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="$(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
+ class=${cur%"$separator"*}
+ method=${cur#*"$separator"}
+ _comp_split -F $', \n\t' classes "$class"
+ prefix=$class$separator
+ _comp_compgen -c "$method" -i ri 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))
+ _comp_split -F $', \n\t' 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))
+ _comp_split -F $', \n\t' classes "$(ri -l 2>/dev/null)"
elif [[ $ri_version == "ri 1.8a" ]]; then
- classes=($(ruby -W0 $ri_path |
+ _comp_split -F $', \n\t' classes "$(ruby -W0 "$ri_path" |
ruby -ne 'if /^'"'"'ri'"'"' has/..$stdin.eof then \
- if /^ .*[A-Z]/ then print; end; end'))
+ if /^ .*[A-Z]/ then print; end; end')"
else
- classes=($(ruby -W0 $ri_path |
+ _comp_split -F $', \n\t' 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 /^ .*[A-Z]/ then print; end; end')"
+ fi &&
+ _comp_compgen -- -W '"${classes[@]}"'
+ _comp_ltrim_colon_completions "$cur"
if [[ $cur == [A-Z]* ]]; then
# we're completing on class or module alone
@@ -112,9 +118,8 @@ _ri()
fi
# we're completing on methods
- method=$cur
- _ri_get_methods
+ _comp_cmd_ri__compgen_methods
} &&
- complete -F _ri ri
+ complete -F _comp_cmd_ri ri
# ex: filetype=sh