510 lines
14 KiB
Bash
510 lines
14 KiB
Bash
#!/bin/bash
|
||
|
||
### Opts ###
|
||
ulimit -n 10000 # Allows for more open files
|
||
|
||
# shellcheck source=./.zstyle
|
||
source ~/.zstyle
|
||
|
||
. "$HOME/.cargo/env"
|
||
|
||
### Pathing ###
|
||
|
||
export PATH="$HOME/.bin:$PATH"
|
||
export PATH="$PATH:/opt/homebrew/Cellar/llvm/13.0.0_2/bin"
|
||
|
||
# Python with pyenv
|
||
export PYENV_ROOT="${HOME}/.pyenv"
|
||
export PATH="${PATH}:${PYENV_ROOT}/bin"
|
||
eval "$(pyenv init -)"
|
||
|
||
# Mac pathing beneath
|
||
if [[ "$OSTYPE" = "darwin"* ]]; then
|
||
export PATH="/opt/homebrew/opt/coreutils/libexec/gnubin:$PATH"
|
||
export PATH="/opt/homebrew/opt/gnu-sed/libexec/gnubin:$PATH"
|
||
export PATH="/Applications/Firefox Developer Edition.app/Contents/MacOS:$PATH"
|
||
export PATH="$HOME/.rustup/toolchains/stable-aarch64-apple-darwin/bin:$PATH"
|
||
export MANPATH="/opt/homebrew/opt/coreutils/libexec/gnuman:$MANPATH"
|
||
|
||
complete -o nospace -C /opt/homebrew/bin/terraform terraform
|
||
|
||
# LLDB
|
||
export PATH="/opt/homebrew/opt/llvm/bin:$PATH"
|
||
fi
|
||
|
||
### OPTS ###
|
||
setopt extendedglob
|
||
setopt nullglob
|
||
|
||
### Environment Variables ###
|
||
export LANG=en_US.UTF-8
|
||
if [[ -f "/usr/libexec/java_home" ]]; then
|
||
export JAVA_HOME="$(/usr/libexec/java_home)"
|
||
fi
|
||
export AWS_CLI_AUTO_PROMPT=on
|
||
export ZSH_HIGHLIGHT_MAXLENGTH=10000
|
||
export ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=2
|
||
export LANG=en_US.UTF-8
|
||
export NOTES_DIR="$HOME/.notes"
|
||
export DOCKER_BUILDKIT=1
|
||
|
||
# Fzf Variables
|
||
export FZF_DEFAULT_COMMAND='fd --hidden --exclude .git --color=always'
|
||
export FZF_DEFAULT_OPTS="--height=80% --layout=reverse --info=inline --border --margin=1 --padding=1 --ansi"
|
||
export FZF_CTRL_T_COMMAND="${FZF_DEFAULT_COMMAND}"
|
||
|
||
# Gitlab
|
||
export GITLAB_HOST="https://gitlab.orion-technologies.io"
|
||
|
||
if command -v nvim >/dev/null 2>&1; then
|
||
export EDITOR=nvim
|
||
export VISUAL=nvim
|
||
export MANPAGER="nvim +Man!"
|
||
elif command -v vim >/dev/null 2>&1; then
|
||
export EDITOR=vim
|
||
export VISUAL=vim
|
||
else
|
||
export EDITOR=vi
|
||
export VISUAL=less
|
||
fi
|
||
|
||
### Terminal Specific Configuration ###
|
||
# If using the kitty terminal we want to set our TERM var to be xterm as kitty will send
|
||
# kitty-xterm which causes a fucking headache and a half due to ncurses not containing
|
||
# that by default
|
||
if [[ "$TERM" = *"xterm-kitty"* ]]; then
|
||
alias ssh="TERM=xterm-256color ssh"
|
||
alias icat="kitty +kitten icat"
|
||
__kitty_complete
|
||
fi
|
||
|
||
if [[ "${TERM}" = "wezterm" ]]; then
|
||
alias ssh="TERM=xterm-256color ssh"
|
||
fi
|
||
|
||
### Zsh Vi-Mode Configuration ###
|
||
|
||
# Makes the cursor change based on the mode
|
||
export VI_MODE_SET_CURSOR=true
|
||
# Set the editor to neovim for visual mode
|
||
export ZVM_VI_EDITOR="$EDITOR"
|
||
# This ensures that fzf completion works
|
||
zvm_after_init_commands+=('[[ -r ~/.fzf.zsh ]] && source ~/.fzf.zsh')
|
||
|
||
### Aliases ###
|
||
|
||
## Exa ls Replacement Configuration ##
|
||
if command -v exa >/dev/null 2>&1; then
|
||
alias ls="exa --icons --group --group-directories-first --octal-permissions"
|
||
alias l="ls -alh"
|
||
alias ll="l"
|
||
alias tree="ls --tree"
|
||
fi
|
||
|
||
## Git Aliases ##
|
||
if command -v git >/dev/null 2>&1; then
|
||
alias gc="git commit"
|
||
alias gcm="git commit -m"
|
||
alias ga="git add"
|
||
alias gp="git push"
|
||
alias gb="git branch"
|
||
alias gco="git checkout"
|
||
alias gpl="git pull"
|
||
alias gs="git status"
|
||
alias gst="git stash"
|
||
alias gstc="git stash clear"
|
||
alias gsw="git switch"
|
||
alias gd="git diff"
|
||
alias gr="git remote"
|
||
alias gl="git log"
|
||
alias gw="git worktree"
|
||
alias gwa="git worktree add"
|
||
alias gwr="git worktree remove"
|
||
alias git-remote="git config --get remote.origin.url"
|
||
alias gbc="git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'"
|
||
fi
|
||
|
||
gbf() {
|
||
local remote
|
||
local default_branch
|
||
remote="${1:=origin}"
|
||
default_branch="$(git remote show "$remote" | awk '/HEAD branch/ {print $NF}')"
|
||
git fetch "$remote" "$default_branch":"$default_branch"
|
||
}
|
||
## Mac Specific Aliases ##
|
||
if [[ "$OSTYPE" = "darwin"* ]]; then
|
||
alias c="pbcopy"
|
||
alias p="pbpaste"
|
||
alias grep="ggrep"
|
||
alias find="gfind"
|
||
alias sed="gsed"
|
||
fi
|
||
|
||
## Neovim Aliases ##
|
||
if command -v nvim >/dev/null 2>&1; then
|
||
alias n="nvim"
|
||
fi
|
||
|
||
## Bat (Alternative to Cat) Aliases ##
|
||
if command -v bat >/dev/null 2>&1; then
|
||
alias cat="bat"
|
||
fi
|
||
|
||
## Misc Aliases ##
|
||
alias e="$EDITOR"
|
||
alias ghidra="ghidraRun"
|
||
alias v="vim"
|
||
alias :q="exit"
|
||
alias Get-Public-IPV4="dig @resolver4.opendns.com myip.opendns.com +short -4"
|
||
alias Get-Public-IPV6="dig @resolver1.ipv6-sandbox.opendns.com AAAA myip.opendns.com +short -6"
|
||
alias :profile="$EDITOR $HOME/.profile"
|
||
|
||
### Completions ###
|
||
|
||
_import_custom_bash_completions() {
|
||
local custom_comps=(
|
||
"az"
|
||
)
|
||
for file in "${custom_comps[@]}"; do
|
||
source "${HOMEBREW_PREFIX}/etc/bash_completion.d/${file}"
|
||
done
|
||
}
|
||
|
||
# Homebrew completions
|
||
if type brew &>/dev/null; then
|
||
# Zsh
|
||
FPATH="$(brew --prefix)/share/zsh/site-functions:${FPATH}"
|
||
_import_custom_bash_completions
|
||
|
||
autoload -Uz compinit
|
||
compinit
|
||
fi
|
||
|
||
# Completions from .zsh directory
|
||
if [[ -d "$HOME/.zsh/completions" ]]; then
|
||
FPATH="$HOME/.zsh/completions:${FPATH}"
|
||
|
||
autoload -Uz compinit
|
||
compinit
|
||
fi
|
||
|
||
### Functions ###
|
||
del() {
|
||
local BASE_TRASH_DIR
|
||
BASE_TRASH_DIR="$HOME/.Trash/"
|
||
|
||
local trash_del_dir
|
||
trash_del_dir="$BASE_TRASH_DIR/del-$(date +%Y-%m-%dT%H:%M:%S)"
|
||
|
||
mkdir -p "$trash_del_dir"
|
||
|
||
for i in "${@}"; do
|
||
mv "$i" "$trash_del_dir"
|
||
done
|
||
}
|
||
|
||
DAP-Python-Gen() {
|
||
local module
|
||
module="${1}"
|
||
name="${2:=Local Module}"
|
||
|
||
mkdir -p .vscode
|
||
cat <<__EOF__ >.vscode/launch.json
|
||
{
|
||
"configurations": [
|
||
{
|
||
"name": "Launch ${name}",
|
||
"type": "python",
|
||
"request": "launch",
|
||
"module": "${module}"
|
||
}
|
||
]
|
||
}
|
||
__EOF__
|
||
}
|
||
|
||
TCPDump-Capture() {
|
||
tcpdump -qns 0 -X -r "${1}"
|
||
}
|
||
|
||
Known-Hosts() {
|
||
local prev_ifs
|
||
prev_ifs="$IFS"
|
||
while IFS=$'\n' read -r line; do
|
||
echo "$line" | cut -d " " -f1
|
||
done <~/.ssh/known_hosts
|
||
IFS="$prev_ifs"
|
||
}
|
||
|
||
Work-Hours() {
|
||
local WORK_HOURS_PATH
|
||
WORK_HOURS_PATH=~/Vircio/Work-Hours
|
||
mkdir -p "$WORK_HOURS_PATH"
|
||
"$EDITOR" "$WORK_HOURS_PATH/$(date +%Y-%m-%d)"
|
||
}
|
||
|
||
date_iso_8601() {
|
||
date +%Y-%m-%dT%H:%M:%S
|
||
}
|
||
|
||
echo_rgb() {
|
||
# Echo a colored string to the terminal based on rgb values
|
||
#
|
||
# NOTE: This function will only truly work with terminals that support TRUE COLOR, see:
|
||
# https://gist.github.com/XVilka/8346728
|
||
#
|
||
# Positional Arguments:
|
||
#
|
||
# message <type: string> <position: 1> <required: true>
|
||
# - The message to be printed to stdout
|
||
# red <type: int> <position: 2> <required: true>
|
||
# - The red value from 0 to 255
|
||
# green <type: int> <position: 3> <required: true>
|
||
# - The green value from 0 to 255
|
||
# blue <type: int> <position: 4> <required: true>
|
||
# - The blue value from 0 to 255
|
||
# bg_red <type: int> <position: 5> <required: false>
|
||
# - The background red value from 0 to 255
|
||
# bg_green <type: int> <position: 6> <required: false>
|
||
# - The background green value from 0 to 255
|
||
# bg_blue <type: int> <position: 7> <required: false>
|
||
# - The background blue value from 0 to 255
|
||
#
|
||
# Usage:
|
||
# echo_rgb "Yep" 10 80 30
|
||
# echo_rgb "DESTROY MY EYES" 255 0 255 0 255 0
|
||
#
|
||
# POSIX Compliant:
|
||
# N/A
|
||
#
|
||
|
||
local red
|
||
local green
|
||
local blue
|
||
local input
|
||
|
||
local bg_red
|
||
local bg_green
|
||
local bg_blue
|
||
|
||
input="${1}"
|
||
red="${2}"
|
||
green="${3}"
|
||
blue="${4}"
|
||
bg_red="${5}"
|
||
bg_green="${6}"
|
||
bg_blue="${7}"
|
||
|
||
for num in "${@:2}"; do
|
||
[[ ! "$num" =~ [0-9] ]] &&
|
||
printf "%s\n" "Given RGB value was not a number, received $num" 1>&2 &&
|
||
return 1
|
||
[[ "$num" -gt 255 ]] &&
|
||
printf "%s\n" "Given RGB value must be less than 255, received $num" 1>&2 &&
|
||
return 1
|
||
[[ "$num" -lt 0 ]] &&
|
||
printf "%s\n" "Given RGB value must be more than 0, received $num" 1>&2 &&
|
||
return 1
|
||
done
|
||
|
||
if [ -t 1 ]; then
|
||
if [ "${5}" != "" ]; then
|
||
[[ -z "${6}" ]] && echo "A value must be passed for bg_green" && return 1
|
||
[[ -z "${7}" ]] && echo "A value must be passed for bg_blue" && return 1
|
||
printf "\033[38;2;%s;%s;%s;48;2;%s;%s;%sm%s\033[m\n" \
|
||
"$red" "$green" "$blue" "$bg_red" "$bg_green" "$bg_blue" "$input"
|
||
else
|
||
printf "\033[0;38;2;%s;%s;%sm%s\033[m\n" "$red" "$green" "$blue" "$input"
|
||
fi
|
||
else
|
||
printf "%s\n" "$input"
|
||
fi
|
||
}
|
||
|
||
chr() {
|
||
python3 -c "print(chr(int('${1}')))"
|
||
}
|
||
|
||
ord() {
|
||
python3 -c "print(ord('${1}'))"
|
||
}
|
||
|
||
tmp() {
|
||
(
|
||
export MY_SHLVL=tmp:$MY_SHLVL
|
||
export od=$PWD
|
||
tmp=$(mktemp -d)
|
||
export tmp
|
||
trap 'rm -rf ${tmp}' 0
|
||
if ! cd "$tmp"; then
|
||
printf "%s \"%s\"\n" "Unable to cd into" "$tmp"
|
||
exit 1
|
||
fi
|
||
if [ "$1" = "" ]; then
|
||
"$SHELL" -l
|
||
else
|
||
[ "$1" = "-l" ] && {
|
||
shift
|
||
set "${@}" ";" "$SHELL -l"
|
||
}
|
||
eval "${@}"
|
||
fi
|
||
)
|
||
}
|
||
|
||
cdl() {
|
||
if [[ -f "${1}" ]]; then
|
||
cd "$(dirname "$(readlink -f "${1}")")"
|
||
else
|
||
echo_rgb "No such file: ${1}" 255 0 0 30 0 0
|
||
fi
|
||
}
|
||
|
||
nvim_env() {
|
||
# If using ZSH uncomment the line below, requires emulate
|
||
emulate -L ksh
|
||
local nvim_env
|
||
local nvim_env_path
|
||
local nvim_env_full_path
|
||
|
||
nvim_env="${1:-nvim-primary}"
|
||
nvim_env_path="$HOME/nvim-environments"
|
||
nvim_env_full_path="$nvim_env_path/$nvim_env"
|
||
|
||
declare -A nvim_syml_paths=(["$HOME/.config/nvim"]="$nvim_env_full_path/config" ["$HOME/.local/share/nvim"]="$nvim_env_full_path/share")
|
||
|
||
# Check that the given environment exists
|
||
if [[ ! -d "$nvim_env_full_path" ]]; then
|
||
printf "Error: Unable to locate environment, \"%s\"\n\t\"%s\"\n" "$nvim_env" "$nvim_env_full_path" >&2
|
||
return 1
|
||
fi
|
||
|
||
local symlink_src
|
||
local symlink_dst
|
||
for syml_key in "${!nvim_syml_paths[@]}"; do
|
||
symlink_src="${nvim_syml_paths[$syml_key]}"
|
||
symlink_dst="$syml_key"
|
||
|
||
# Check that the configuration path exist from our env
|
||
if [[ ! -d "$symlink_src" ]]; then
|
||
printf "ERROR: Unable to find configuration:\n\t\"%s\" in environment \"%s\"\n\tConsider creating it with \"mkdir -p %s\"\n" "$symlink_src" "$nvim_env" "$symlink_src" >&2
|
||
return 1
|
||
fi
|
||
|
||
# If a directory (not a symlink) exists in where we want to write a symlink refuse to overwrite
|
||
if [[ -r "$symlink_dst" ]] && [[ ! -L "$symlink_dst" ]]; then
|
||
printf "ERROR: Neovim configuration to be replaced is not a symlink, please remove the files before proceeding, issue file:\n\t\"%s\"\n" "$symlink_dst" >&2
|
||
return 1
|
||
fi
|
||
|
||
# If we find an existing symlink, try to delete it
|
||
if [[ -L "$symlink_dst" ]]; then
|
||
local linked_sym
|
||
linked_sym="$(readlink "$symlink_dst")"
|
||
printf "Attemping to remove symlink:\n\t%s -> %s\n" "$linked_sym" "$symlink_dst"
|
||
if ! rm "$symlink_dst"; then
|
||
printf "ERROR: Failed to remove symlink:\n\t%s -> %s\n" "$linked_sym" "$symlink_dst" >&2
|
||
return 1
|
||
else
|
||
printf "Successfully removed symlink:\n\t%s -> %s\n" "$linked_sym" "$symlink_dst"
|
||
fi
|
||
fi
|
||
|
||
# Actually write the env now we're past our guards
|
||
printf "Linking:\n\t%s -> %s\n" "$symlink_src" "$symlink_dst"
|
||
if ! ln -s "$symlink_src" "$symlink_dst"; then
|
||
printf "ERROR: Failed to link:\n\t%s -> %s\n" "$symlink_src" "$symlink_dst" >&2
|
||
return 1
|
||
else
|
||
printf "Successfully linked:\n\t%s -> %s\n" "$symlink_src" "$symlink_dst"
|
||
fi
|
||
printf "%.s-" "$(seq 1 "$(tput cols)")"
|
||
printf "\n"
|
||
done
|
||
}
|
||
|
||
### Used to open firefox from terminal with search ###
|
||
browser_search() {
|
||
local browser
|
||
local search_term
|
||
browser="firefox"
|
||
search_term="${*}"
|
||
eval "$browser -search \"$search_term\""
|
||
}
|
||
|
||
### Search Aliases ###
|
||
if command -v browser_search >/dev/null 2>&1; then
|
||
alias s="browser_search"
|
||
if ! which search >/dev/null 2>&1; then
|
||
alias search="browser_search"
|
||
fi
|
||
fi
|
||
|
||
watcher() {
|
||
local command
|
||
local sleep_time
|
||
local exit_code
|
||
|
||
command="${1}"
|
||
sleep_time="${2:-5}"
|
||
while :; do
|
||
clear
|
||
printf "%s | %s | %s\n" "Command: \"$command\"" "Every $sleep_time seconds" "$(date)"
|
||
printf "%*s\n" "${COLUMNS:-$(tput cols)}" "" | tr " " -
|
||
eval "$command"
|
||
exit_code="${?}"
|
||
if ((exit_code != 0)); then
|
||
break
|
||
fi
|
||
sleep "$sleep_time"
|
||
done
|
||
|
||
return "$((exit_code))"
|
||
}
|
||
|
||
update_cargo_crates() {
|
||
cargo install "$(cargo install --list | grep -E '^[a-z0-9_-]+ v[0-9.]+:$' | cut -f1 -d" ")"
|
||
}
|
||
|
||
wgrep() {
|
||
local selection
|
||
read -r selection < =(rg --color=always --line-number --no-heading --smart-case "${*:-}" | fzf --ansi \
|
||
--color "hl:-1:underline,hl+:-1:underline:reverse" \
|
||
--delimiter : \
|
||
--preview 'bat --color=always {1} --highlight-line {2}' \
|
||
--preview-window 'up,60%,border-bottom,+{2}+3/3,~3')
|
||
|
||
# This crazy shit handles egde cases of files having colons (:) in them
|
||
selection=$(rev <<< $selection | cut -d ':' -f 3- | rev)
|
||
if [[ -n "${selection}" ]]; then
|
||
[[ -r "${selection}" ]] && "${EDITOR}" "${selection}" || echo_rgb "Cannot open ${selection}" 255 0 0 80 0 0
|
||
fi
|
||
|
||
}
|
||
|
||
pods() {
|
||
FZF_DEFAULT_COMMAND="kubectl get pods --all-namespaces" \
|
||
fzf --info=inline --layout=reverse --header-lines=1 \
|
||
--prompt "$(kubectl config current-context | sed 's/-context$//')> " \
|
||
--header $'╱ Enter (kubectl exec) ╱ CTRL-O (open log in editor) ╱ CTRL-R (reload) ╱\n\n' \
|
||
--bind 'ctrl-/:change-preview-window(80%,border-bottom|hidden|)' \
|
||
--bind 'enter:execute:kubectl exec -it --namespace {1} {2} -- bash > /dev/tty' \
|
||
--bind 'ctrl-o:execute:${EDITOR:-vim} <(kubectl logs --all-containers --namespace {1} {2}) > /dev/tty' \
|
||
--bind 'ctrl-r:reload:$FZF_DEFAULT_COMMAND' \
|
||
--preview-window up:follow \
|
||
--preview 'kubectl logs --follow --all-containers --tail=10000 --namespace {1} {2}' "$@"
|
||
}
|
||
|
||
### FZF FUNCTIONS ###
|
||
killer() {
|
||
(
|
||
date
|
||
ps -ef
|
||
) |
|
||
fzf --bind='ctrl-r:reload(date; ps -ef)' \
|
||
--header=$'Press CTRL-R to reload\n\n' --header-lines=2 \
|
||
--preview='echo {}' --preview-window=down,3,wrap \
|
||
--layout=reverse --height=80% | awk '{print $2}' | xargs kill -"${1:-9}"
|
||
}
|
||
. "$HOME/.cargo/env"
|