diff options
Diffstat (limited to 'completions/ri')
-rw-r--r-- | completions/ri | 101 |
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 |