# ~/.bashrc: executed by bash(1) for non-login shells. export TZ='America/Detroit' memoize_retval() { local var="$1" func="$2" if [ -z "${!var}" ]; then eval "$func" eval "$var=$?" fi return ${!var} } ### utility functions ### quiet() { "$@" >/dev/null 2>&1; } match_glob() { eval "case \"$2\" in $1) true ;; *) false ;; esac"; } match_path() { match_glob "*:$1:*|$1:*|*:$1" "$PATH"; } if match_glob "*zsh" "$SHELL"; then have() { for c in "$@"; do quiet whence -p "$c" || return 1; done; } else have() { for c in "$@"; do quiet type -P "$c" || return 1; done; } fi add_path() { if [ "$1" = "-a" ]; then local after=1 shift else local after= fi for p in "$@"; do if [ -d "$p" ] && ! match_path "$p" ]; then [ -n "$after" ] && PATH="$PATH:$p" [ -z "$after" ] && PATH="$p:$PATH" fi done } add_stack_binpath() { [ "$STACK_PATH_HAS_BEEN_SET" ] && return local result="$( stack path 2>&1 | while read k v do case "$k" in bin-path:) printf 'PATH=%q:%q\n' "$PATH" "${v%:$PATH}" # add to _end_ of PATH ;; ghc-package-path:) printf 'GHC_PACKAGE_PATH=%q\n' "$v" echo 'export GHC_PACKAGE_PATH' ;; esac done )" [ "$result" ] && eval "$result" && export STACK_PATH_HAS_BEEN_SET=y } ### bash settings, general environment ### add_path -a /usr/games add_path "$HOME/.cabal/bin" "$HOME/.local/bin" "$HOME/bin" HISTSIZE=50000 tmux-log-everything # if have stack; then # add_stack_binpath # fi if have dbus-autolaunch && have dbus-launch; then eval $(dbus-autolaunch) fi if match_glob "*zsh" "$SHELL"; then autoload -U select-word-style select-word-style bash # WORDCHARS='*?_-[]~\!#$%^(){}<>|`@#$%^*()+:?' fi if match_glob "*bash" "$SHELL"; then export PS1='\u@\h:\w\$ ' fi if have sea; then eval `sea` # sets PS1 and PROMPT_COMMAND # must come before dynamic titles section, below fi case $SHELL in bash) shopt -s checkwinsize ;; *) ;; esac umask 002 if have vim; then alias vi=vim export EDITOR=vim elif have vi; then export EDITOR=vi fi if have less; then export PAGER=less export LESS=-XSR have lesspipe && eval "$(lesspipe)" elif have w3m; then export PAGER=w3m elif have more; then export PAGER=more fi ### dynamic titles for xterm & screen ### function set_xterm_title () { # This is unneeded since my .screenrc is configured to set the xterm # title to the hardstatus line, which is configured to include the # current screen title... and a good thing too, or xterm titles # wouldn't change when screen windows were switched... echo -ne "\033]0;$*\007" >&2 } function set_screen_title () { echo -ne "\033k$*\033\\" >&2 } function xterm_preexec () { set_xterm_title ${PREEXEC_CMD[@]} } function screen_preexec () { set_screen_title ${PREEXEC_CMD[@]} } function screen_postexec () { set_screen_title "${PWD/$HOME/~}" } function xterm_postexec () { set_xterm_title "$USER@$HOST:${PWD/$HOME/~}" } if [ -n "$STY" ]; then PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND; }screen_postexec" PREEXEC_COMMAND=screen_preexec elif match_glob "xterm*" "$TERM"; then HOST=$(hostname) PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND; }xterm_postexec" PREEXEC_COMMAND=xterm_preexec fi ### program settings and aliases ### alias ip=/sbin/ip alias ipaddr='ip addr' if have ps && match_glob '*procps*' "$(ps -V 2>/dev/null)"; then export PS_FORMAT=pid,user:6,tty,\%mem,\%cpu,start,cmd alias p='ps x -H' have less && alias pp='p a |grep -v " \[[^] ]\+\]\$"| less -RSeX' # have less && alias pp='p a |sed -ne '\''1,/^[^ ]* *1 /!p;/^[^ ]* *1 /p'\''| less -RSeX' fi export PARINIT='rTbgqR B=.,?_A_a Q=_s>|' export JACK_START_SERVER=1; if have irssi; then alias anet='irssi -c Afternet' alias freenode='irssi -c Freenode' fi if have Xvnc; then alias startvnc='xinit -- `which Xvnc` :1 -geometry 800x600' fi if have xemacs; then alias gnus='DISPLAY= xemacs -f gnus' alias emacs='DISPLAY= xemacs' fi if have firefox; then alias ff='killall firefox-bin; firefox' fi if quiet ls -d -sCF --color=tty /; then alias ls='ls -sCF --color=tty'; lss () { command ls -sCF --color "$@" | less -RSeX; }; elif quiet ls -d -sCF /; then alias ls='ls -sCF'; lss () { command ls -sCF "$@" | less -RSeX; }; fi mkcd() { if [ $# -gt 1 ]; then echo 'mkcd: usage: mkcd ' fi mkdir -p "$1" && cd "$1"; } alias m-a='m-a -t' alias jf='ssh -tX bucky ' alias jfs='ssh -tX bucky screen -x' alias ll='ls -l'; alias lls='lss -l'; alias pd=pushd alias sudo='sudo ' alias s='screen ' alias csi='csi -q' alias bc='bc -ql' alias df='df -x fuse' alias mtr='mtr --curses' doc () { pushd /usr/share/doc/$1; } lsl() { ls -lrtc "$@" --color=yes|tail -n 20 } lddsize() { ldd "$@"|while read lib _x file addr; do [ -f "$file" ] || continue; echo -en "$file\0"; done | xargs -0 du -cshD; } ### w3m bookmarks ### if have w3m; then alias sd='w3m http://www.slashdot.org' alias blog='w3m http://insoul.net/blogdate.php?plain=yes' alias news='w3m http://news.google.com/?ned=tus' alias cl='w3m hartford.craigslist.org' fi if ! have srfi; then srfi () { w3m http://srfi.schemers.org/srfi-"$1"/srfi-"$1".html } fi # if have nvim; then # alias vim=nvim # fi if have emacsclient; then alias vi='emacsclient -c' alias emacs='(set -x; systemctl --user enable emacs)' fi ### array stack interface ### pusha () { local arr="$1"; shift; for t in "$@"; do eval $arr'[${#'$arr'[@]}]='"\"$t\"" done; } popa () { eval unset $1'[${#'$1'[@]}-1]'; } topa () { eval echo '${'$1'[${#'$1'[@]}-1]}'; } echoa () { eval echo '${'$1'[@]}'; } alias irc='jfx jerkface.net screen -xRR irc' alias code='jfx jerkface.net screen -xRR code' alias grep='grep --exclude-dir=.git' dorner () { DOOMWADDIR=$HOME/src/zdoom/release LD_LIBRARY_PATH=$HOME/src/zdoom/fmodapi42636linux/api/lib/ $HOME/src/zdoom/release/zdoom -file \$HOME/Dorners\ Last\ Stand Skins/DoRnerLastStand.wad } avahi_hosts () { avahi-browse -trap | ( IFS=';'; while read _ _ _ _ _ _ x _; do [ "$x" ] && echo $x; done ) | sort -u } live_play() { local url="$1"; mpv --cache-secs=30 --cache=25000 --cache-initial=25000 --cache-pause \ "$(youtube-dl -g -f 'best[width<=1024],best[width<=1280],best' "$url")"; } case "$TERM" in screen*) # http://unix.stackexchange.com/questions/179173/make-less-highlight-search-patterns-instead-of-italicizing-them export LESS_TERMCAP_so=$'\E[30;43m' export LESS_TERMCAP_se=$'\E[39;49m' ;; esac pingwait() { while ! ping -c1 "$@"; do sleep 1 done } take () { local n="$1" r= while [ "$n" -gt 0 ]; do read line && r="$r $line" let --n done if [ "$r" ]; then r=${r# } echo "$r" else false fi } torrent () { rsync -P "$@" borges:/srv/4T-temp/transmission/torrents/ } webterm() { PATH="/usr/lib/xorg:$PATH" xpra start --bind-tcp=0.0.0.0:14500 --html=on --start="${1:-xterm}" printf '%s\n' 'Stop server by pressing enter.' 'Connect to server via http://localhost:14500/' read line PATH="/usr/lib/xorg:$PATH" xpra stop } tmux_clone() { tmux new-session -t 0 -s 1 } wifi_AP() { /sbin/iw dev wlan0 info | sed -n 's/^\taddr //p' } debian_install_firefox() { which snap || sudo apt-get install snapd sudo snap install firefox printf '%s\n' 'To run firefox, execute the command:' ' snap run firefox' } jsynth() { fluidsynth -g2 /usr/share/sounds/sf2/FluidR3_GM.sf2 -a jack -j -r 48000 } wmuk1() { icecream --name 'WMUK-1_%Y_%m_%d' http://ice2.wmuk.org:8000/mp31 } wmuk2() { icecream --name 'WMUK-2_%Y_%m_%d' http://ice2.wmuk.org:8000/mp32 } reinstall_conf_file() { local f="$1" pkg if [ -f "$f" ]; then sudo cp --backup=existing --force --preserve=all -- "$f" "$f" || return sudo rm -f "$f" fi [ ! -e "$f" ] || return; pkg=$(dpkg -S "$f") || return; sudo apt-get -o DPkg::options::=--force-confmiss --reinstall install ${pkg%%:*} } fanspeed() { local speed="$1" if [ "$speed" ]; then [ "$speed" -gt 7 ] 2>/dev/null && speed=full-speed echo "level $speed" | sudo tee /proc/acpi/ibm/fan else grep -v '^commands:' /proc/acpi/ibm/fan fi } subvolify() { local path sudo path=$(realpath -e "$1") || return if [ "$(id -u)" = 0 ]; then sudo=; else sudo=sudo; fi [ ! -e "$path".subvol~ ] || return [ ! -e "$path".subvol ] || return $sudo btrfs subvolume create "$path".subvol || return $sudo chown --reference="$path" "$path".subvol || return $sudo chmod --reference="$path" "$path".subvol || return $sudo find "$path" -mindepth 1 -maxdepth 1 -print0 | $sudo xargs -0 mv -t "$path".subvol $sudo mv -T "$path" "$path".subvol~ $sudo mv -T "$path".subvol "$path" $sudo rmdir "$path".subvol~ || true } fkill() { killall "$@" firefox-bin 'Web Content' WebExtensions } alias fstop='fkill -STOP' alias fcont='fkill -CONT' newfile() { find . -maxdepth 1 -type f -printf "%T@ %f\0" | sort -z -k1,1 -r | head -z -n1 | cut -d' ' -f2 | xargs -0 printf %s } get_spacemacs() { if [ -d "$HOME/.emacs.d" ] then rmdir "$HOME/.emacs.d" || return fi git clone --depth=1 https://github.com/syl20bnr/spacemacs ~/.emacs.d } get_youtube-dl() { local u url if u=$(which youtube-dl) then "$u" -U else url=https://youtube-dl.org/downloads/latest/youtube-dl sudo curl -L "$url" -o /usr/local/bin/youtube-dl sudo chmod a+rx /usr/local/bin/youtube-dl fi } get_firefox() { # TODO: Make idempotent # TODO: Use cron (cd ~/src || cd git clone d@cryptonomic.net:public_git/firefox-update.git cd firefox-update || exit make) } get_stack() { if which stack >&- 2>&- then return else wget -qO- https://get.haskellstack.org/ | sh fi } alias get_haskell=get_stack get_rust() { curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh } alias twitter-dl='youtube-dl -o '\''%(title).200s-%(id)s.%(ext)s'\''' local_bashrc=~/.bashrc.$(hostname) if [ -f "$local_bashrc" ]; then . "$local_bashrc" fi alias frb='fakeroot ./debian/rules binary' alias nodes='ping -n -w1 ip6-allnodes' alias grayprint='lp -o ColorModel=Gray' ym () { yt-dlp -f bestaudio --add-metadata "$@" } ya () { ym -o "%(playlist_title)s/%(track_number).2d - %(title)s.%(ext)s" "$@" }