diff --git a/.bashrc b/.bashrc index a1054d8..60ab6e6 100644 --- a/.bashrc +++ b/.bashrc @@ -6,14 +6,16 @@ # # Reference: https://wiki.thurstylark.com/Bashrc.html -### MISC ### +### GENERAL CONFIG ### # If not running interactively, don't do anything [[ $- != *i* ]] && return -HISTCONTROL=ignoreboth # Don't put duplicate lines or lines starting with space in the history. +# Don't put duplicate lines or lines starting with space in the history. +HISTCONTROL=ignoreboth -shopt -s autocd # If a directory is given without any command, CD into it. +# If a directory is given without any command, CD into it. +shopt -s autocd # Some programs, such as tee(1), like to use this variable export LS_COLORS='di=34;40:ln=35;40:so=32;40:pi=33;40:ex=31;40:bd=34;46:cd=34;43:su=0;41:sg=0;46:tw=0;42:ow=0;43:' @@ -25,197 +27,13 @@ export LS_COLORS='di=34;40:ln=35;40:so=32;40:pi=33;40:ex=31;40:bd=34;46:cd=34;43 [[ -s /usr/share/doc/pkgfile/command-not-found.bash ]] && source /usr/share/doc/pkgfile/command-not-found.bash -# Enables colored Man pages: -man() { - env LESS_TERMCAP_mb=$'\E[01;31m' \ - LESS_TERMCAP_md=$'\E[01;38;5;74m' \ - LESS_TERMCAP_me=$'\E[0m' \ - LESS_TERMCAP_se=$'\E[0m' \ - LESS_TERMCAP_so=$'\E[38;5;246m' \ - LESS_TERMCAP_ue=$'\E[0m' \ - LESS_TERMCAP_us=$'\E[04;38;5;146m' \ - man "$@" -} +### UTILITIES ### -# Do the same for awman -awman() { - env LESS_TERMCAP_mb=$'\E[01;31m' \ - LESS_TERMCAP_md=$'\E[01;38;5;74m' \ - LESS_TERMCAP_me=$'\E[0m' \ - LESS_TERMCAP_se=$'\E[0m' \ - LESS_TERMCAP_so=$'\E[38;5;246m' \ - LESS_TERMCAP_ue=$'\E[0m' \ - LESS_TERMCAP_us=$'\E[04;38;5;146m' \ - awman "$@" -} +# Source all *.sh files in ~/.bashrc.d/ +# This way all my useful little utilities are easier to reference and fix +for f in ~/.bashrc.d/*.sh; do source $f; done -### PROMPT ### - -promptsetup() { - # Color definitions for prompt - local fg_brightred='\[$(tput setaf 9)\]' - local fg_blue='\[$(tput setaf 4)\]' - local fg_magenta='\[$(tput setaf 13)\]' - local fg_cyan='\[$(tput setaf 6)\]' - local fg_brightcyan='\[$(tput setaf 14)\]' - local fg_green='\[$(tput setaf 2)\]' - local reset='\[$(tput sgr0)\]' - local hostname='\h' - local mixin - - # [hh:mm][username@hostname pwd]$ - - # Remotely, hostname is red. - [ -n "$SSH_CLIENT" ] && hostname="${fg_brightred}\h${reset}" - - # If in a python venv, add venv name in green. - [ -n "$VIRTUAL_ENV" ] && mixin=" ${fg_green}$(basename $VIRTUAL_ENV)${reset}" - - # If in a vcsh repo env, add repo name in magenta. - [ -n "$VCSH_REPO_NAME" ] && mixin=" ${fg_magenta}$VCSH_REPO_NAME${reset}" - - PS1="${fg_blue}[\A]${fg_cyan}[${fg_brightcyan}\u${fg_cyan}@${hostname}${mixin} ${fg_cyan}\W]${reset}\$ " -} - -promptsetup - -### ALIASES ### - -# Colorize all `ls` output: -alias ls='ls -AF --color=auto' - -# Map "la" to `ls -la` -alias la='ls -laFh --color=auto' - -# Colorize `grep` output -alias grep='grep --color=auto' - -# Change layout of lsblk to include FSTYPE and remove MAJ:MIN, RM, and RO collumns. -alias lsblk='lsblk -o NAME,FSTYPE,SIZE,TYPE,MOUNTPOINT' - -# Always use sudo when using nmap. -alias nmap='sudo -E nmap' - -# Switch $TERM temporarily (for logging into machines that don't have tmux-256color terminfo) -alias screenterm='TERM=screen-256color' - -# I'm tired of managing weechat configs and multiple nicks -# Reference: https://wiki.thurstylark.com/Weechat.html - -# If you don't have weechat installed, connect to the existing tmux session through mosh -[[ ! -s /usr/bin/weechat ]] && alias weechat='mosh vps -- tmux attach -dt weechat' -# If you are thurstylark-vps, connect to the existing tmux session locally -[[ "$HOSTNAME" = "thurstylark-vps" ]] && alias weechat='tmux attach -dt weechat' - -### FUNCTIONS ### - -# Print Dell Service Tag -getdst() { - if [[ "$1" = "-l" ]]; then - printf "http://www.dell.com/support/home/us/en/04/product-support/servicetag/%s/configuration\n" "$(getdst)" - else - sudo dmidecode -s system-serial-number - fi -} - -countdown() { - local secs="$1" - while [ $secs -gt 0 ]; do - echo -ne "$secs\033[0K\r" - sleep 1 - : $((secs--)) - done -} - -# Screenshot utils -shot() { - # Usage: shot XY - local destdir="$HOME/Pictures/screenshots" - local fname="shot-$(date +%F-%T).png" - local pb="fb" - local paste msgt msgd opts - - if [ -z "$1" ]; then - printf "Usage: shot XY -X: Target -Y: Destination - -Valid Targets: -w Active Window -a All displays -s Mouse Selection - -Valid Destinations: -f Save to file (defined in function) -p Upload to a pastebin (defined in function) -" - return - fi - - # X: What to capture - case ${1:0:1} in - # Active window - w) printf "Focus target window now...\n" - opts="-i $(xdotool getactivewindow)" - msgt="active window" - ;; - # All - a) msgt="all displays" - ;; - # Mouse selection - s) opts="-s --noopengl" - msgt="mouse selection" - ;; - - *) printf "Unknown target: %s\n" "${1:0:1}" - return - ;; - esac - # Y: Where to put the result - case ${1:1:1} in - # Save to file - f) msgd="file: $destdir/$fname" - ;; - # Post to a pastebin - p) destdir=$destdir/pasted - msgd="pastebin" - paste=1;; - - *) printf "Unknown destination: %s\n" "${1:1:1}" - return - ;; - esac - - # Make sure destination directory will exist - [[ ! -d "$destdir" ]] && mkdir -p "$destdir" - local fpath="${destdir}/${fname}" - # If target is active window, give a 5 second countdown before running maim - [[ "$msgt" = "active window" ]] && countdown 5 - - maim $opts "$fpath" - printf "Captured %s -> %s\n" "$msgt" "$msgd" - # If destination is a pastebin, do the needful - [[ "$paste" ]] && $pb "$fpath" -} - -fontfind() { if [[ -z $1 || ${#1} -gt 1 ]]; then - printf "E: only one character accepted" - fi - local glyph=$1 - FC_DEBUG=4 pango-view -qt "$glyph" 2>&1 | awk -F \" '/family: / { m = $2 } END { print m }' -} - -vactivate() { - local path=~/.venv/$1 - - if [[ ! -d $path ]]; then - python -m venv --prompt "venv: $1" --system-site-packages $path - fi - source $path/bin/activate; bash; deactivate -} - -# Append a local bashrc if it exists. This gives the ability to insert untracked +# Source a local bashrc if it exists. This gives the ability to insert untracked # modifications to this .bashrc - [[ -s ~/.local.bashrc ]] && source ~/.local.bashrc diff --git a/.bashrc.d/alias.sh b/.bashrc.d/alias.sh new file mode 100644 index 0000000..d373002 --- /dev/null +++ b/.bashrc.d/alias.sh @@ -0,0 +1,19 @@ +### ALIASES ### + +# Colorize all `ls` output: +alias ls='ls -AF --color=auto' + +# Map "la" to `ls -la` +alias la='ls -laFh --color=auto' + +# Colorize `grep` output +alias grep='grep --color=auto' + +# Change layout of lsblk to include FSTYPE and remove MAJ:MIN, RM, and RO collumns. +alias lsblk='lsblk -o NAME,FSTYPE,SIZE,TYPE,MOUNTPOINT' + +# Always use sudo when using nmap. +alias nmap='sudo -E nmap' + +# Switch $TERM temporarily (for logging into machines that don't have tmux-256color terminfo) +alias screenterm='TERM=screen-256color' diff --git a/.bashrc.d/colored-man-pages.sh b/.bashrc.d/colored-man-pages.sh new file mode 100644 index 0000000..9731b26 --- /dev/null +++ b/.bashrc.d/colored-man-pages.sh @@ -0,0 +1,23 @@ +# Enables colored Man pages: +man() { + env LESS_TERMCAP_mb=$'\E[01;31m' \ + LESS_TERMCAP_md=$'\E[01;38;5;74m' \ + LESS_TERMCAP_me=$'\E[0m' \ + LESS_TERMCAP_se=$'\E[0m' \ + LESS_TERMCAP_so=$'\E[38;5;246m' \ + LESS_TERMCAP_ue=$'\E[0m' \ + LESS_TERMCAP_us=$'\E[04;38;5;146m' \ + man "$@" +} + +# Do the same for awman +awman() { + env LESS_TERMCAP_mb=$'\E[01;31m' \ + LESS_TERMCAP_md=$'\E[01;38;5;74m' \ + LESS_TERMCAP_me=$'\E[0m' \ + LESS_TERMCAP_se=$'\E[0m' \ + LESS_TERMCAP_so=$'\E[38;5;246m' \ + LESS_TERMCAP_ue=$'\E[0m' \ + LESS_TERMCAP_us=$'\E[04;38;5;146m' \ + awman "$@" +} diff --git a/.bashrc.d/countdown.sh b/.bashrc.d/countdown.sh new file mode 100644 index 0000000..bf1aa0d --- /dev/null +++ b/.bashrc.d/countdown.sh @@ -0,0 +1,8 @@ +countdown() { + local secs="$1" + while [ $secs -gt 0 ]; do + echo -ne "$secs\033[0K\r" + sleep 1 + : $((secs--)) + done +} diff --git a/.bashrc.d/fontfind.sh b/.bashrc.d/fontfind.sh new file mode 100644 index 0000000..4ae60ec --- /dev/null +++ b/.bashrc.d/fontfind.sh @@ -0,0 +1,6 @@ +fontfind() { if [[ -z $1 || ${#1} -gt 1 ]]; then + printf "E: only one character accepted" + fi + local glyph=$1 + FC_DEBUG=4 pango-view -qt "$glyph" 2>&1 | awk -F \" '/family: / { m = $2 } END { print m }' +} diff --git a/.bashrc.d/getdst.sh b/.bashrc.d/getdst.sh new file mode 100644 index 0000000..03a6386 --- /dev/null +++ b/.bashrc.d/getdst.sh @@ -0,0 +1,8 @@ +# Print Dell Service Tag +getdst() { + if [[ "$1" = "-l" ]]; then + printf "http://www.dell.com/support/home/us/en/04/product-support/servicetag/%s/configuration\n" "$(getdst)" + else + sudo dmidecode -s system-serial-number + fi +} diff --git a/.bashrc.d/prompt.sh b/.bashrc.d/prompt.sh new file mode 100644 index 0000000..21f9c5c --- /dev/null +++ b/.bashrc.d/prompt.sh @@ -0,0 +1,27 @@ +promptsetup() { + # Color definitions for prompt + local fg_brightred='\[$(tput setaf 9)\]' + local fg_blue='\[$(tput setaf 4)\]' + local fg_magenta='\[$(tput setaf 13)\]' + local fg_cyan='\[$(tput setaf 6)\]' + local fg_brightcyan='\[$(tput setaf 14)\]' + local fg_green='\[$(tput setaf 2)\]' + local reset='\[$(tput sgr0)\]' + local hostname='\h' + local mixin + + # [hh:mm][username@hostname pwd]$ + + # Remotely, hostname is red. + [ -n "$SSH_CLIENT" ] && hostname="${fg_brightred}\h${reset}" + + # If in a python venv, add venv name in green. + [ -n "$VIRTUAL_ENV" ] && mixin=" ${fg_green}$(basename $VIRTUAL_ENV)${reset}" + + # If in a vcsh repo env, add repo name in magenta. + [ -n "$VCSH_REPO_NAME" ] && mixin=" ${fg_magenta}$VCSH_REPO_NAME${reset}" + + PS1="${fg_blue}[\A]${fg_cyan}[${fg_brightcyan}\u${fg_cyan}@${hostname}${mixin} ${fg_cyan}\W]${reset}\$ " +} + +promptsetup diff --git a/.bashrc.d/shot.sh b/.bashrc.d/shot.sh new file mode 100644 index 0000000..eed2745 --- /dev/null +++ b/.bashrc.d/shot.sh @@ -0,0 +1,70 @@ +# Screenshot utils +shot() { + # Usage: shot XY + local destdir="$HOME/Pictures/screenshots" + local fname="shot-$(date +%F-%T).png" + local pb="fb" + local paste msgt msgd opts + + if [ -z "$1" ]; then + printf "Usage: shot XY +X: Target +Y: Destination + +Valid Targets: +w Active Window +a All displays +s Mouse Selection + +Valid Destinations: +f Save to file (defined in function) +p Upload to a pastebin (defined in function) +" + return + fi + + # X: What to capture + case ${1:0:1} in + # Active window + w) printf "Focus target window now...\n" + opts="-i $(xdotool getactivewindow)" + msgt="active window" + ;; + # All + a) msgt="all displays" + ;; + # Mouse selection + s) opts="-s --noopengl" + msgt="mouse selection" + ;; + + *) printf "Unknown target: %s\n" "${1:0:1}" + return + ;; + esac + # Y: Where to put the result + case ${1:1:1} in + # Save to file + f) msgd="file: $destdir/$fname" + ;; + # Post to a pastebin + p) destdir=$destdir/pasted + msgd="pastebin" + paste=1;; + + *) printf "Unknown destination: %s\n" "${1:1:1}" + return + ;; + esac + + # Make sure destination directory will exist + [[ ! -d "$destdir" ]] && mkdir -p "$destdir" + local fpath="${destdir}/${fname}" + # If target is active window, give a 5 second countdown before running maim + [[ "$msgt" = "active window" ]] && countdown 5 + + maim $opts "$fpath" + printf "Captured %s -> %s\n" "$msgt" "$msgd" + # If destination is a pastebin, do the needful + [[ "$paste" ]] && $pb "$fpath" +} diff --git a/.bashrc.d/vactivate.sh b/.bashrc.d/vactivate.sh new file mode 100644 index 0000000..b4d83c0 --- /dev/null +++ b/.bashrc.d/vactivate.sh @@ -0,0 +1,8 @@ +vactivate() { + local path=~/.venv/$1 + + if [[ ! -d $path ]]; then + python -m venv --prompt "venv: $1" --system-site-packages $path + fi + source $path/bin/activate; bash; deactivate +}