# .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # Shell control export HISTCONTROL=ignorespace:erasedups export HISTSIZE=100000 export HISTFILESIZE=100000 shopt -s histappend shopt -s checkwinsize # User specific aliases and functions alias rm='rm -i' alias l='less -N' alias dotgit='/usr/bin/git --git-dir=$HOME/code/dotfiles.git --work-tree=$HOME' # Add to path cleanly local_pathmunge () { case ":${PATH}:" in *:"$1":*) ;; *) if [ "$2" = "after" ] ; then PATH=$PATH:$1 else PATH=$1:$PATH fi esac } local_pathmunge ~/usr/local/bin # Change to the correct sibling of a parent directory cd_parent_sibling () { local sibling_name="$2"; local curname=""; local curtop="$PWD"; local finaltop="" while [ ! "$curtop" = "/" ]; do if [ -d $(dirname $curtop)/$sibling_name ]; then finaltop=$(dirname $curtop)/$sibling_name; break; fi curname=$(basename $curtop)/$curname; curtop=$(dirname $curtop); done if [ ! -z "$finaltop" ]; then if [ ! -z "$3" ]; then if [ ! -d $finaltop/$curname ]; then echo "$finaltop found but $finaltop/$curname not found"; fi finaltop=$finaltop/$curname; fi if [ -d $finaltop ]; then echo "$1 $finaltop" $1 $finaltop fi else echo "parent directory with sibling $sibling_name not found" fi } # Change to build directory cdb () { if [ -z "$1" ]; then cd_parent_sibling cd build t; else cd_parent_sibling cd "$1" t; fi } # Change to source directory cds () { if [ -z "$1" ]; then cd_parent_sibling cd source t; else cd_parent_sibling cd "$1" t; fi } # Push to top of build directory cdbt () { if [ -z "$1" ]; then cd_parent_sibling pushd build; else cd_parent_sibling pushd "$1"; fi } # Push to top of source directory cdst () { if [ -z "$1" ]; then cd_parent_sibling pushd source; else cd_parent_sibling pushd "$1"; fi } # An emacs 'alias' with the ability to read from stdin; example: # echo "hello world" | ef - ef() { # If the argument is - then write stdin to a tempfile and open the # tempfile. if [[ "$1" == "-" ]]; then tempfile=$(mktemp emacs-stdin-$USER.XXXXXXX --tmpdir) cat - > $tempfile emacsclient -n -c -e "(progn (find-file \"$tempfile\") (set-visited-file-name nil) (rename-buffer \"*stdin*\" t)) " 2>&1 > /dev/null else emacsclient -n -c "$@" fi } # Source first available file in list source_first() { for x in $*; do [ -f $x ] && source $x && break done } # fasd: Jump to directory or use FZF j() { [ $# -gt 0 ] && fasd_cd -d "$*" && return local dir dir=$(fasd -Rdl "$1" | fzf -1 -0 --no-sort +m) && cd "${dir}" || return 1 } # Set up command-line key bindings case "$-" in *i*) # Interactive shells # Set up fzf and fasd source_first /usr/share/fzf/shell/key-bindings.bash ~/.fzf.bash eval "$(~/usr/local/bin/fasd --init auto)" complete -d j # Emacs tramp wants a simple prompt that it can recognize if [[ "$TERM" = "dumb" ]]; then PS1="> " fi ;; *) # Non-interactive shells ;; esac