241 lines
6.8 KiB
Plaintext
241 lines
6.8 KiB
Plaintext
=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.
|