#! /bin/bash # This is just a bootstrap file for the .d folder. Don't put anything meaninguful here. __bashrc_debug_startup=${__bashrc_debug_startup:-0} if ((_bashrc_debug_startup)) ; then PS4='+ $EPOCHREALTIME\011 ' exec 3>&2 2>/tmp/bashstart.$$.log set -x fi function rlbashrc { source "$HOME/.bashrc" } function getmac { echo 00:$(head -c5 /dev/urandom | hexdump -e '"%02x"' | sed -r 's/(..)/\1:/g;s/:$//;') } function find { if which gfind &>/dev/null ; then gfind "$@" else command find "$@" fi } function readlink { if which greadlink &>/dev/null ; then greadlink "$@" else command readlink "$@" fi } __bashrc_debug_order=${__bashrc_debug_order:-0} # This is here so we don't have to modify the distro provided bashrc. if [ -d "$HOME/.bashrc.d" ] ; then while read FILE ; do if ((__bashrc_debug_order > 0)) ; then echo "$FILE" fi . "$FILE" # It's a bit stupid that I need to do this. done < <( find "$HOME/.bashrc.d/." -maxdepth 1 -type f -executable | sort ) fi # For secrets and commands we don't want to commit to git. if [ -d "$HOME/.bashrc.local.d" ] ; then while read FILE ; do . "$FILE" done < <( find "$HOME/.bashrc.local.d/." -type f -executable | sort ) fi export EDITOR='vim' # 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 local completion IFS= read -r num_alias_arguments < <(wc -w <<< "$alias_arguments") # The completion currently being used for the aliased command. IFS= read -r 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. grep -q -- -F <<< "$completion" || 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 if ((_bashrc_debug_startup)) ; then set +x exec 2>&3 3>&- fi