commit
94adc19b00
@ -0,0 +1,6 @@ |
||||
# example .user.gitconfig file for user/system-specific configs |
||||
[commit] |
||||
gpgsign = true |
||||
[user] |
||||
# get this via `gpg --list-secret-keys --keyid-format=short` |
||||
signingKey = 2D73A6DF |
@ -0,0 +1,33 @@ |
||||
dotfiles |
||||
======== |
||||
|
||||
## Features |
||||
|
||||
* A wealth of bash and git aliases scoured from the internet |
||||
* Beautiful terminal `PS1` and message-of-the-day-style prompt at start of session |
||||
* Sane defaults for shell options and builtins (`rm -I --preserve-root`, `mkdir -pv`, `grep --color=auto`, etc.) |
||||
* Config files and settings for [vim](https://www.vim.org/), [ripgrep](https://github.com/BurntSushi/ripgrep), |
||||
[abcde](http://lly.org/~rcw/abcde/page/), and [shellcheck](https://www.shellcheck.net/) |
||||
|
||||
## Setup |
||||
|
||||
1. Clone this repository into a directory of your choice. I recommend using the [`XDG_CONFIG_HOME` |
||||
directory](https://wiki.archlinux.org/title/XDG_Base_Directory#User_directories). (`$HOME/.config`) |
||||
|
||||
```sh |
||||
cd "${XDG_CONFIG_HOME:-$HOME/.config}" |
||||
git clone https://git.example.com/nightfirecat/dotfiles.git |
||||
``` |
||||
|
||||
2. Run `setup.sh` |
||||
|
||||
```sh |
||||
"${XDG_CONFIG_HOME:-"$HOME"/.config}"/dotfiles/setup.sh |
||||
``` |
||||
|
||||
Once completed, all necessary symlinks will be created for environment setup. Restart your login for the `.bash_profile` |
||||
to take effect. |
||||
|
||||
## Uninstall |
||||
|
||||
Run `setup.sh --remove` to clear any symlinks created by the setup process. |
@ -0,0 +1,46 @@ |
||||
#!/bin/bash |
||||
set -e |
||||
|
||||
# Accept the `--remove` argument to delete symlinks of the files to be copied |
||||
# This is useful for testing a clean installation (eg. `setup.sh --remove && setup.sh`) |
||||
# Note: Normal setup overwrites all old symlinks, so re-installation in place is idempotent |
||||
if [ "$1" == '--remove' ]; then |
||||
remove=1 |
||||
else |
||||
remove=0 |
||||
fi |
||||
|
||||
DIR="$( dirname "$(readlink -f "${BASH_SOURCE[0]}")" )" |
||||
SRC_DIR="$DIR/src" |
||||
|
||||
# read file basenames to copy_files array |
||||
readarray -d '' copy_files < <(find "$SRC_DIR" -type f -printf '%f\0') |
||||
files_to_remove=() |
||||
|
||||
if [ $remove -eq 1 ]; then |
||||
for file in "${copy_files[@]}"; do |
||||
if [ -L "$file" ]; then |
||||
rm -v "$file" |
||||
else |
||||
echo "Skipping deletion of ${file} because it is not a symlink" |
||||
fi |
||||
done |
||||
elif [ $remove -eq 0 ]; then |
||||
# Ensure all files are absent in $HOME |
||||
for file in "${copy_files[@]}"; do |
||||
if [ -e "${HOME}/${file}" ] && ! [ -L "${HOME}/${file}" ]; then |
||||
files_to_remove+=( "$file" ) |
||||
fi |
||||
done |
||||
|
||||
if [ "${#files_to_remove}" -ne 0 ]; then |
||||
echo "Remove the following files from home directory and re-run setup!" |
||||
printf '%s\n' "${files_to_remove[@]}" |
||||
exit 1 |
||||
fi |
||||
|
||||
# Symlink files to $HOME, overwrite old symlinks |
||||
for file in "${copy_files[@]}"; do |
||||
ln -svf "${SRC_DIR}/${file}" "${HOME}/${file}" |
||||
done |
||||
fi |
@ -0,0 +1,46 @@ |
||||
# Encode tracks immediately after reading. Saves disk space, gives better |
||||
# reading of 'scratchy' disks and better troubleshooting of encoding process |
||||
# but slows the operation of abcde quite a bit: |
||||
LOWDISK=y |
||||
|
||||
# Specify FLAC encoding |
||||
FLACENCODERSYNTAX=flac |
||||
FLAC=flac |
||||
OUTPUTTYPE="flac" |
||||
|
||||
# Set FLAC encoding options: (see `man flac`) |
||||
# -s: Silent operation |
||||
# -e: Exhaustive model search; gets best file size |
||||
# -V: Verify encoding process; ensures against encoding errors |
||||
# -8: Use highest compression for best file size |
||||
FLACOPTS='-s -e -V -8' |
||||
|
||||
# Label format for a standard 'single-artist', multi-track encode and also for |
||||
# a multi-track, 'various-artist' encode: |
||||
OUTPUTFORMAT='${OUTPUT}/${ARTISTFILE}/${ARTISTFILE} - ${ALBUMFILE}/${ARTISTFILE} - ${ALBUMFILE} - ${TRACKNUM} ${TRACKFILE}' |
||||
VAOUTPUTFORMAT='${OUTPUT}/Other, Various Artists/${ALBUMFILE}/${ALBUMFILE} ${TRACKNUM} - ${ARTISTFILE} - ${TRACKFILE}' |
||||
|
||||
# Label format for a standard 'single-artist', single-track encode and also for |
||||
# a single-track, 'various-artist' encode: |
||||
ONETRACKOUTPUTFORMAT='${OUTPUT}/${ARTISTFILE}/${ARTISTFILE} - ${TRACKFILE}' |
||||
VAONETRACKOUTPUTFORMAT='${OUTPUT}/Other, Various Artists/${ARTISTFILE} - ${TRACKFILE}' |
||||
|
||||
# Custom filenae munging: |
||||
# mungefilename receives the CDDB data (artist, track, title, whatever) as $1 |
||||
# and outputs it on stdout. |
||||
# This custom function will do the following: |
||||
# * Eat printable ASCII characters which are forbidden in Windows and Linux |
||||
# (<>:"/\|?*) and control characters |
||||
mungefilename () |
||||
{ |
||||
echo "$@" | tr -d "<>:\"/\\\\|?*[:cntrl:]" |
||||
} |
||||
|
||||
# Embed album art in addition to default actions |
||||
ACTIONS=default,embedalbumart |
||||
|
||||
# Use a padded two-digit track number (eg. 01 instead of 1) |
||||
PADTRACKS=y |
||||
|
||||
# Run two encoders simultaneously |
||||
MAXPROCS=2 |
@ -0,0 +1,6 @@ |
||||
#!/bin/bash |
||||
|
||||
# kill running ssh agent |
||||
if [ -n "$SSH_AUTH_SOCK" ]; then |
||||
eval "$(ssh-agent -k)" |
||||
fi |
@ -0,0 +1,62 @@ |
||||
#!/bin/bash |
||||
|
||||
### environment vars |
||||
# Ensure $HOME/.bin exists, add it to PATH |
||||
mkdir -vp "$HOME/.bin" |
||||
export PATH="${PATH}:$HOME/.bin" |
||||
|
||||
# bash options |
||||
export HISTCONTROL=ignoreboth |
||||
export HISTSIZE=1000 |
||||
export HISTFILESIZE=5000 |
||||
|
||||
# XDG |
||||
export XDG_CACHE_HOME="$HOME/.cache" |
||||
export XDG_CONFIG_HOME="$HOME/.config" |
||||
export XDG_DATA_HOME="$HOME/.local/share" |
||||
|
||||
# Default editor |
||||
hash vim >/dev/null 2>&1 && export EDITOR='vim' VISUAL='vim' |
||||
|
||||
# Pager and man pager |
||||
if hash less >/dev/null 2>&1; then |
||||
# set sensible default for less |
||||
export LESS='-R' |
||||
|
||||
# Enhanced man pages |
||||
export MANPAGER='less -R -s -M' |
||||
|
||||
if [ "$(less -V | head -n 1 | cut -f 2 -d' ' )" -ge 580 ]; then |
||||
export MANPAGER="${MANPAGER} --use-color -Dd+r -Du+b" |
||||
else |
||||
# Add man page colors |
||||
# Sourced from: https://unix.stackexchange.com/a/329092/136537 |
||||
export LESS_TERMCAP_mb=$'\e[1;31m' # begin bold |
||||
export LESS_TERMCAP_md=$'\e[1;33m' # begin blink |
||||
export LESS_TERMCAP_so=$'\e[01;44;37m' # begin reverse video |
||||
export LESS_TERMCAP_us=$'\e[01;37m' # begin underline |
||||
export LESS_TERMCAP_me=$'\e[0m' # reset bold/blink |
||||
export LESS_TERMCAP_se=$'\e[0m' # reset reverse video |
||||
export LESS_TERMCAP_ue=$'\e[0m' # reset underline |
||||
export GROFF_NO_SGR=1 # for konsole and gnome-terminal |
||||
fi |
||||
fi |
||||
|
||||
# Maven |
||||
export JAVA_HOME=/lib/jvm/default-java |
||||
export PATH="${PATH}:/opt/maven/bin" |
||||
|
||||
# JShell |
||||
export CLASSPATH="/opt/libs/commons-lang3-3.7.jar:/opt/libs/guava-23.2-jre.jar" |
||||
|
||||
# rg config |
||||
export RIPGREP_CONFIG_PATH="$HOME"/.ripgreprc |
||||
|
||||
# shell check config |
||||
export SHELLCHECK_OPTS='--color' |
||||
|
||||
### commands |
||||
# Start SSH agent |
||||
if [ -z "$SSH_AUTH_SOCK" ]; then |
||||
eval "$(ssh-agent -s)" |
||||
fi |
@ -0,0 +1,620 @@ |
||||
#!/bin/bash |
||||
|
||||
# If not running interactively, don't do anything |
||||
[ -z "$PS1" ] && return |
||||
|
||||
# source global definitions (if any) |
||||
if [ -f /etc/bashrc ]; then |
||||
# shellcheck disable=SC1091 |
||||
. /etc/bashrc |
||||
fi |
||||
|
||||
|
||||
### shell options |
||||
# set shell options |
||||
set -o ignoreeof # prevent Ctrl+D from exiting terminal |
||||
shopt -s cdspell # allow minor misspellings in `cd` commands |
||||
shopt -s checkhash # reference command hash table for executables |
||||
shopt -s checkwinsize # update LINES and COLUMNS after each command |
||||
shopt -s cmdhist # save all lines of multiline commands to history |
||||
shopt -s dotglob # allow globing filenames beginning with '.' |
||||
shopt -s expand_aliases # use bash aliases |
||||
shopt -s extglob # use pattern matching features (ref `man bash`) |
||||
shopt -s histappend # append to history file instead of overwriting |
||||
shopt -s histreedit # allow user to re-edit failed history appending |
||||
shopt -s histverify # edit recalled history line before executing |
||||
shopt -s hostcomplete # attempt hostname completion on word containing '@' |
||||
shopt -s lithist # save multiline commands to history with embedded \n |
||||
shopt -s nocaseglob # use case insensitive globs on filename expansion |
||||
shopt -s progcomp # use bash programmable completion |
||||
shopt -s promptvars # expand vars in prompt |
||||
shopt -s shift_verbose # print error if shifting out of bounds |
||||
shopt -s sourcepath # reference PATH to find executables |
||||
|
||||
# unset shell options |
||||
shopt -u mailwarn # don't spam mail read notifications |
||||
shopt -u nullglob # `ls nonexist/*` should fail, not act like `ls` |
||||
|
||||
|
||||
### define colors |
||||
# Normal colors |
||||
export COLOR_Black='\e[0;30m' |
||||
export COLOR_Red='\e[0;31m' |
||||
export COLOR_Green='\e[0;32m' |
||||
export COLOR_Yellow='\e[0;33m' |
||||
export COLOR_Blue='\e[0;34m' |
||||
export COLOR_Purple='\e[0;35m' |
||||
export COLOR_Cyan='\e[0;36m' |
||||
export COLOR_White='\e[0;37m' |
||||
|
||||
# Bright |
||||
export COLOR_BBlack='\e[1;30m' |
||||
export COLOR_BRed='\e[1;31m' |
||||
export COLOR_BGreen='\e[1;32m' |
||||
export COLOR_BYellow='\e[1;33m' |
||||
export COLOR_BBlue='\e[1;34m' |
||||
export COLOR_BPurple='\e[1;35m' |
||||
export COLOR_BCyan='\e[1;36m' |
||||
export COLOR_BWhite='\e[1;37m' |
||||
|
||||
# Background |
||||
export COLOR_On_Black='\e[40m' |
||||
export COLOR_On_Red='\e[41m' |
||||
export COLOR_On_Green='\e[42m' |
||||
export COLOR_On_Yellow='\e[43m' |
||||
export COLOR_On_Blue='\e[44m' |
||||
export COLOR_On_Purple='\e[45m' |
||||
export COLOR_On_Cyan='\e[46m' |
||||
export COLOR_On_White='\e[47m' |
||||
|
||||
# Color Reset |
||||
export COLOR_NC='\e[m' |
||||
|
||||
# Alert color (bright white on red) |
||||
export COLOR_ALERT="${COLOR_BWhite}${COLOR_On_Red}" |
||||
|
||||
|
||||
### aliases |
||||
# sensible defaults |
||||
alias sudo='sudo ' # allow sudo to execute aliases |
||||
alias rm='rm -I --preserve-root' |
||||
alias mv='mv -i' |
||||
alias cp='cp -i' |
||||
alias ln='ln -i' |
||||
alias chown='chown --preserve-root' |
||||
alias chmod='chmod --preserve-root' |
||||
alias chgrp='chgrp --preserve-root' |
||||
alias df='df -Th' |
||||
alias mkdir='mkdir -pv' |
||||
alias less='less -R' |
||||
alias grep='grep --color=auto' |
||||
alias egrep='egrep --color=auto' |
||||
alias fgrep='fgrep --color=auto' |
||||
alias diff='diff -uN --color=auto' |
||||
alias ip='ip --color=auto' |
||||
alias mount='mount | column -t' |
||||
alias tree='tree -Csuh' |
||||
|
||||
# simple shortcuts |
||||
alias aliases='alias -p' |
||||
alias h='history' |
||||
alias j='jobs -l' |
||||
alias which='type -a' |
||||
alias more='less' |
||||
alias path='echo -e ${PATH//:/\\n}' # print $PATH dirs on separate lines |
||||
alias now='date +"%T"' |
||||
alias nowtime='now' |
||||
alias nowdate='date +"%y-%m-%d"' |
||||
alias isodate='date -I' |
||||
alias isotime='date -Ihours' |
||||
alias headers='curl -I' # get site headers |
||||
alias headersc='curl -I --compress' # test gzip/mod_deflate support |
||||
|
||||
# add colors for filetype and human-readable sizes in `ls` |
||||
alias ls='ls -h --color --show-control-chars' |
||||
alias lx='ls -lXB' # sort by extension |
||||
alias lk='ls -lSr' # sort by date, newest first |
||||
alias lt='ls -ltr' # sort by date, newest last |
||||
alias lc='ls -ltcr' # sort by/show change time, most recent last |
||||
alias lu='ls -ltur' # sort by/show access time, most recent last |
||||
|
||||
# add `ll` and derivatives |
||||
alias ll='ls -lv --group-directories-first' |
||||
alias lm='ll | more' |
||||
alias lr='ll -R' |
||||
alias la='ll -A' |
||||
|
||||
|
||||
### functions |
||||
## private functions (internal use only) |
||||
# only performs `ssh-add` on files in ~/.ssh/ which have a header indicating |
||||
# they are SSH keys, and which are not loaded in the agent |
||||
function _bashrc_ssh-add-keys { |
||||
if ! grep -E -q -- '-BEGIN (OPENSSH|RSA) PRIVATE KEY-' ~/.ssh/*; then |
||||
return |
||||
fi |
||||
|
||||
local loaded_idents file |
||||
|
||||
loaded_idents="$(ssh-add -l)" |
||||
for file in ~/.ssh/*; do |
||||
if [ -f "$file" ] && \ |
||||
grep -E -q -- '-BEGIN (OPENSSH|RSA) PRIVATE KEY-' "$file" && \ |
||||
! grep -q "$(ssh-keygen -lf "${file}.pub" | sed -E -e 's/^.+\b([^ ]+:[^ ]+)\b.+$/\1/' | tr -d '\n')" <<< "$loaded_idents"; |
||||
then |
||||
ssh-add "$file" |
||||
fi |
||||
done |
||||
} |
||||
|
||||
# test colors available in the terminal |
||||
# source: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html |
||||
function _bashrc_colortest { |
||||
local T FGs FG BG |
||||
T='gYw' # test text |
||||
|
||||
echo -e '\n 40m 41m 42m 43m' \ |
||||
' 44m 45m 46m 47m'; |
||||
|
||||
for FGs in ' m' ' 1m' ' 30m' '1;30m' ' 31m' '1;31m' \ |
||||
' 32m' '1;32m' ' 33m' '1;33m' ' 34m' '1;34m' \ |
||||
' 35m' '1;35m' ' 36m' '1;36m' ' 37m' '1;37m'; |
||||
do FG=${FGs// /} |
||||
echo -en " $FGs \\033[$FG $T " |
||||
for BG in 40m 41m 42m 43m 44m 45m 46m 47m; |
||||
do echo -en "$EINS \\033[$FG\\033[$BG $T \\033[0m"; |
||||
done |
||||
echo |
||||
done |
||||
echo |
||||
} |
||||
|
||||
# attempts to navigate to the passed path and print its canonical path |
||||
# (similar to `cd -`) |
||||
function _bashrc_.cd { |
||||
if cd "$1"; then |
||||
readlink -f . |
||||
fi |
||||
} |
||||
|
||||
# prints given elements in $2 ... joined by the string in $1 |
||||
function _bashrc_join_by { |
||||
if [ $# -lt 2 ]; then return 1; fi |
||||
|
||||
local d |
||||
|
||||
d="$1" |
||||
shift |
||||
echo -n "$1" |
||||
shift |
||||
printf '%s' "${@/#/$d}" |
||||
} |
||||
|
||||
# prints a human-readable time from a passed number of epoch seconds |
||||
function _bashrc_displaytime { |
||||
[ $# -ne 1 ] && echo "${FUNCNAME[0]}: 1 argument needed" >&2 && return 1 |
||||
|
||||
local T D H M S |
||||
T="$1" |
||||
D=$((T/60/60/24)) |
||||
H=$((T/60/60%24)) |
||||
M=$((T/60%60)) |
||||
S=$((T%60)) |
||||
[ "$D" -gt 0 ] && |
||||
echo -n "${D}d " |
||||
{ [ "$D" -gt 0 ] || [ "$H" -gt 0 ]; } && |
||||
printf '%02.0fh ' "$H" |
||||
{ [ "$D" -gt 0 ] || [ "$H" -gt 0 ] || [ "$M" -gt 0 ]; } && |
||||
printf '%02.0fm ' "$M" |
||||
printf '%02.0fs' "$S" |
||||
} |
||||
|
||||
# prints the code for a random color readable on a black background shell |
||||
# omits COLOR_White as it is indistinguishable from default color |
||||
function _bashrc_randomcolor { |
||||
local colors random_index |
||||
colors=( |
||||
# "$COLOR_Black" # cannot be read on black bg |
||||
"$COLOR_Red" |
||||
"$COLOR_Green" |
||||
"$COLOR_Yellow" |
||||
# "$COLOR_Blue" # very hard to read on black bg |
||||
"$COLOR_Purple" |
||||
"$COLOR_Cyan" |
||||
# "$COLOR_White" # indistinguishable from default color |
||||
"$COLOR_BRed" |
||||
"$COLOR_BGreen" |
||||
"$COLOR_BYellow" |
||||
"$COLOR_BBlue" |
||||
"$COLOR_BPurple" |
||||
"$COLOR_BCyan" |
||||
"$COLOR_BWhite" |
||||
) |
||||
random_index="$(shuf -i 1-"${#colors[@]}" -n 1)" |
||||
random_index=$(( random_index - 1 )) |
||||
echo -e "${colors[$random_index]}" |
||||
} |
||||
|
||||
# prints a message of the day (time, shell info, system info, etc.) |
||||
function _bashrc_motd { |
||||
local kernel_string uptime_seconds uptime_msg cpuinfo cpu_model cpu_cores \ |
||||
cpu_msg k mem_decimals mem_units mem_label mem_percent_free \ |
||||
mem_danger_cutoff_limit mem_danger_cutoff_percent \ |
||||
mem_warning_cutoff_limit mem_warning_cutoff_percent mem_free_color \ |
||||
mem_msg |
||||
local -A memory |
||||
|
||||
# Print shell info |
||||
echo -e "$(_bashrc_randomcolor)This is BASH" \ |
||||
"$(_bashrc_randomcolor)${BASH_VERSION%.*}${COLOR_NC}" |
||||
kernel_string="$( |
||||
( |
||||
uname -s |
||||
uname -r |
||||
uname -m |
||||
uname -o |
||||
) | tr "\\n" ' ' |
||||
)" |
||||
echo -e "This kernel is: $(_bashrc_randomcolor)${kernel_string}${COLOR_NC}" |
||||
|
||||
# Print date and uptime |
||||
echo -e "It's $(_bashrc_randomcolor)$(date)${COLOR_NC}" |
||||
uptime_seconds="$(cut -d '.' -f 1 < /proc/uptime)" |
||||
uptime_msg="This machine has been up for $(_bashrc_randomcolor)" |
||||
uptime_msg+="$(_bashrc_displaytime "$uptime_seconds")${COLOR_NC}" |
||||
echo -e "$uptime_msg" |
||||
echo |
||||
|
||||
# Print CPU, memory, and HDD info |
||||
cpuinfo="$(cat /proc/cpuinfo)" |
||||
cpu_model="$( |
||||
grep -m 1 'model name' <<< "$cpuinfo" | |
||||
cut -d ':' -f 2 | |
||||
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' |
||||
)" |
||||
cpu_cores="$( |
||||
grep -m 1 'cpu cores' <<< "$cpuinfo" | |
||||
cut -d ':' -f 2 | |
||||
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' |
||||
)" |
||||
cpu_msg="CPU: $(_bashrc_randomcolor)${cpu_model} ${cpu_cores}-core processor" |
||||
cpu_msg+="${COLOR_NC}" |
||||
echo -e "$cpu_msg" |
||||
memory['free']='MemFree' |
||||
memory['total']='MemTotal' |
||||
for k in "${!memory[@]}"; do |
||||
memory["$k"]="$( |
||||
grep "${memory["$k"]}" < /proc/meminfo | |
||||
sed -r -e 's/^.+ ([[:digit:]]+).+$/\1/' |
||||
)" |
||||
(( memory["$k"] *= 1024 )) |
||||
done |
||||
# Determine memory divisor by available memory |
||||
mem_decimals=2 |
||||
if [ "${memory['free']}" -gt $(( 1024 * 1024 * 1024 )) ]; then |
||||
mem_units=$(( 1024 * 1024 * 1024 )) |
||||
mem_label='GiB' |
||||
elif [ "${memory['free']}" -gt $(( 1024 * 1024 )) ]; then |
||||
mem_units=$(( 1024 * 1024 )) |
||||
mem_label='MiB' |
||||
elif [ "${memory['free']}" -gt 1024 ]; then |
||||
mem_decimals=1 |
||||
mem_units=1024 |
||||
mem_label='KiB' |
||||
else |
||||
mem_decimals=0 |
||||
mem_units=1 |
||||
mem_label='B' |
||||
fi |
||||
# Determine memory "safety" by comparing available-to-total memory |
||||
# and by the following hard cutoffs for available memory: |
||||
# - available < 100mb or available / total < 0.1 :: danger |
||||
# - 100mb < available < 300mb or available / total < 0.3 :: warning |
||||
mem_percent_free="$( |
||||
awk -v free="${memory['free']}" -v total="${memory['total']}" \ |
||||
'BEGIN { print free / total }' |
||||
)" |
||||
mem_danger_cutoff_limit="$(( 100 * 1024 * 1024 ))" |
||||
mem_danger_cutoff_percent='0.1' |
||||
mem_warning_cutoff_limit="$(( 300 * 1024 * 1024 ))" |
||||
mem_warning_cutoff_percent='0.3' |
||||
if ( |
||||
[ "${memory['free']}" -lt "$mem_danger_cutoff_limit" ] || |
||||
echo "$mem_percent_free" "$mem_danger_cutoff_percent" | \ |
||||
awk '{exit $1 < $2 ? 0 : 1}' |
||||
); then |
||||
mem_free_color="${COLOR_BRed}" |
||||
elif ( |
||||
[ "${memory['free']}" -lt "$mem_warning_cutoff_limit" ] || |
||||
echo "$mem_percent_free" "$mem_warning_cutoff_percent" | \ |
||||
awk '{exit $1 < $2 ? 0 : 1}' |
||||
); then |
||||
mem_free_color="${COLOR_BYellow}" |
||||
else |
||||
mem_free_color="${COLOR_BGreen}" |
||||
fi |
||||
# Format memory display |
||||
for k in "${!memory[@]}"; do |
||||
memory["$k"]="$( |
||||
awk -v m="${memory["$k"]}" -v u="$mem_units" -v d="$mem_decimals" \ |
||||
'BEGIN { printf "%.*f", d, m / u }' |
||||
)" |
||||
done |
||||
mem_msg="Memory: ${mem_free_color}${memory['free']}${COLOR_NC}/" |
||||
mem_msg+="${COLOR_BWhite}${memory['total']}${COLOR_NC} ${mem_label} available" |
||||
echo -e "$mem_msg" |
||||
echo 'HDDs:' |
||||
echo -en "$(_bashrc_randomcolor)" && |
||||
df -mh \ |
||||
--type=btrfs \ |
||||
--type=ext4 \ |
||||
--type=ext3 \ |
||||
--type=ext2 \ |
||||
--type=vfat \ |
||||
--type=tiso9660 \ |
||||
--type=xfs \ |
||||
--type=fuseblk \ |
||||
--type=ntfs \ |
||||
&& |
||||
echo -en "${COLOR_NC}" |
||||
echo |
||||
} |
||||
|
||||
# returns completion items for .* functions |
||||
# notably returns files/dirs in parent directories from PWD |
||||
function _bashrc_.complete { |
||||
local cmd word |
||||
cmd="$1" |
||||
word=${COMP_WORDS[COMP_CWORD]} |
||||
|
||||
if ! grep -q -E '^\.[.1-9]$' <<< "$cmd"; then |
||||
echo "${FUNCNAME[0]}: parent function must match '.[.1-9]'" |
||||
return 1 |
||||
fi |
||||
|
||||
local parent_depth path_array i parent_path word_list matched_word |
||||
parent_depth="${cmd//.}" |
||||
if [ -z "$parent_depth" ]; then |
||||
parent_depth=1 |
||||
fi |
||||
path_array=() |
||||
for (( i=0; i<parent_depth; i++ )); do |
||||
path_array+=( '..' ) |
||||
done |
||||
parent_path="$(_bashrc_join_by '/' "${path_array[@]}")" |
||||
|
||||
COMPREPLY=() |
||||
word_list="$( |
||||
printf "%s\\n" "$parent_path"/*/ | |
||||
sed -e 's|^\(../\)*||' -e 's| |\\ |g' |
||||
)" |
||||
while IFS='' read -r matched_word; do |
||||
if [[ "$matched_word" =~ ^$word ]]; then |
||||
COMPREPLY+=( "$matched_word" ) |
||||
fi |
||||
done <<< "$word_list" |
||||
} |
||||
|
||||
# Prints color sequence according to the token type passed |
||||
# Prints red if user is root |
||||
function _ps1_color { |
||||
if [ $# -ne 1 ]; then return; fi |
||||
local color |
||||
|
||||
if [ "$1" = 'prompt' ]; then |
||||
# process this before root check so typed text is not colored |
||||
color="${COLOR_NC}" |
||||
elif [ "$EUID" -eq 0 ]; then |
||||
# this user is root, color the ps1 red! |
||||
color="${COLOR_Red}" |
||||
else |
||||
case "$1" in |
||||
bracket) |
||||
color="${COLOR_White}" |
||||
;; |
||||
user|host) |
||||
# use different color if SSH_CLIENT var is set |
||||
if [[ -n "$SSH_CLIENT" ]]; then |
||||
color="${COLOR_Blue}" |
||||
else |
||||
color="${COLOR_Green}" |
||||
fi |
||||
;; |
||||
path) |
||||
color="${COLOR_Yellow}" |
||||
;; |
||||
branch) |
||||
color="${COLOR_Cyan}" |
||||
;; |
||||
preprompt) |
||||
color="${COLOR_White}" |
||||
;; |
||||
\@) |
||||
color="${COLOR_Red}" |
||||
;; |
||||
*) |
||||
color="${COLOR_NC}" |
||||
;; |
||||
esac |
||||
fi |
||||
echo -e "$color" |
||||
} |
||||
|
||||
# PS1 builder and history appender |
||||
# see _ps1_color for color reference for each PS1 segment |
||||
# Note: all non-printing sequences must be surrounded by \[ \] |
||||
# Note: bash PS1 title can only reference variables eg. $PWD |
||||
# (calling functions causes errors in title eg. pwd) |
||||
function _bashrc_prompt_command { |
||||
# this must run first to capture exit status |
||||
local EXIT="$?" |
||||
|
||||
# append last command to history |
||||
history -a |
||||
|
||||
# set window title |
||||
# format: $PWD; $?=# |
||||
PS1='\[\e]0;'"$PWD"'; \$?='"$EXIT"'\007\]' |
||||
PS1+='\n' |
||||
|
||||
# set first line |
||||
# format: [user@host path] (git branch) |
||||
PS1+='\[$(_ps1_color bracket)\][\[$(_ps1_color user)\]\u\[$(_ps1_color @)\]@\[$(_ps1_color host)\]\[$(hostname -f 2>/dev/null || hostname)\] \[$(_ps1_color path)\]\w\[$(_ps1_color bracket)\]]\[$(_ps1_color branch)\]\[$(__git_ps1 2>/dev/null)\]\[$(_ps1_color prompt)\]' |
||||
PS1+='\n' |
||||
|
||||
# set second line |
||||
# format: $ |
||||
PS1+='\[$(_ps1_color preprompt)\]\$\[$(_ps1_color prompt)\] ' |
||||
} |
||||
|
||||
# exit function |
||||
# source: http://tldp.org/LDP/abs/html/sample-bashrc.html |
||||
function _bashrc_exit { |
||||
echo -e "$(_bashrc_randomcolor)Bye!${COLOR_NC}" |
||||
sleep 0.5 |
||||
} |
||||
trap _bashrc_exit EXIT |
||||
|
||||
|
||||
## public functions (intended for termial use) |
||||
# find a file with a pattern in its name |
||||
# source: http:/tldp.org/LDP/abs/html/sample-bashrc.html |
||||
function ff { |
||||
find . -type f -iname '*'"$*"'*' -ls ; |
||||
} |
||||
|
||||
# simple extract script |
||||
# source: http://tldp.org/LDP/abs/html/sample-bashrc.html |
||||
function extract { |
||||
if [ -f "$1" ]; then |
||||
case "$1" in |
||||
*.tar.bz2) tar xvjf "$1" ;; |
||||
*.tar.gz) tar xvzf "$1" ;; |
||||
*.tar.xz) tar xJf "$1" ;; |
||||
*.bz2) bunzip2 "$1" ;; |
||||
*.rar) unrar x "$1" ;; |
||||
*.gz) gunzip "$1" ;; |
||||
*.tar) tar xvf "$1" ;; |
||||
*.tbz2) tar xvjf "$1" ;; |
||||
*.tgz) tar xvzf "$1" ;; |
||||
*.xz) xz -dk "$1" ;; |
||||
*.zip) mkdir "${1%.*}" && unzip "$1" -d "${1%.zip}" ;; |
||||
*.Z) uncompress "$1" ;; |
||||
*.7z) 7z x "$1" ;; |
||||
*) echo "'$1' cannot be extracted "\ |
||||
"via >${FUNCNAME[0]}<" ;; |
||||
esac |
||||
else |
||||
echo "'$1' is not a valid file!" |
||||
fi |
||||
} |
||||
|
||||
# functions for fast traversal through parent directories |
||||
# each processes at most one parameter containing the path to traverse |
||||
# after going up N levels, where N is the number in the function name |
||||
function .. { |
||||
.1 "$1" |
||||
} |
||||
|
||||
function .1 { |
||||
local prepend_path |
||||
prepend_path=.. |
||||
_bashrc_.cd "${prepend_path}/${1}" |
||||
} |
||||
|
||||
function .2 { |
||||
local prepend_path |
||||
prepend_path=../.. |
||||
_bashrc_.cd "${prepend_path}/${1}" |
||||
} |
||||
|
||||
function .3 { |
||||
local prepend_path |
||||
prepend_path=../../.. |
||||
_bashrc_.cd "${prepend_path}/${1}" |
||||
} |
||||
|
||||
function .4 { |
||||
local prepend_path |
||||
prepend_path=../../../.. |
||||
_bashrc_.cd "${prepend_path}/${1}" |
||||
} |
||||
|
||||
function .5 { |
||||
local prepend_path |
||||
prepend_path=../../../../.. |
||||
_bashrc_.cd "${prepend_path}/${1}" |
||||
} |
||||
|
||||
function .6 { |
||||
local prepend_path |
||||
prepend_path=../../../../../.. |
||||
_bashrc_.cd "${prepend_path}/${1}" |
||||
} |
||||
|
||||
function .7 { |
||||
local prepend_path |
||||
prepend_path=../../../../../../.. |
||||
_bashrc_.cd "${prepend_path}/${1}" |
||||
} |
||||
|
||||
function .8 { |
||||
local prepend_path |
||||
prepend_path=../../../../../../../.. |
||||
_bashrc_.cd "${prepend_path}/${1}" |
||||
} |
||||
|
||||
function .9 { |
||||
local prepend_path |
||||
prepend_path=../../../../../../../../.. |
||||
_bashrc_.cd "${prepend_path}/${1}" |
||||
} |
||||
|
||||
|
||||
# programmable completion |
||||
# source available completion file |
||||
if [ -f /etc/bash_completion ]; then |
||||
# shellcheck disable=SC1091 |
||||
. /etc/bash_completion |
||||
fi |
||||
|
||||
# common completions |
||||
complete -A hostname rsh rcp telnet rlogin ftp ping disk |
||||
complete -A export printenv |
||||
complete -A variable export local readonly unset |
||||
complete -A enabled builtin |
||||
complete -A alias alias unalias |
||||
complete -A function function |
||||
complete -A user su mail finger |
||||
complete -A helptopic help |
||||
complete -A shopt shopt |
||||
complete -A stopped -P '%' bg |
||||
complete -A job -P '%' fg jobs disown |
||||
complete -A directory mkdir rmdir |
||||
complete -A directory -o default cd |
||||
|
||||
# compression |
||||
complete -f -o default -X '*.+(zip|ZIP)' zip |
||||
complete -f -o default -X '!*.+(zip|ZIP)' unzip |
||||
complete -f -o default -X '*.+(z|Z)' compress |
||||
complete -f -o default -X '!*.+(z|Z)' uncompress |
||||
complete -f -o default -X '*.+(gz|GZ)' gzip |
||||
complete -f -o default -X '!*.+(gz|GZ)' gunzip |
||||
complete -f -o default -X '*.+(bz2|BZ2)' bzip2 |
||||
complete -f -o default -X '!*.+(bz2|BZ2)' bunzip2 |
||||
complete -f -o default -X '!*.+(zip|ZIP|z|Z|gz|GZ|xz|XZ|bz2|BZ2)' extract |
||||
|
||||
complete -f -o default -X '!*.pl' perl perl5 |
||||
|
||||
complete -F _bashrc_.complete .. .1 .2 .3 .4 .5 .6 .7 .8 .9 |
||||
|
||||
### run setup |
||||
# load SSH keys |
||||
_bashrc_ssh-add-keys |
||||
|
||||
# echo motd |
||||
_bashrc_motd |
||||
|
||||
# sets PS1, appends to history |
||||
PROMPT_COMMAND="_bashrc_prompt_command" |
||||
PS2='\[$(_ps1_color preprompt)\]>\[$(_ps1_color prompt)\] ' |
@ -0,0 +1,63 @@ |
||||
[alias] |
||||
alias = !git config --get-regexp '^alias\\.' | cut -d '.' -f '2-' | sed -re 's/^([^ ]+) /\\1*/g' | column -s '*' -t | sort |
||||
amend = commit --amend --no-edit |
||||
amend-all = commit -a --amend --no-edit |
||||
# TODO: fix below; that method is not accurate |
||||
# check-merge = "!f() { output=$(git format-patch ${1:-master} --stdout | git apply --3way --check - 2>/dev/null); exit_code=$?; if [ $exit_code != '0' ] && [ $exit_code != '128' ]; then echo 'Merge conflicts exist! See `git apply` output below:'; echo; echo $output; fi; }; f" |
||||
co-pr = "!f() { [ $# -ne 2 ] && echo 'Two arguments required, PR # and branch name' && exit 1; git fetch upstream pull/$1/head:$2-$1 && git checkout $2-$1 && git merge master --no-gpg-sign --no-edit; }; f" |
||||
fixup = commit --amend --no-edit |
||||
ll = log --pretty=format:"%C(yellow)%h%C(red)%d%C(reset)\\ %s\\ %C(blue)%C(bold)[%aN]%C(reset)" --decorate --numstat |
||||
lo = log --oneline --decorate |
||||
ls = log --pretty=format:"%C(yellow)%h%C(red)%d%C(reset)\\ %s\\ %C(blue)%C(bold)[%aN]%C(reset)" --decorate |
||||
lsd = log --pretty=format:"%C(yellow)%h\\ %ad%C(red)%d%C(reset)\\ %s\\ %C(blue)%C(bold)[%aN]%C(reset)" --decorate --date=short |
||||
lsdr = log --pretty=format:"%C(yellow)%h\\ %ad%C(red)%d%C(reset)\\ %s\\ %C(blue)%C(bold)[%aN]%C(reset)" --decorate --date=relative |
||||
pullf = pull --ff-only |
||||
pullfsur = !git pull --ff-only && git submodule update --recursive |
||||
pullr = pull --rebase |
||||
pullrp = !git pull --rebase && git push |
||||
pullrsur = !git pull --rebase && git submodule update --recursive |
||||
pullrsurp = !git pull --rebase && git submodule update --recursive && git push |
||||
reword = commit --amend |
||||
sur = submodule update --recursive |
||||
[apply] |
||||
whitespace = fix |
||||
[branch] |
||||
autosetupmerge = always |
||||
autosetuprebase = always |
||||
[color] |
||||
branch = auto |
||||
diff = auto |
||||
interactive = true |
||||
status = auto |
||||
[core] |
||||
autocrlf = false |
||||
fscache = true |
||||
longpaths = true |
||||
pager = less -x1,5 |
||||
whitespace = cr-at-eol,tabwidth=4,trailing-space |
||||
[diff] |
||||
colormoved = default |
||||
renames = copies |
||||
submodule = log |
||||
wsErrorHighlight = old,new |
||||
[diff "astextplain"] |
||||
# diff document files based on their text contents rather than binaries |
||||
textconv = astextplain |
||||
[fetch] |
||||
prune = true |
||||
[help] |
||||
autocorrect = 20 |
||||
[include] |
||||
# Define system-specific user configs such as GPG signing key |
||||
path = ~/.user.gitconfig |
||||
[push] |
||||
default = current |
||||
[rebase] |
||||
autosquash = true |
||||
[status] |
||||
submodulesummary = true |
||||
[submodule] |
||||
fetchjobs = 0 |
||||
[user] |
||||
name = Jordan Atwood |
||||
email = nightfirecat@nightfirec.at |
@ -0,0 +1,41 @@ |
||||
# This file controls the behavior of line input editing for programs which use |
||||
# the GNU Readline library. |
||||
# |
||||
# The inputrc file can be re-read using <C-x> <C-r>. |
||||
# Lines beginning with '#' are comments. |
||||
|
||||
# Include any system-wide bindings and variable assignments from /etc/Inputrc |
||||
$include /etc/inputrc |
||||
|
||||
# Performs filename matching and completion in a case-insensitive fashion. |
||||
set completion-ignore-case on |
||||
|
||||
# Treat hyphens (-) and underscores (_) as equivalent when performing case-insensitive filename matching and completion. |
||||
# Requires `completion-ignore-case on` |
||||
set completion-map-case on |
||||
|
||||
# Configure the terminal in a way that will enable it to insert each paste into the editing buffer as a single string of |
||||
# characters, instead of treating each character as if it had been read from the keyboard. This can prevent pasted |
||||
# characters from being interpreted as editing commands. |
||||
set enable-bracketed-paste |
||||
|
||||
# Displays possible completions using different colors to indicate their file type. |
||||
set colored-stats on |
||||
|
||||
# Completed names which are symbolic links to directories have a slash appended. |
||||
set mark-symlinked-directories on |
||||
|
||||
# Words which have more than one possible completion cause the matches to be listed immediately instead of ringing the |
||||
# bell. |
||||
set show-all-if-ambiguous |
||||
|
||||
# Do not insert characters from the completion that match characters after point in the word being completed, so |
||||
# portions of the word following the cursor are not duplicated. |
||||
set skip-completed-text on |
||||
|
||||
# Add history searching. That is, map the up and down arrow keys to search for |
||||
# completions from the current line from command history. |
||||
# eg. If "git" is typed, hitting UP will move to the most recent "git" command |
||||
# in history. |
||||
"\e[A": history-search-backward |
||||
"\e[B": history-search-forward |
@ -0,0 +1,13 @@ |
||||
# https://github.com/BurntSushi/ripgrep/blob/master/GUIDE.md#configuration-file |
||||
|
||||
# Limit output width |
||||
--max-columns=150 |
||||
|
||||
# Print Unix-style paths |
||||
--path-separator=/ |
||||
|
||||
# Search hidden files and directories |
||||
--hidden |
||||
|
||||
# Don't search .git directories |
||||
--glob=!.git |
@ -0,0 +1,94 @@ |
||||
" When started as "evim", evim.vim will already have done these settings, bail |
||||
" out. |
||||
if v:progname =~? "evim" |
||||
finish |
||||
endif |
||||
|
||||
" Get the defaults that most users want |
||||
source $VIMRUNTIME/defaults.vim |
||||
|
||||
" Don't keep context lines around cursor |
||||
set scrolloff=0 |
||||
|
||||
" do not keep backup files or undo files (they clutter filesystem) |
||||
set nobackup |
||||
set noundofile |
||||
|
||||
" Put these in an autocmd group so that we can delete them easily |
||||
augroup vimrc |
||||
au! |
||||
|
||||
" For all text files set 'textwidth' to 80 characters |
||||
autocmd FileType text setlocal textwidth=80 |
||||
augroup END |
||||
|
||||
" Add optional packages |
||||
" |
||||
" The matchit plugin makes the % command work better, but it is not backwards |
||||
" compatible. |
||||
" The ! means the package won't be loaded right away but when plugins are |
||||
" loaded during initialization. |
||||
if has('syntax') && has('eval') |
||||
packadd! matchit |
||||
endif |
||||
|
||||
" Enable re-use of the same window to switch from an unsaved buffer without |
||||
" saving it first. Also allows you to keep an undo history for multiple files |
||||
" when re-using the same window in this way. |
||||
set hidden |
||||
|
||||
" Highlight searches (use <C-L> to temporarily turn off highlighting; see the |
||||
" mapping of <C-L> below) |
||||
if &t_Co > 2 || has("gui_running") |
||||
set hlsearch |
||||
endif |
||||
|
||||
" Use case insensitive search, except when using capital letters |
||||
set ignorecase |
||||
set smartcase |
||||
|
||||
" When opening a new line and no filetype-specific indenting is enabled, keep |
||||
" the same indent as the line you're currently on. Useful for READMEs, etc. |
||||
set autoindent |
||||
|
||||
" Stop certain movements from always going to the first character of a line. |
||||
" While this behavior deviates from that of Vi, it does what most users coming |
||||
" from other editors would expect. |
||||
set nostartofline |
||||
|
||||
" Instead of failing a command because of unsaved changes, instead raise a |
||||
" dialogue asking if you wish to save changed files. |
||||
set confirm |
||||
|
||||
" Use visual bell instead of beeping when doing something wrong |
||||
set visualbell |
||||
|
||||
" And reset the terminal code for the visual bell. If visualbell is set, and |
||||
" this line is also included, vim will neither flash nor beep. If visualbell |
||||
" is unsetl, this does nothing. |
||||
set t_vb= |
||||
|
||||
" Set the command window height to 2 lines, to avoid many cases of having to |
||||
" "press <Enter> to continue" |
||||
set cmdheight=2 |
||||
|
||||
" Quickly time out on keycodes, but never time out on mappings |
||||
set notimeout ttimeout ttimeoutlen=200 |
||||
|
||||
" Use <F11> to toggle between 'paste' and 'nopaste' |
||||
set pastetoggle=<F11> |
||||
|
||||
" Use 4-width tabs |
||||
" Force tabs over spaces for indentation |
||||
" Use one tab when using Vim shifts |
||||
set tabstop=4 softtabstop=0 noexpandtab shiftwidth=4 |
||||
|
||||
" Jump to last position when reopening a file |
||||
if has('autocmd') |
||||
au BufReadPost * if line ("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif |
||||
autocmd BufReadPost COMMIT_EDITMSG | exe "normal! gg" |
||||
endif |
||||
|
||||
" Map <C-L> (redraw screen) to also turn off search highlighting until the |
||||
" next search |
||||
nnoremap <C-L> :nohl<CR><C-L> |
Loading…
Reference in new issue