=Bashrc= Source: https://git.thurstylark.com/vcsh/bashrc.git ---- ==Prompt== I originally built my prompt using http://bashrcgenerator.com and, while it's a nice tool for visually building a prompt, it has several limitations on what you're able to create with it. But more importantly to me, it generates a rediculously long string, defines and resets color for every single character, uses both a color and bold escape sequence to use light/bright colors, mixes raw escape sequences and subshells running tput, and as a result is utterly unreadable and unmaintainable. So, I replaced it: {{{class="prettyprint" ### 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 reset='\[$(tput sgr0)\]' # [hh:mm][username@hostname pwd]$ if [ -n "$SSH_CLIENT" ]; then # Remotely, hostname is red. PS1="${fg_blue}[\A]${fg_cyan}[${fg_brightcyan}\u${fg_cyan}@${fg_brightred}\h ${fg_cyan}\W]${reset}\$ " elif [ -n "$VCSH_REPO_NAME" ]; then # If in a vcsh repo env, add repo name in magenta. PS1="${fg_blue}[\A]${fg_cyan}[${fg_brightcyan}\u${fg_cyan}@\h ${fg_magenta}$VCSH_REPO_NAME ${fg_cyan}\W]${reset}\$ " else # Locally, hostname is cyan. PS1="${fg_blue}[\A]${fg_cyan}[${fg_brightcyan}\u${fg_cyan}@\h \W]${reset}\$ " fi } promptsetup }}} I intentionally put everything in a function and call it immediately so I may use local vars for the color definitions. I didn't really want to leave them around just in case. ---- ==Profile== Bash chooses which dotfile to source based on how it gets run. If starting from a login shell, `~/.bash_profile` will get sourced, but if there's not a command in there to source your `~/.bashrc`, you may find yourself having to `exec bash` after starting bash. This can be fixed by adding the following line to your `~/.bash_profile`: {{{class="prettyprint" [[ -f ~/.bashrc ]] && . ~/.bashrc }}} I also use `~/.bash_profile` for setting numlock while in a tty: {{{class="prettyprint" case $(tty) in /dev/tty[0-9]*) setleds -D +num # (numlock for X is set in ~/.xinitrc) ;; esac }}} The last thing of note in my `~/.bash_profile` is a warning: {{{class="prettyprint" # Temporary fix for a systemd bug related to systemd --user timers that run on login [[ -z "$DBUS_SESSION_BUS_ADDRESS" ]] && printf "%bWARNING: \$DBUS_SESSION_BUS_ADDRESS is unset! %b\n" "$(tput bold)$(tput setab 1)" "$(tput sgr0)" }}} ---- ==Weechat== The alias portion of my [[Weechat]] configuration is set in the .bashrc like so: {{{class="prettyprint" # 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' }}} For more info, see the [[Weechat]] page. ---- ==Get Dell Service Tag== I work with Dell machines a lot, and when dealing with hardware problems, it's nice to have the service tag handy. Lucky for me, the service tag is easily retrieveable using `dmidecode(1)`, so I made a function for it. {{{class="prettyprint" # Print Dell Service Tag getdst() { if [[ "$1" = "-l" ]]; then printf "http://www.dell.com/support/home/us/en/04/product-support/servicetag/%s\n" "$(getdst)" else sudo dmidecode -s system-serial-number fi } }}} As an added bonus, the `-l` option will print the url for that product's support page. ---- ==Screenshot== This function wraps `maim(1)` and `fb(1)` to simplify my most used options. It uses maim to capture either the full screen, the active window, or a mouse selection to a file, or directly to a pastebin. {{{class="prettyprint" # 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" } }}} This probably isn't the most robust solution, but it works pretty well. Patches welcome. ---- ==Countdown== Found this little function when I wanted to add functionality to `shot()`. It takes an integer as an argument, then counts down that number of seconds visually. {{{class="prettyprint" countdown() { local secs="$1" while [ $secs -gt 0 ]; do echo -ne "$secs\033[0K\r" sleep 1 : $((secs--)) done } }}} This probably isn't the sanest or safest solution to the problem, but it gets the job done. Patches welcome. ---- ==FontFind== Sometimes you just need to figure out what font provides a specific character. This function provides that solution: {{{class="prettyprint" 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== I started needing more than one python virtualenv, and I wanted easy access to my own specific file structure. Additionally, I wanted the ability to deactivate the venv like I would exit a child shell. This is the solution that I came up with: {{{class="prettyprint" vactivate() { local path=~/.venv/$1 if [[ ! -d $path ]]; then python -m venv $path --prompt "venv: $1" fi source $path/bin/activate; bash; deactivate } }}} A caveat to this is that the prompt modification that venv usually applies is not available using this method. If a prompt modification is desired, it needs to be taken care of elsewhere.