How do I get bash completion to work with aliases? How do I get bash completion to work with aliases? unix unix

How do I get bash completion to work with aliases?


As stated in the comments above,

complete -o default -o nospace -F _git_checkout gco

will no longer work. However, there's a __git_complete function in git-completion.bash which can be used to set up completion for aliases like so:

__git_complete gco _git_checkout


I ran into this problem as well and came up with this code snippet. This will automatically give you completion for all aliases. Run it after declaring all (or any) alias.

# wrap_alias takes three arguments:# $1: The name of the alias# $2: The command used in the alias# $3: The arguments in the alias all in one string# Generate a wrapper completion function (completer) for an alias# based on the command and the given arguments, if there is a# completer for the command, and set the wrapper as the completer for# the alias.function wrap_alias() {  [[ "$#" == 3 ]] || return 1  local alias_name="$1"  local aliased_command="$2"  local alias_arguments="$3"  local num_alias_arguments=$(echo "$alias_arguments" | wc -w)  # The completion currently being used for the aliased command.  local completion=$(complete -p $aliased_command 2> /dev/null)  # Only a completer based on a function can be wrapped so look for -F  # in the current completion. This check will also catch commands  # with no completer for which $completion will be empty.  echo $completion | grep -q -- -F || return 0  local namespace=alias_completion::  # Extract the name of the completion function from a string that  # looks like: something -F function_name something  # First strip the beginning of the string up to the function name by  # removing "* -F " from the front.  local completion_function=${completion##* -F }  # Then strip " *" from the end, leaving only the function name.  completion_function=${completion_function%% *}  # Try to prevent an infinite loop by not wrapping a function  # generated by this function. This can happen when the user runs  # this twice for an alias like ls='ls --color=auto' or alias l='ls'  # and alias ls='l foo'  [[ "${completion_function#$namespace}" != $completion_function ]] && return 0  local wrapper_name="${namespace}${alias_name}"  eval "function ${wrapper_name}() {  let COMP_CWORD+=$num_alias_arguments  args=( \"${alias_arguments}\" )  COMP_WORDS=( $aliased_command \${args[@]} \${COMP_WORDS[@]:1} )  $completion_function  }"  # To create the new completion we use the old one with two  # replacements:  # 1) Replace the function with the wrapper.  local new_completion=${completion/-F * /-F $wrapper_name }  # 2) Replace the command being completed with the alias.  new_completion="${new_completion% *} $alias_name"  eval "$new_completion"}# For each defined alias, extract the necessary elements and use them# to call wrap_alias.eval "$(alias -p | sed -e 's/alias \([^=][^=]*\)='\''\([^ ][^ ]*\) *\(.*\)'\''/wrap_alias \1 \2 '\''\3'\'' /')"unset wrap_alias


In git-completion.bash there is a line:

complete -o default -o nospace -F _git git

Looking at that line (and the _git function) you can add this line to your .bash_profile:

complete -o default -o nospace -F _git_checkout gco