about summary refs log tree commit diff
path: root/configs/shared/functions.zsh
diff options
context:
space:
mode:
Diffstat (limited to 'configs/shared/functions.zsh')
-rw-r--r--configs/shared/functions.zsh1174
1 files changed, 0 insertions, 1174 deletions
diff --git a/configs/shared/functions.zsh b/configs/shared/functions.zsh
deleted file mode 100644
index 6f4dfc95358a..000000000000
--- a/configs/shared/functions.zsh
+++ /dev/null
@@ -1,1174 +0,0 @@
-# NOTE: All functions should be documented. Including usage examples.
-# NOTE: Prioritize the error handling (especially error messages) as highly as
-# most people prioritize "happy-paths" (aka features).
-
-################################################################################
-# Personal dependencies
-################################################################################
-
-source ~/Dropbox/programming/db_cli/src/index.zsh
-
-
-################################################################################
-# Documentation and error messages
-################################################################################
-
-# TODO: Move these to their own repository.
-
-echo_info() {
-  # Echos an informational message.
-  #
-  # depends_variable blue
-  echo -e "${blue}[INFO]: $1"
-}
-
-echo_warn() {
-  # Echos a warning message.
-  # This function depends on the colors defined in variables.zsh.
-  #
-  # depends_variable yellow
-  echo -e "${yellow}[WARNING]: $1"
-}
-
-echo_error() {
-  # Echos an error message.
-  #
-  # depends_variable red
-  echo -e "${red}[ERROR]: $1"
-}
-
-unsupported_input() {
-  # Generic error message. Consume herein to standardize the error messages.
-  # Pass the supported inputs as $1.
-  #
-  # depends error_error
-  echo_error "Unsupported input. This function only supports the following inputs: $1. Exiting..."
-}
-
-depends() {
-  # Prints a message explaining a function's dependencies. Consume here to
-  # standardize the error messages.
-  # Pass the dependencies as $1.
-  #
-  # depends echo_info
-  echo_info "This function depends on the following functions: $@"
-}
-
-depends_variable() {
-  # Prints a message explaining a dependency on a variable. Consume here to
-  # standardize the error messages.
-  # Pass the dependencies as $1.
-  #
-  # depends echo_info
-  echo_info "This function depends on the following variables: $@"
-}
-
-depends_alias() {
-  # Prints a message explaining a dependency on a shell alias. Consume here to
-  # standardize the error messages.
-  # Pass the dependencies as $1.
-  #
-  # depends echo_info
-  echo_info "This function depends on the following aliases: $@"
-}
-
-compliments() {
-  # Prints a message explaining that a function compliments another function.
-  # Think of complimentary functions as `zip` and `unzip`.
-  #
-  # depends echo_info
-  echo_info "This function compliments the \`$1\` function."
-}
-
-
-################################################################################
-# Filesystem operations
-################################################################################
-
-ensure_dir() {
-  # Ensures that the directory and its children exist.
-  # Usage: ensure_dir <path-to-dir>
-  mkdir -p $1
-}
-
-ensure_file() {
-  # Ensures that the file and the path to that file exist.
-  # Usage: ensure_dir <path-to-file>
-  # depends ensure_dir
-  ensure_dir $(dirname $1) && touch $1
-}
-
-tar_dir() {
-  # Tars dir as dir.tar. Removes dir.
-  # compliments untar_dir
-  tar -cf  "$1.tar" "$(basename $1)" && rm -rf "$1"
-}
-
-untar_dir() {
-  # Untars dir.tar as dir. Removes dir.tar.
-  # compliments tar_dir
-  tar -xvf "$1" && rm "$1"
-}
-
-targz_dir() {
-  # Tars a dir as dir.tar.gz.
-  # compliments untargz_dir
-  tar -czf "$1.tar.gz" "$(basename $1)"; rm -rf "$1"
-}
-
-untargz_dir() {
-  # Untars dir.tar.gz as dir. Removes dir.tar.gz.
-  # compliments targz_dir
-  tar -xzvf "$1" && rm "$1"
-}
-
-zip_dir() {
-  # Zips dir as dir.zip. Removes dir.
-  # compliments unzip_dir
-  zip -r "$1.zip" "$(basename $1)" && rm -rf "$1"
-}
-
-unzip_dir() {
-  # Unzips dir.zip as dir. Removes dir.zip.
-  # compliments zip_dir
-  unzip "$1" && rm "$1"
-}
-
-archive() {
-  # Generic function for archiving directories
-  #
-  # depends tar_dir targz_dir zip_dir
-  # compliments unarchive
-  printf "Which type of archive would you like to like create? (tar, tar.gz, zip) "
-  case $(read -e) in
-    tar)    tar_dir   "$1";;
-    tar.gz) targz_dir "$1";;
-    zip)    zip_dir   "$1";;
-    *)      unsupported_input "tar, tar.gz, zip";;
-  esac
-}
-
-unarchive() {
-  # Generic way to unarchive files.
-  # Currently supports the following extensions:
-  # - .tar
-  # - .tar.gz
-  # - .zip
-  #
-  # depends untar unzip
-  # compliments archive
-  case $1 in
-    *.tar.gz) untargz_dir "$1";;
-    *.tar)    untar_dir   "$1";;
-    *.zip)    unzip_dir   "$1";;
-    *)        unsupported_input ".tar, .tar.zip, .zip"
-  esac
-}
-
-
-################################################################################
-# Filesystem operations
-################################################################################
-
-alert() {
-  # Send the user information via the GUI.
-  # Intended to have the same API as the Javascript alert function.
-  # Usage: alert [msg-body]
-  # depends notify-send
-  notify-send 'Info' "$1"
-}
-
-alert_echo() {
-  # Composes `echo` and `alert` together.
-  # Usage: alert_echo [msg-body]
-  # depends alert echo
-  echo "$1" && alert "$1"
-}
-
-
-################################################################################
-# Unclassified
-################################################################################
-
-deref() {
-  # Dereferences a symlink.
-  # Usage: deref [symlink]
-  if ! [ -L $1 ]; then
-    echo_error "File is not a symlink: $1. Exiting..."
-  else
-    local src=$(readlink -f $1)
-    echo "Moving $src -> $1" && \
-      mv $1 $1.bak && \
-      mv $src $1 && \
-      rm $1.bak
-  fi
-}
-
-wallpaper() {
-  # Select and load a wallpaper from the wallpaper directory.
-  local files=$(ls ~wallpaper)
-  local selection=$(echo $files | fzf)
-  local fullpath=~wallpaper/$selection
-
-  feh --bg-scale $fullpath
-}
-
-# TODO: Write more robust, tested dotfile manager application in Elisp.
-dotfilify() {
-  # Moves a regular, non-symlinked file into my dotfiles.
-  # compliments undotfilify
-  # depends ensure_dir
-  local original_path=$(realpath $1)
-  local dotfile_path="${DOTFILES}/configs/shared/${original_path#$HOME/}"
-  ensure_dir $(dirname $dotfile_path) && \
-    mv $original_path $dotfile_path && \
-    ln --force -s $dotfile_path $original_path
-}
-
-# TODO: Write more robust, tested dotfile manager application in Elisp.
-undotfilify() {
-  # De-references a file that is symlinked to in my dotfiles.
-  # Usage: undotfilify [path-to-symlink]
-  # compliments dotfilify
-
-  if ! [ -L "$1" ]; then
-    echo_error "Not a symbolic link: $1. Exiting..."
-    return 1
-  else
-    local src=$(readlink -f $1)
-
-    echo "Removing: $1" && rm $1 && \
-      echo "Moving: $src -> $1" && \
-      mv $src $1
-  fi
-}
-
-markdown() {
-  # Simple way to read markdown on the command-line.
-  # Usage: markdown [file]
-  # depends pandoc less
-  pandoc -t plain $1 | less
-}
-
-rofi_prompt() {
-  # Simple prompt for user input using `rofi`.
-  # Usage: rofi_prompt [label]
-  local label="${1:-Input}"
-  rofi -dmenu -p "$label" -theme-str 'listview { enabled: false; }'
-}
-
-import_gpg() {
-  # Shorthand for executing the import script for my GPG creds.
-  local gpg_config=$DOTFILES/configs/shared/gpg/.gnupg
-  $gpg_config/import.sh $gpg_config/exported
-}
-
-export_gpg() {
-  # Shorthand for executing the export script for my GPG creds.
-  local gpg_config=$DOTFILES/configs/shared/gpg/.gnupg
-  $gpg_config/export.sh $gpg_config/exported
-}
-
-create_bootable_usb() {
-  # This was created primarily to document the bootable USB creation process, so
-  # that I'm less dependent on internet solutions.
-  # Warning this is experimental.
-  printf 'Path to .iso: '
-  local lf=$(read -e) # NOTE: maybe use `read lf` instead.
-  printf 'Path to USB: '
-  local of=$(read -e)
-
-  sudo dd \
-    bs=4M \
-    if="${lf}"
-    of="${of}"
-    status=progress \
-    iflag=sync
-}
-
-file_sizes() {
-  # Table to help me conceptualize file sizes.
-  echo "  1 kB\tHalf a page of raw text"
-  echo "  8 kB\tLogo image"
-  echo "500 kB\t5-page word processor document"
-  echo "  1 MB\t1 minute MP3"
-  echo "  5 MB\t3 minute MP3"
-  echo "700 MB\tA full CD-ROM"
-  echo "  4 GB\tA full DVD"
-}
-
-ldap() {
-  # Returns the Google LDAP for `user`
-  declare -A ldaps
-  ldaps["ahmed"]=ahmedhegazy
-  ldaps["arturo"]=arturog
-  ldaps["daniel"]=dsipasseuth
-  ldaps["dirichi"]=dirichi
-  ldaps["jack"]=jackwootton
-  ldaps["jon"]=jonmatthews
-  ldaps["micheal"]=michealg
-  ldaps["rose"]=roseanna
-  ldaps["william"]=wpcarro
-
-  echo ${ldaps["$1"]}
-}
-
-repl_closure() {
-  # Creates a `node` REPL for users to test out Google's Closure library.
-  # The naming `repl_closure` follows the repl_ convention that alias.sh
-  # follows.
-  docker build -t closure_repl - <~/programming/dockerfiles/closure_repl.docker
-  docker run -it closure_repl:latest
-}
-
-checkout_cl() {
-  # - find-or-create a new workspace named `cl-<number>`
-  # - syncs the workspace to tip
-  # - patches the CL ontop of tip
-  hg citc "cl-$1" && \
-  g4d "cl-$1" && \
-  hg sync && \
-  hg patch "cl/$1"
-}
-
-prodaccess() {
-  # Wraps existing `prodaccess` command to provide Google-specific tips.
-  # Take from this: https://g3doc.corp.google.com/experimental/users/diamondm/fortunes/README.md?cl=head
-  command prodaccess "$@" && \
-    cowsay $(/google/data/ro/users/di/diamondm/engfortunes/fortune.sh --extra_space)
-}
-
-home_theater() {
-  # Does the following:
-  #   - connects to NordVPN for HBO
-  #   - connects to the TV via the attached HDMI cable
-  #   - connects to the bluetooth speaker
-
-  # `nordvpn` is an alias defined in `aliases.zsh`
-  echo 'Run the following to stream HBOGo from this laptop to your TV:'
-  echo '  1. nordvpn'
-  echo '  2. xrandr --output HDMI1 --mode 3840x2160'
-  echo '  3. bluetoothctl'
-  echo '  4. connect CC:6E:A4:32:6B:BB'
-  echo
-  echo 'Having trouble? Use the following tools to troubleshoot:'
-  echo '  - blueman-manager'
-  echo '  - pavucontrol'
-  echo '  - gnome-control-center'
-}
-
-create_citc() {
-  # Creates an `hg` citc client and `cd`s to its root.
-  # Usage: create_citc esc-b-119275355
-  # Note: May want to get into the habit of naming citc clients after the
-  # Buganizer tickets. The buganizer portion can be prefixed with the shorthand
-  # representation of the project it relates to. This coupling could lead to
-  # more integrated tooling.
-  hg citc $1 && g4d $1
-}
-
-fv() {
-  # Usage: fv file pattern
-  # This is useful when you know the fuzzy name of the file you want to edit
-  local file
-  file="$(fzf --exact --height 40% --reverse --query="$1"  --select-1 --exit-0)"
-  [[ -n "$file" ]] && vim "$file"
-}
-
-project_root() {
-  # Changes to the directory of the project root.
-  if [[ "$(pwd)" =~ '(.*)/blaze-bin(.*)' ]]; then
-    cd "${match[1]}${match[2]}"
-  elif [[ "$(pwd)" =~ '(.*)/blaze-genfiles(.*)' ]]; then
-    cd "${match[1]}${match[2]}"
-  fi
-}
-
-blaze_bin() {
-  # Changes to the blaze-bin directory.
-  # Depends:
-  #   - project_root
-  project_root && cd "${PWD/\/google3//google3/blaze-bin}"
-}
-
-blaze_genfiles() {
-  # Changes to the blaze-genfiles directory.
-  # Depends:
-  #   - project_root
-  project_root && cd "${PWD/\/google3//google3/blaze-genfiles}"
-}
-
-tbz() {
-  # Toggle between blaze-bin and your source.
-  # Useful if you like to cd into the dir where your source lives.
-  if [[ "$(pwd)" =~ '(.*)/blaze-bin(.*)' ]]; then
-    cd "${match[1]}${match[2]}"
-  else
-    cd "${PWD/\/google3//google3/blaze-bin}"
-  fi
-}
-
-tj() {
-  # Toggle between the source dir and test dir in a Java project.
-  if [[ $PWD =~ '(.*)/javatests(.*)' ]]; then
-    cd "${match[1]}/java${match[2]}"
-  else
-    cd "${PWD/\/google3\/java//google3/javatests}"
-  fi
-}
-
-screenshot() {
-  # Ergonomic way to take a screenshot.
-  # Writing this since I usually forget the command.
-  # Usage: screenshot
-  alert_echo 'Click-and-drag to select the region to capture.'
-  local filepath=$(scrot --select '%Y-%m-%d_$wx$h.png' -e 'mv $f /tmp && echo /tmp/$f')
-  c <<<$filepath
-  alert_echo "Copied to clipboard!"
-}
-
-snipit() {
-  # Take a screenshot and host it at https://screenshot.googleplex.com
-  # Adapted from SnipIt to fit my workflow.
-  # depends alert_echo
-  server="https://screenshot.googleplex.com/upload"
-  file="${TEMP:-/tmp}/snipit_temp_$$.png"
-
-  # Capture
-  alert_echo "SnipIt - Click a window, or drag to snip a region (Ctrl+C to cancel):" && \
-    import "$file" && \
-    echo "Sending image to server..." && \
-    uri=$(curl -sF "imagedata=@$file" $server) && \
-    c <<<"$uri" && \
-    alert_echo "Copied to clipboard!"
-}
-
-# Java
-run_java() {
-  # Usage: run_java path/to/file.java
-  # Intended to be similar in spirit to Haskell's `runhaskell`.
-  set -e
-  javac $1
-  java ${1%.java}
-}
-
-# Aptitude
-apts() {
-  # Searches aptitude package repository for $1, surrounding it in ^$ to ensure
-  # fewer results.
-  apt search "^$1$"
-}
-
-# Docker
-dkcsh() {
-  # Drop into a Docker shell. Shell defaults to /bin/bash.
-  # `dkcsh` stands for DocKer Container SHell.
-  # Usage: dkcsh
-  container=$1
-  cmd=${2-/bin/bash}
-
-  docker exec -it "$container" "$cmd"
-}
-
-dkish() {
-  # Runs a Docker container interactively
-  # Usage: dkrit <container_name> <command> [...args]
-  docker run -it $@
-}
-
-# gist
-gistp() {
-  # Creates a gist with the contents of the clipboard.
-  # Prompts the user for the filename and the descriptions of the gist.
-  # Copies the Gist URL to the user's clipboard thereafter.
-  #
-  # depends_alias p
-  # depends gist
-  printf "Filename including extension: "
-  read filename
-  printf "Gist description: "
-  read description
-  p | gist -e -f $filename -d $description
-}
-
-# Github
-gh_create() {
-  # Create git repository in `~/Dropbox/programming`.
-  # Push repo to my github account.
-  # Usage: grepo [repo-name]
-  # depends_alias mdd g
-  # compliments gh_delete
-
-  if [ $# -eq 0 ]; then
-    echo 'You must supply the name for the repo. Exiting...'
-    return 1
-  else
-    mdd "$HOME/Dropbox/programming/$1" && \
-      g init && \
-      g create
-  fi
-}
-
-gh_delete() {
-  # Deletes a repository from my Github.
-  # compliments gh_create
-
-  if [ $# -eq 0 ]; then
-    echo 'You must supply the name for the repo to delete. Exiting...'
-    return 1
-  else
-    g delete "$1"
-  fi
-}
-
-# Git
-
-gconflicts() {
-  # Edit git conflicts one-by-one in your favorite editor.
-  ${EDITOR} "$(git status --porcelain | awk '/^UU/ { print $2 }')"
-}
-
-gclone() {
-  # Since I inevitably always call `cd` after `g clone`.
-  # Usage: gclone cdown/clipmenu
-  # depends_alias g
-  # depends_alias la
-  g clone "$1" && cd "${1#*/}"
-}
-
-# GPG
-_do_encrypt() {
-  # Helper  function for `encrypt`.
-  # depends gpg targz_dir
-  echo "Encrypting..."
-
-  if [ -f $1 ]; then
-    gpg --encrypt --recipient=wpcarro@gmail.com $1
-    rm $1
-
-  elif [ -d  $1 ]; then
-    targz_dir $1
-    # NOTE: recursion is nice here but it causes the echo statements to happen
-    # twice. Because of this, we redirect to /dev/null.
-    _do_encrypt "$1.tar.gz" >/dev/null
-  fi
-
-  echo "Done."
-}
-
-_do_decrypt() {
-  # Helper function for `decrypt`.
-  # depends gpg untargz_dir
-  echo "Decrypting..."
-
-  gpg --decrypt $1 2>/dev/null >"${1%.gpg}"
-  rm $1
-
-  # If the file ends with tar.gz, it was most like a directory that we targz'd
-  # then encrypted.
-  if [[ "${1%.gpg}" =~ \.tar.gz$ ]]; then
-    untargz_dir "${1%.gpg}" >/dev/null
-  fi
-
-  echo "Done."
-}
-
-encrypt() {
-  # Convenience function around encrypting files and directories.
-  # Appends a .gpg extension and deletes the unencrypted source.
-  # depends _do_encrypt
-  for f in $@; do
-    _do_encrypt $f
-  done
-}
-
-decrypt() {
-  # Convenience function around decrypting .gpg files and directories.
-  # Deletes the original encrypted file with the .gpg extension.
-  # depends _do_decrypt
-  for f in $@; do
-    _do_decrypt $f
-  done
-}
-
-# Python
-python_sandbox() {
-  # Creates a nix-shell with the specified arguments as Python packages
-  nix-shell -p "python36.withPackages(p: with p; [$@])"
-}
-
-# Haskell
-cabal_unhell() {
-  # Run this function to save yourself from Cabal hell.
-  # Note: this will require that you reinstall packages for your projects again.
-  find ~/.ghc -maxdepth 1 -type d -exec rm -rf {} \;
-  rm -rf ~/.cabal/{lib,packages,share}
-}
-
-haskell_sandbox() {
-  # Creates a nix-shell with the specified arguments as Haskell packages
-  nix-shell -p "haskellPackages.ghcWithPackages (p: with p; [$@])"
-}
-
-_haskell_test_watch_path() {
-  # Runs and watches the tests for a provided file path.
-  ghcid -c "stack ghci grid:lib grid:grid-test --ghci-options=-fobject-code" \
-    --height="$(tput lines)" --width="$(tput cols)" --warnings --test "$1"
-}
-
-_haskell_test_watch_pattern() {
-  # Runs and watches the tests that match a provided pattern.
-  stack test --file-watch grid:grid-test --ta "-p \"${1}\""
-}
-
-haskell_test_watch() {
-  # Accepts either a filepath or a pattern and runs a test-watcher for either.
-  if [ -f "$1" ]; then
-    _haskell_test_watch_path "$1"
-  else
-    _haskell_test_watch_pattern "$1"
-  fi
-}
-
-# Kubernetes
-kush() {
-  # Drop into a shell via Kubernetes. Shell defaults to /bin/bash.
-  local name=$1
-  local cmd=${2-/bin/bash}
-
-  kubectl exec -it "${name}" -- "${cmd}"
-}
-
-# Misc
-update_x11_forwarding() {
-  # Sometime Tmux misbehaves with X11 applications (e.g. Emacs). This is because
-  # the DISPLAY variable is not set properly to `:0`. This function w
-  # Cache the DISPLAY when outside of Tmux. When inside of Tmux, use the cached
-  # value for DISPLAY.
-  #
-  # This cooperates with my `preexec` function, which runs before every command.
-  # Adapted from here: http://alexteichman.com/octo/blog/2014/01/01/x11-forwarding-and-terminal-multiplexers/
-  if [ -z "$TMUX" ]; then
-    echo $DISPLAY > ~/.display.txt
-  else
-    export DISPLAY=$(cat ~/.display.txt)
-  fi
-}
-
-monzo_balance() {
-  # Return the balance of my Monzo bank account.
-  # Usage: monzo_balance
-  # Depends:
-  #   - ~/Dropbox/monzo_creds.json.gpg (encrypted asymmetrically for yourself)
-  #   - httpie
-  #   - jq
-  #   - gpg
-  local creds=$(gpg --decrypt ~/Dropbox/monzo_creds.json.gpg 2>/dev/null)
-  local access_token=$(echo $creds | jq --raw-output .access_token)
-  local account_id=$(echo $creds | jq --raw-output .account_id)
-  local balance=$(http --body https://api.monzo.com/balance \
-                       "Authorization: Bearer ${access_token}" \
-                       "account_id==${account_id}" | \
-                    jq .balance)
-  echo "£$balance"
-}
-
-tldr_docs() {
-  # Helper function for submitting a new page to `tldr`.
-  # Usage: tldr_docs <cmd-name>
-  pushd ~/programming/tldr && \
-    gcb "$1" && \
-    "$EDITOR" . && \
-    echo "Next steps:" && \
-    echo "- commit changes" && \
-    echo "- push changes" && \
-    echo "- submit a pull-request to tldr" && \
-    popd # return to the original directory
-}
-
-ord_to_char() {
-  # Converts the ordinal, ASCII value of a character into its encoded
-  # representation.
-  #
-  # Usage:
-  # $ ord_to_char 65
-  # A
-  [ "$1" -lt 256 ] || return 1
-  printf "\\$(printf '%03o' "$1")\n"
-}
-
-char_to_ord() {
-  # Converts the ASCII representation of a character to its ordinal value.
-  #
-  # Usage:
-  # $ char_to_ord A
-  # 65
-  LC_CTYPE=C printf '%d\n' "'$1"
-}
-
-all_users() {
-  # Lists all of the known users in the Linux system
-  # Useful because when you type `~art` in a prompt and tab-complete, ZSH looks
-  # up all users whose names start with "art". It's also just interesting to
-  # have access to this information.
-  #
-  # NOTE: this is not as simple as `cat /etc/passwd` for reasons of which I'm
-  # not entirely sure.
-  getent passwd
-}
-
-escape_sequences() {
-  # Outputs a table of terminal escape sequences and their meaning.
-  echo -E '\a         Bell (alert)'
-  echo -E '\b         Backspace'
-  echo -E '\f         Formfeed'
-  echo -E '\n         New line'
-  echo -E '\r         Carriage return'
-  echo -E '\t         Horizontal tab'
-  echo -E '\v         Vertical tab'
-  echo -E "\'         Single quotation mark"
-  echo -E '\"         Double quotation mark'
-  echo -E '\\         Backslash'
-  echo -E '\?         Literal question mark'
-  echo -E '\uhhhh     Unicode character'
-  echo -E '\Uhhhhhhhh Unicode character'
-  echo -E '\xhh       ASCII character in hexadecimal notation'
-  echo -E '\xhhhh     Unicode character in hexadecimal notation if this escape sequence is used in a wide-character constant or a Unicode string literal.'
-}
-
-test_true_color() {
-  # Run this to test if your terminal emulator supports True Color
-  curl --silent https://raw.githubusercontent.com/JohnMorales/dotfiles/master/colors/24-bit-color.sh | bash
-}
-
-test_16_colors() {
-  # Useful for testing your terminal's theme.
-  echo -e "Normal: ${black}black${red}red${green}green${yellow}yellow${blue}blue${magenta}magenta${cyan}cyan${white}white"
-  echo -e "Bright: ${bright_black}black${bright_red}red${bright_green}green${bright_yellow}yellow${bright_blue}blue${bright_magenta}magenta${bright_cyan}cyan${bright_white}white"
-}
-
-test_text_formatting() {
-  # Useful when appraising a Tmux. Things can get strange with true colors and
-  # font rendering.
-  echo -e "\e[1mbold\e[0m"
-  echo -e "\e[3mitalic\e[0m"
-  echo -e "\e[4munderline\e[0m"
-  echo -e "\e[9mstrikethrough\e[0m"
-}
-
-test_unicode() {
-  # Run this to test if your terminal supports unicode character rendering.
-  echo -e '\u2600 \u2601 \u2602 \u2603 \u2604 \u2605 \u2606 \u2607 \u2608 \u2609 \u260A'
-  echo -e '\u260B \u260C \u260D \u260E \u260F \u2610 \u2611 \u2612 \u2613 \u2614 \u2615'
-  echo -e '\u2616 \u2617 \u2618 \u2619 \u261A \u261B \u261C \u261D \u261E \u261F \u2620'
-  echo -e '\u2621 \u2622 \u2623 \u2624 \u2625 \u2626 \u2627 \u2628 \u2629 \u262A \u262B'
-  echo -e '\u262C \u262D \u262E \u262F \u2630 \u2631 \u2632 \u2633 \u2634 \u2635 \u2636'
-  echo -e '\u2637 \u2638 \u2639 \u263A \u263B \u263C \u263D \u263E \u263F \u2640 \u2641'
-  echo -e '\u2642 \u2643 \u2644 \u2645 \u2646 \u2647 \u2648 \u2649 \u264A \u264B \u264C'
-  echo -e '\u264D \u264E \u264F \u2650 \u2651 \u2652 \u2653 \u2654 \u2655 \u2656 \u2657'
-  echo -e '\u2658 \u2659 \u265A \u265B \u265C \u265D \u265E \u265F \u2660 \u2661 \u2662'
-  echo -e '\u2663 \u2664 \u2665 \u2666 \u2667 \u2668 \u2669 \u266A \u266B \u266C \u266D'
-  echo -e '\u266E \u266F \u2670 \u2671 \u2672 \u2673 \u2674 \u2675 \u2676 \u2677 \u2678'
-  echo -e '\u2679 \u267A \u267B \u267C \u267D \u267E \u267F \u2680 \u2681 \u2682 \u2683'
-  echo -e '\u2684 \u2685 \u2686 \u2687 \u2688 \u2689 \u268A \u268B \u268C \u268D \u268E'
-  echo -e '\u268F \u2690 \u2691 \u2692 \u2693 \u2694 \u2695 \u2696 \u2697 \u2698 \u2699'
-  echo -e '\u269A \u269B \u269C \u269D \u269E \u269F \u26A0 \u26A1 \u26A2 \u26A3 \u26A4'
-  echo -e '\u26A5 \u26A6 \u26A7 \u26A8 \u26A9 \u26AA \u26AB \u26AC \u26AD \u26AE \u26AF'
-  echo -e '\u26B0 \u26B1 \u26B2 \u26B3 \u26B4 \u26B5 \u26B6 \u26B7 \u26B8 \u26B9 \u26BA'
-  echo -e '\u26BB \u26BC \u26BD \u26BE \u26BF \u26C0 \u26C1 \u26C2 \u26C3 \u26C4 \u26C5'
-  echo -e '\u26C6 \u26C7 \u26C8 \u26C9 \u26CA \u26CB \u26CC \u26CD \u26CE \u26CF \u26D0'
-  echo -e '\u26D1 \u26D2 \u26D3 \u26D4 \u26D5 \u26D6 \u26D7 \u26D8 \u26D9 \u26DA \u26DB'
-  echo -e '\u26DC \u26DD \u26DE \u26DF \u26E0 \u26E1 \u26E2 \u26E3 \u26E4 \u26E5 \u26E6'
-  echo -e '\u26E7 \u26E8 \u26E9 \u26EA \u26EB \u26EC \u26ED \u26EE \u26EF \u26F0 \u26F1'
-  echo -e '\u26F2 \u26F3 \u26F4 \u26F5 \u26F6 \u26F7 \u26F8 \u26F9 \u26FA \u26FB \u26FC'
-  echo -e '\u26FD \u26FE \u26FF'
-}
-
-test_emojis() {
-  # Outputs a few emojis to see if your terminal supports colored or
-  # monochromatic emojis.
-  for n in {0..9}
-  do
-    echo -e -n "\U1F60$n"
-  done
-  echo # newline to clean output
-}
-
-path() {
-  # Pretty-print the $PATH variable
-  echo "$PATH" | tr : '\n'
-}
-
-nix_installed() {
-  # Lists the packages installed with `nix-env`
-  nix-env -q
-}
-
-nix_store() {
-  # Print the packages in /nix/store without the preceding hash
-  ls /nix/store | sed 's/[a-z0-9]*-//'
-}
-
-browse() {
-  # Open a URL in $BROWSER. Friendly for terminal input and output.
-  # NOTE: `nohup` ensures that if I close the terminal, I won't all kill the
-  # browser. Maybe this is similar to calling `disown %<job_id>`. The redirect
-  # to `/dev/null` ensures that no `nohup.out` file is created.
-  nohup "$BROWSER" $@ >/dev/null 2>&1 &
-}
-
-lh() {
-  # Opens http://localhost:<port> in your $BROWSER.
-  # Usage: `lh 8080`
-  # Here, in case it wasn't obvious, `lh` stands for "localhost".
-  browse "http://localhost:$1"
-}
-
-essids() {
-  # Returns a list of all ESSIDs the network card detects
-  local interface=${1-wlp4s0}
-  sudo iwlist "${interface}" scan | awk -F \" '{print $2}' | sed '/^\s*$/d'
-}
-
-mkdir_cd() {
-  # Make and cd into a directory or path
-  mkdir -p "$1" && cd "$1"
-}
-
-cp_dwim() {
-  # Calls `cp -r` when a directory is specified, otherwise uses `cp`.
-  # This is closer to the UX you expect in GUIs when you copy-and-paste files.
-  if [ -d $1 ]; then
-    command cp -r $@
-  else
-    command cp $@
-  fi
-}
-
-swap() {
-  # Swaps the names of files and directories.
-  local file_a="${1}"
-  local file_b="${2}"
-
-  if [ -d "${file_a}" ] && [ -d "${file_b}" ]; then
-    local backup=$(mktemp -d backup.XXX)
-
-    mv "${file_a}" "${backup}"
-    mv "${file_b}" "${file_a}"
-    mv "${backup}/${file_a}" "${file_b}"
-    rm -rf "${backup}"
-  elif [ -f "${file_a}" ] && [ -f "${file_b}" ]; then
-    local backup=$(mktemp backup.XXX)
-
-    mv "${file_a}" "${backup}"
-    mv "${file_b}" "${file_a}"
-    mv "${backup}" "${file_b}"
-    rm "${backup}"
-  fi
-
-  echo "Swapped: ${file_a} <-> ${file_b}"
-}
-
-bak() {
-  # Backup a file or a directory by appending a .bak extension to it.
-  mv "$1" "$1.bak"
-}
-
-unbak() {
-  # Restore a file by removing the .bak extension from it.
-  mv "$1.bak" "$1"
-}
-
-is_online() {
-  # Pings google.com and echos "Online" or "Offline" and returns the appropriate
-  # exit code. Could be useful in the ${PS1} variable.
-  wget -q --spider "http://google.com"
-
-  if [ $? -eq 0 ]; then
-    echo "Online"
-    return 0
-  else
-    echo "Offline"
-    return 1
-  fi
-}
-
-loop() {
-  # Continuously loop `command` every `sleep_amt` interval. `sleep_amt` defaults
-  # to 1 second. Pass y/n for `should_clear` if you'd like to clear the screen
-  # at the end of each iteration.
-  # Usage: loop <command> <sleep_amt> <should_clear>
-  local command=$1;
-  local sleep_amt=${2:-1};
-  local should_clear=${3:-n}
-
-  # clear the screen before kicking things off
-  if [ $should_clear = y ]; then
-    clear
-  fi
-
-  while true; do
-    eval $command && sleep $sleep_amt
-    if [ $should_clear = y ]; then
-      clear
-    fi
-  done
-}
-
-du_it_live() {
-  # Outputs and refreshes the size of a directory's content.
-  # Useful for watching a directory as large amounts of data are
-  # downloaded into it.
-  local directory="${1}"
-
-  while true; do
-    du -hc "${directory}" | tail -n 1 | tr -d '\n' && echo -n ' ' && sleep 0.5
-
-    # elipsis
-    echo -n '.' && sleep 0.5 &&
-    echo -n '.' && sleep 0.5 &&
-    echo -n '.' && sleep 0.5 &&
-
-    # clear the three-dots
-    echo -n '\b\b\b' && echo -n '   ' && echo -n '\r'
-  done
-}
-
-router() {
-  # Returns the IP address of the network's router.
-  # Useful in a call like `ping $(router)` to diagnose an internet problem.
-  netstat -nr | grep default | head -n 1 | awk '{ print $2 }'
-}
-
-monitor_dimensions() {
-  # Outputs the dimensions of your computer monitor
-  xdpyinfo | awk '/dimensions/{ print $2 }'
-}
-
-list_sinks() {
-  # Lists the available output sources (speakers?)
-  pacmd list-sinks | grep -e 'name:' -e 'index:'
-}
-
-list_sources() {
-  # List available input sources (microphones?)
-  pacmd list-sources | grep -e 'index:' -e device.string -e 'name:'
-}
-
-lt() {
-  # Convenience wrapper around `exa --tree`.
-  # Optionally accepts a number for the max-depth and a directory to list.
-  # $ lt 2 ./scripts
-
-  # lt
-  if [ -z ${1} ]; then
-    exa --tree --all
-
-  # lt 2
-  elif [[ "${1}" =~ '^[0-9]+$' ]] && [ -z ${2} ]; then
-    local depth="${1}"
-
-    exa --tree --all --level "${depth}"
-
-  # lt ./scripts
-  elif [ -z ${2} ]; then
-    local directory="${1}"
-
-    exa --tree --all "${directory}"
-
-  # lt 2 ./scripts
-  else
-    local depth=${1}
-    local directory="${2}"
-
-    exa --tree --all --level ${depth} "${directory}"
-  fi
-}
-
-lad() {
-  # List only directories in a directory..
-  # Usage: lad [directory]
-  # depends fd
-  (cd ${1:-.} && fd --hidden --maxdepth 1 --type d)
-}
-
-laf() {
-  # List only files in a directory.
-  # Usage: lad [directory]
-  # depends fd
-  (cd ${1:-.} && fd --hidden --maxdepth 1 --type f)
-}
-
-lal() {
-  # List only links in a directory.
-  # Usage: lad [directory]
-  # depends fd
-  (cd ${1:-.} && fd --hidden --maxdepth 1 --type l)
-}
-
-gql() {
-  # Convenience wrapper around `http POST` that allows you write GQL queries in
-  # Vim before posting them to the server.
-  local endpoint="${1}"
-  local query="/tmp/http-query.gql"
-
-  vim "${query}" && \
-  echo "{\"query\":\"$(cat ${query})\"}" | \
-  http --body POST "${endpoint}"
-}
-
-# Nix
-nix_introspect() {
-  # Greps through my local nixpkgs repo for
-  rg --after-context 5 "\\b$1\\b\\s*=" "$(nix-instantiate --find-file nixpkgs)"
-}
-
-# Tmux
-t() {
-  # Find or create a Tmux session. This should work both from within Tmux or
-  # outside of Tmux.
-  local session_name="${1}"
-  if ! tmux has-session -t "${session_name}" 2> /dev/null; then
-    local oldTMUX="${TMUX}"
-    unset TMUX
-    tmux new -d -s "${session_name}" -n "${session_name}"
-    export TMUX="${oldTMUX}"
-    unset oldTMUX
-  fi
-  if [[ -n "${TMUX}" ]]; then
-    tmux switch-client -t "${session_name}"
-  else
-    tmux attach -t "${session_name}"
-  fi
-}
-
-tk() {
-  # `tk`: "tmux kill". Kills a tmux session by name.
-  # If no arguments are provided, kills the current session after jumping to the previous session.
-  session_name="${1}"
-  if [ ! -z "${session_name}" ]; then
-    tmux kill-session -t "${session_name}"
-  else
-    session_name=tmux ls -f '#{?session_attached,#{session_name},}' | xargs
-    tmux switch-client -l
-    tmux kill-session -t "${session_name}"
-  fi
-}
-
-tmux_is_running() {
-  # Returns zero if tmux is running
-  # Although this is a simple function body, it's useful to encode esoteric
-  # knowledge that I will easily forget.
-  test -n "$TMUX"
-}
-
-tmux_focused_pane() {
-  # Returns the ID of the focused tmux pane.
-  # WIP
-  # tmux list-panes -F '#{pane_active} #{pane_tty}' | awk /1/{ print $1 }
-  echo 'Not implemented'
-}
-
-# Google3
-p4_filelog() {
-  # Logs a file's Piper history. This is a convenience wrapper around
-  # `p4 filelog`.
-  # `filename` should be a relative path.
-  # Usage: p4_filelog <filename>
-  # Depends: p4
-  p4 filelog "//depot/$(pwd | grep -P -o 'google3\/.+$')/$1"
-}
-
-citc_workspace() {
-  # Returns the name of your current CitC workspace
-  pwd | grep -o -P "$(whoami)\/[^\/]+"
-}
-
-hgbrowse() {
-  # Attempts to open the current directory in Google's Code Search.
-  # Note: try and get this command supported by Fig
-  local slug="$(pwd | grep -P -o 'google3\/.+$')"
-  browse "https://cs.corp.google.com/piper///depot/$slug"
-}
-
-cider() {
-  # Opens the current workspace and current directory in Google's Cider
-  # Not very useful at the moment because it cannot jump to the current file or
-  # line number. Should also support an Emacs integration at some point.
-  google-chrome \
-    --app="https://cider.corp.google.com/?ws=$(citc_workspace)"
-}
-
-# C
-runc() {
-  # Compile and run $1. Pass $1 as file.c.
-  # This is modelled after the `runhaskell` command.
-  # Deletes the compiled binary after executing it.
-  #
-  # depends gcc
-  gcc "$1" -o "${1%.c}" && "./${1%.c}" && rm "${1%.c}"
-}
-
-# Rust
-runrust() {
-  # Compile and run $1. Pass $1 as file.rs.
-  # This is modelled after the `runhaskell` command.
-  # Deletes the compiled binary after executing it.
-  #
-  # depends rustc
-  rustc "$1" && "./${1%.rs}" && rm "${1%.rs}"
-}
-
-# zsh
-fns() {
-  # Outputs all available functions.
-  # `fns` was chosen instead of `functions`, since `functions` was already
-  # taken.
-  compgen -A function
-}
-
-aliases() {
-  # Outputs all available aliases.
-  compgen -a
-}
-
-keywords() {
-  # Outputs all of the shell's reserved keywords.
-  compgen -k
-}
-
-builtins() {
-  # Outputs all of the shell's builtin commands.
-  compgen -b
-}
-
-
-################################################################################
-# Theming
-################################################################################
-
-colors() {
-  # Outputs the wpgtk-generated color palette annotated with numbers.
-  echo '  0   1   2   3   4   5   6   7' && \
-    wpg --preview && \
-    echo '  8   9  10  11  12  13  14  15'
-}
-
-gvcci() {
-  # Integrates `gvcii` and `wpgtk`.
-  # Usage: gvcii path/to/wallpaper.jpg
-  local filename="$(basename $1)"
-  local directory="${filename%.*}"
-  local json=~/.gvcci/themes/$directory/json-scheme.json
-
-  if [ -f $json ]; then
-    wpg --theme $json
-  else
-    (cd ~/Dropbox/programming/gvcci && \
-       ./gvcci.sh "$1" && \
-       wpg --theme $json)
-  fi
-
-  # TODO: Why do I need this?
-  sleep 0.1 && feh --bg-scale $1
-}