diff options
Diffstat (limited to 'completions/perl')
-rw-r--r-- | completions/perl | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/completions/perl b/completions/perl new file mode 100644 index 0000000..9823d73 --- /dev/null +++ b/completions/perl @@ -0,0 +1,146 @@ +# bash completion for perl -*- shell-script -*- + +_perl_helper() +{ + COMPREPLY=($(compgen -P "$prefix" -W \ + "$(${2:-perl} ${BASH_SOURCE[0]%/*}/../helpers/perl $1 $cur)" \ + -- "$cur")) + [[ $1 == functions ]] || __ltrim_colon_completions "$prefix$cur" +} + +_perl() +{ + local cur prev words cword + _init_completion -n : || return + + local prefix="" temp optPrefix optSuffix + + # If option not followed by whitespace, reassign prev and cur + if [[ $cur == -?* ]]; then + temp=$cur + prev=${temp:0:2} + cur=${temp:2} + if [[ $prev == -d && $cur == t* ]]; then + prev=-dt + cur=${cur:1} + fi + optPrefix=-P$prev + optSuffix=-S/ + prefix=$prev + + case $prev in + -*[DeEiFl]) + return + ;; + -*[Ix]) + local IFS=$'\n' + compopt -o filenames + COMPREPLY=($(compgen -d $optPrefix $optSuffix -- "$cur")) + return + ;; + -*[mM]) + temp="${cur#-}" + prefix+="${cur%$temp}" + cur="$temp" + _perl_helper modules $1 + return + ;; + -*V) + if [[ $cur == :* ]]; then + temp="${cur##+(:)}" + prefix+="${cur%$temp}" + local IFS=$'\n' + COMPREPLY=($(compgen -P "$prefix" -W \ + '$($1 -MConfig -e "print join \"\\n\", + keys %Config::Config" 2>/dev/null)' -- "$temp")) + __ltrim_colon_completions "$prefix$temp" + fi + return + ;; + -*d | -*dt) + if [[ $cur == :* ]]; then + temp="${cur#:}" + prefix="$prefix${cur%$temp}" + cur="Devel::$temp" + _perl_helper modules $1 + fi + ;; + esac + + # Unlike other perl options, having a space between the `-e' and + # `-E' options and their arguments, e.g. `perl -e "exit 2"', is + # valid syntax. However, the argument is neither a filename nor a + # directory, but one line of perl program, thus do not suggest + # _filedir completion. + elif [[ $prev == -e ]] || [[ $prev == -E ]]; then + return + + # Likewise, `-I' also accepts a space between option and argument + # and it takes a directory as value. + elif [[ $prev == -I ]]; then + local IFS=$'\n' + compopt -o filenames + COMPREPLY=($(compgen -d ${optPrefix-} ${optSuffix-} -- "$cur")) + return + + elif [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '-C -s -T -u -U -W -X -h -v -V -c -w -d -D -p + -n -a -F -l -0 -I -m -M -P -S -x -i -e' -- "$cur")) + else + _filedir + fi +} && + complete -F _perl perl + +_perldoc() +{ + local cur prev words cword + _init_completion -n : || return + + local prefix="" temp + + # completing an option (may or may not be separated by a space) + if [[ $cur == -?* ]]; then + temp=$cur + prev=${temp:0:2} + cur=${temp:2} + prefix=$prev + fi + + local perl="${1%doc}" + [[ $perl == "$1" ]] || ! type $perl &>/dev/null && perl= + + case $prev in + -*[hVnoMwL]) + return + ;; + -*d) + _filedir + return + ;; + -*f) + _perl_helper functions $perl + return + ;; + esac + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur")) + else + # return available modules (unless it is clearly a file) + if [[ $cur != @(*/|[.~])* ]]; then + _perl_helper perldocs $perl + if [[ $cur == p* ]]; then + COMPREPLY+=($(compgen -W \ + '$(PERLDOC_PAGER=cat "$1" -u perl | \ + command sed -ne "/perl.*Perl overview/,/perlwin32/p" | \ + awk "\$NF=2 && \$1 ~ /^perl/ { print \$1 }")' \ + -- "$cur")) + fi + fi + _filedir 'p@([lm]|od)' + fi +} && + complete -F _perldoc -o bashdefault perldoc + +# ex: filetype=sh |