166 lines
5.4 KiB
Bash
166 lines
5.4 KiB
Bash
# 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 2>/dev/null |
|
|
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|--install|--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
|
|
;;
|
|
--loglevel)
|
|
COMPREPLY=( $(compgen -W 'error warning notice status verbose debug trace' -- $cur ) )
|
|
;;
|
|
--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
|