# ~/.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" # 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; } 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' 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' }