dotfiles/.bash_aliases

132 lines
3.9 KiB
Bash
Raw Normal View History

2025-01-24 10:01:12 +01:00
#! /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