Home | History | Annotate | Line # | Download | only in utils
      1 # Please add "source /path/to/bash-autocomplete.sh" to your .bashrc to use this.
      2 
      3 _clang_filedir()
      4 {
      5   # _filedir function provided by recent versions of bash-completion package is
      6   # better than "compgen -f" because the former honors spaces in pathnames while
      7   # the latter doesn't. So we use compgen only when _filedir is not provided.
      8   _filedir 2> /dev/null || COMPREPLY=( $( compgen -f ) )
      9 }
     10 
     11 _clang()
     12 {
     13   local cur prev words cword arg flags w1 w2
     14   # If latest bash-completion is not supported just initialize COMPREPLY and
     15   # initialize variables by setting manually.
     16   _init_completion -n 2> /dev/null
     17   if [[ "$?" != 0 ]]; then
     18     COMPREPLY=()
     19     cword=$COMP_CWORD
     20     cur="${COMP_WORDS[$cword]}"
     21   fi
     22 
     23   w1="${COMP_WORDS[$cword - 1]}"
     24   if [[ $cword > 1 ]]; then
     25     w2="${COMP_WORDS[$cword - 2]}"
     26   fi
     27 
     28   # Pass all the current command-line flags to clang, so that clang can handle
     29   # these internally.
     30   # '=' is separated differently by bash, so we have to concat them without ','
     31   for i in `seq 1 $cword`; do
     32     if [[ $i == $cword || "${COMP_WORDS[$(($i+1))]}" == '=' ]]; then
     33       arg="$arg${COMP_WORDS[$i]}"
     34     else
     35       arg="$arg${COMP_WORDS[$i]},"
     36     fi
     37   done
     38 
     39   # expand ~ to $HOME
     40   eval local path=${COMP_WORDS[0]}
     41   # Use $'\t' so that bash expands the \t for older versions of sed.
     42   flags=$( "$path" --autocomplete="$arg" 2>/dev/null | sed -e $'s/\t.*//' )
     43   # If clang is old that it does not support --autocomplete,
     44   # fall back to the filename completion.
     45   if [[ "$?" != 0 ]]; then
     46     _clang_filedir
     47     return
     48   fi
     49 
     50   # When clang does not emit any possible autocompletion, or user pushed tab after " ",
     51   # just autocomplete files.
     52   if [[ "$flags" == "$(echo -e '\n')" ]]; then
     53     # If -foo=<tab> and there was no possible values, autocomplete files.
     54     [[ "$cur" == '=' || "$cur" == -*= ]] && cur=""
     55     _clang_filedir
     56   elif [[ "$cur" == '=' ]]; then
     57     COMPREPLY=( $( compgen -W "$flags" -- "") )
     58   else
     59     # Bash automatically appends a space after '=' by default.
     60     # Disable it so that it works nicely for options in the form of -foo=bar.
     61     [[ "${flags: -1}" == '=' ]] && compopt -o nospace 2> /dev/null
     62     COMPREPLY=( $( compgen -W "$flags" -- "$cur" ) )
     63   fi
     64 }
     65 complete -F _clang clang
     66