#!/bin/bash # # ~/.bashrc # # Thurstylark # # Reference: https://wiki.thurstylark.com/Bashrc.html ### MISC ### # 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. shopt -s autocd # If a directory is given without any command, CD into it. # 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:' # Prefer vim, but if it's not installed, nano will do [[ -s /usr/bin/vim ]] && export EDITOR=vim || export EDITOR=nano # Enable pkgfile to automatically search for packages if pkgfile is installed [[ -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 "$@" } # 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 "$@" } ### 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 # modifications to this .bashrc [[ -s ~/.local.bashrc ]] && source ~/.local.bashrc