all repos — dot @ 13cc065ec014b86369dfe4ad60d1a43fa06fd251

Shell, editor and terminal configuration, and the tools that go with them

config/bashrc (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
# shellcheck shell=bash
# ~/.bashrc — bash's interactive entry point, the counterpart of config/zshrc.
#
# Layering (see config/env's header for the full picture):
#   config/env      environment, every shell, every mode
#   config/profile  shared interactive layer (aliases, history, theme, profile.d)
#   config/bashrc   bash-specific interactive bits   <- this file
#   config/zshrc    zsh-specific interactive bits
#
# bash and zsh disagree about which file a *login interactive* shell reads:
# zsh reads ~/.zprofile AND ~/.zshrc, but bash reads only ~/.profile and never
# ~/.bashrc. So the two entry points source each other, guarded both ways:
#   - entered here (interactive non-login) -> we source ~/.profile below
#   - entered via ~/.profile (login)       -> it sources ~/.bashrc at its end
# The __dotfiles_* flags below make sure exactly one direction fires.

# Non-interactive bash never needs any of this, and a login *non*-interactive
# shell can reach here via ~/.profile. Bail out before doing any work.
case $- in
    *i*) ;;
    *) return ;;
esac

__dotfiles_bashrc=1

# The shared interactive layer, unless ~/.profile is what sourced us.
if [ -z "${__dotfiles_profile:-}" ] && [ -r "$HOME/.profile" ]; then
    # shellcheck source=/dev/null
    . "$HOME/.profile"
fi

# --------------------------------------------------------------------- history
# config/profile sets HISTFILE and HISTSIZE for both shells. These are the bash
# spellings of the zsh options set alongside them in config/profile.
HISTFILESIZE="$HISTSIZE"
HISTCONTROL=ignoreboth # HIST_IGNORE_DUPS + HIST_IGNORE_SPACE
shopt -s histappend    # INC_APPEND_HISTORY

# ---------------------------------------------------------------------- shopts
shopt -s checkwinsize # keep $LINES/$COLUMNS right after a resize
shopt -s globstar 2>/dev/null # ** recurses, as in zsh

# ---------------------------------------------------------------------- colours
# config/profile already aliases ls to lsd when it is installed; only fall back
# to coreutils colouring when it isn't, so the two can't fight over the alias.
if [ -x /usr/bin/dircolors ]; then
    if [ -r "$HOME/.dircolors" ]; then
        eval "$(dircolors -b "$HOME/.dircolors")"
    else
        eval "$(dircolors -b)"
    fi
    command -v lsd >/dev/null 2>&1 || alias ls='ls --color=auto'
    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# ------------------------------------------------------------------- lesspipe
# Debian/Ubuntu's pager preprocessor. config/profile sets LESS/PAGER.
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# --------------------------------------------------------------------- prompt
# Mirrors the zsh fallback prompt in config/zshrc: dim basename, then ∴
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi
PS1='${debian_chroot:+($debian_chroot)}\[\e[38;5;244m\]\W\[\e[0m\] ∴ '

# ---------------------------------------------------------------- completion
# bash-completion 2.x needs bash >= 4.2, but macOS still ships bash 3.2 as
# /bin/bash. Without the version guard, sourcing Homebrew's copy under 3.2
# spews "complete: nosort: invalid option name" on every prompt.
if ! shopt -oq posix && [ "${BASH_VERSINFO[0]:-0}" -ge 4 ]; then
    if [ -r /usr/share/bash-completion/bash_completion ]; then
        # shellcheck source=/dev/null
        . /usr/share/bash-completion/bash_completion
    elif [ -r /etc/bash_completion ]; then
        # shellcheck source=/dev/null
        . /etc/bash_completion
    elif [ -r /opt/homebrew/etc/profile.d/bash_completion.sh ]; then
        # shellcheck source=/dev/null
        . /opt/homebrew/etc/profile.d/bash_completion.sh
    fi
fi

# Host-local interactive bash setup. Kept for parity with the stock Ubuntu
# ~/.bashrc this file replaces; ~/.localprofile covers both shells.
# shellcheck source=/dev/null
[ -r "$HOME/.bash_aliases" ] && . "$HOME/.bash_aliases"

# vim: filetype=sh