Created
March 22, 2012 11:38
-
-
Save JoeWoodward/2157842 to your computer and use it in GitHub Desktop.
Git auto-complete script for wrapping aliases. Insert into .bash_profile below anything git related
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 | |
" Add the git-completion.bash file to this path. | |
" You can modify if you want to go somewhere else just change the two paths below | |
export PATH="/usr/local/bin:$PATH" | |
source /usr/local/bin/git-completion.bash |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment