# gcc(1) completion -*- shell-script -*- _gcc() { local cur prev prev2 words cword argument prefix prefix_length _init_completion || return # Test that GCC is recent enough and if not fallback to # parsing of --completion option. if ! $1 --completion=" " 2>/dev/null; then if [[ $cur == -* ]]; then local cc=$($1 -print-prog-name=cc1 2>/dev/null) [[ $cc ]] || return COMPREPLY=($(compgen -W "$($cc --help 2>/dev/null | tr '\t' ' ' | command sed -e '/^ *-/!d' -e 's/ *-\([^][ <>]*\).*/-\1/')" \ -- "$cur")) [[ ${COMPREPLY-} == *= ]] && compopt -o nospace else _filedir fi return fi # extract also for situations like: -fsanitize=add if ((cword > 2)); then prev2="${COMP_WORDS[cword - 2]}" fi # sample: -fsan if [[ $cur == -* ]]; then argument=$cur prefix="" # sample: -fsanitize= elif [[ $cur == "=" && $prev == -* ]]; then argument=$prev$cur prefix=$prev$cur # sample: -fsanitize=add elif [[ $prev == "=" && $prev2 == -* ]]; then argument=$prev2$prev$cur prefix=$prev2$prev # sample: --param lto- elif [[ $prev == --param ]]; then argument="$prev $cur" prefix="$prev " fi if [[ ! -v argument ]]; then _filedir else # In situation like '-fsanitize=add' $cur is equal to last token. # Thus we need to strip the beginning of suggested option. prefix_length=$((${#prefix} + 1)) local flags=$($1 --completion="$argument" | cut -c $prefix_length-) [[ ${flags} == "=*" ]] && compopt -o nospace 2>/dev/null COMPREPLY=($(compgen -W "$flags" -- "")) fi } && complete -F _gcc gcc{,-5,-6,-7,-8} g++{,-5,-6,-7,-8} g77 g95 \ gccgo{,-5,-6,-7,-8} gcj gfortran{,-5,-6,-7,-8} gpc && { cc --version 2>/dev/null | command grep -q GCC || [[ $(_realcommand cc) == *gcc* ]] && complete -F _gcc cc || complete -F _minimal cc c++ --version 2>/dev/null | command grep -q GCC || [[ $(_realcommand c++) == *g++* ]] && complete -F _gcc c++ || complete -F _minimal c++ f77 --version 2>/dev/null | command grep -q GCC || [[ $(_realcommand f77) == *gfortran* ]] && complete -F _gcc f77 || complete -F _minimal f77 f95 --version 2>/dev/null | command grep -q GCC || [[ $(_realcommand f95) == *gfortran* ]] && complete -F _gcc f95 || complete -F _minimal f95 } # ex: filetype=sh