| # bash completion for cmake(1) -*- shell-script -*- |
| |
| _cmake() |
| { |
| local cur prev words cword split=false |
| if type -t _init_completion >/dev/null; then |
| _init_completion -n = || return |
| else |
| # manual initialization for older bash completion versions |
| COMPREPLY=() |
| cur="${COMP_WORDS[COMP_CWORD]}" |
| prev="${COMP_WORDS[COMP_CWORD-1]}" |
| fi |
| |
| # Workaround for options like -DCMAKE_BUILD_TYPE=Release |
| local prefix= |
| if [[ $cur == -D* ]]; then |
| prev=-D |
| prefix=-D |
| cur="${cur#-D}" |
| elif [[ $cur == -U* ]]; then |
| prev=-U |
| prefix=-U |
| cur="${cur#-U}" |
| fi |
| |
| case "$prev" in |
| -D) |
| if [[ $cur == *=* ]]; then |
| # complete values for variables |
| local var type value |
| var="${cur%%[:=]*}" |
| value="${cur#*=}" |
| |
| if [[ $cur == CMAKE_BUILD_TYPE* ]]; then # most widely used case |
| COMPREPLY=( $( compgen -W 'Debug Release RelWithDebInfo |
| MinSizeRel' -- "$value" ) ) |
| return |
| fi |
| |
| if [[ $cur == *:* ]]; then |
| type="${cur#*:}" |
| type="${type%%=*}" |
| else # get type from cache if it's not set explicitly |
| type=$( cmake -LA -N 2>/dev/null | grep "$var:" \ |
| 2>/dev/null ) |
| type="${type#*:}" |
| type="${type%%=*}" |
| fi |
| case "$type" in |
| FILEPATH) |
| cur="$value" |
| _filedir |
| return |
| ;; |
| PATH) |
| cur="$value" |
| _filedir -d |
| return |
| ;; |
| BOOL) |
| COMPREPLY=( $( compgen -W 'ON OFF TRUE FALSE' -- \ |
| "$value" ) ) |
| return |
| ;; |
| STRING|INTERNAL) |
| # no completion available |
| return |
| ;; |
| esac |
| elif [[ $cur == *:* ]]; then |
| # complete types |
| local type="${cur#*:}" |
| COMPREPLY=( $( compgen -W 'FILEPATH PATH STRING BOOL INTERNAL'\ |
| -S = -- "$type" ) ) |
| compopt -o nospace |
| else |
| # complete variable names |
| COMPREPLY=( $( compgen -W '$( cmake -LA -N | tail -n +2 | |
| cut -f1 -d: )' -P "$prefix" -- "$cur" ) ) |
| compopt -o nospace |
| fi |
| return |
| ;; |
| -U) |
| COMPREPLY=( $( compgen -W '$( cmake -LA -N | tail -n +2 | |
| cut -f1 -d: )' -P "$prefix" -- "$cur" ) ) |
| return |
| ;; |
| esac |
| |
| _split_longopt && split=true |
| |
| case "$prev" in |
| -C|-P|--graphviz|--system-information) |
| _filedir |
| return |
| ;; |
| --build|--open) |
| _filedir -d |
| return |
| ;; |
| -E) |
| COMPREPLY=( $( compgen -W "$( cmake -E help |& sed -n \ |
| '/^ [^ ]/{s|^ \([^ ]\{1,\}\) .*$|\1|;p}' 2>/dev/null )" \ |
| -- "$cur" ) ) |
| return |
| ;; |
| -G) |
| local IFS=$'\n' |
| local quoted |
| printf -v quoted %q "$cur" |
| COMPREPLY=( $( compgen -W '$( cmake --help 2>/dev/null | sed -n \ |
| -e "1,/^Generators/d" \ |
| -e "/^ *[^ =]/{s|^ *\([^=]*[^ =]\).*$|\1|;s| |\\\\ |g;p}" \ |
| 2>/dev/null )' -- "$quoted" ) ) |
| return |
| ;; |
| --help-command) |
| COMPREPLY=( $( compgen -W '$( cmake --help-command-list 2>/dev/null| |
| grep -v "^cmake version " )' -- "$cur" ) ) |
| return |
| ;; |
| --help-manual) |
| COMPREPLY=( $( compgen -W '$( cmake --help-manual-list 2>/dev/null| |
| grep -v "^cmake version " | sed -e "s/([0-9])$//" )' -- "$cur" ) ) |
| return |
| ;; |
| --help-module) |
| COMPREPLY=( $( compgen -W '$( cmake --help-module-list 2>/dev/null| |
| grep -v "^cmake version " )' -- "$cur" ) ) |
| return |
| ;; |
| --help-policy) |
| COMPREPLY=( $( compgen -W '$( cmake --help-policy-list 2>/dev/null | |
| grep -v "^cmake version " )' -- "$cur" ) ) |
| return |
| ;; |
| --help-property) |
| COMPREPLY=( $( compgen -W '$( cmake --help-property-list \ |
| 2>/dev/null | grep -v "^cmake version " )' -- "$cur" ) ) |
| return |
| ;; |
| --help-variable) |
| COMPREPLY=( $( compgen -W '$( cmake --help-variable-list \ |
| 2>/dev/null | grep -v "^cmake version " )' -- "$cur" ) ) |
| return |
| ;; |
| esac |
| |
| $split && return |
| |
| if [[ "$cur" == -* ]]; then |
| COMPREPLY=( $(compgen -W '$( _parse_help "$1" --help )' -- ${cur}) ) |
| [[ $COMPREPLY == *= ]] && compopt -o nospace |
| [[ $COMPREPLY ]] && return |
| fi |
| |
| _filedir |
| } && |
| complete -F _cmake cmake |
| |
| # ex: ts=4 sw=4 et filetype=sh |