131 lines
3.9 KiB
Bash
131 lines
3.9 KiB
Bash
#! /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
|