X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/profile/blobdiff_plain/2c49e0816cc0cbf93d5763f962cc46f07eb70ffb..8a075bd77648bf73909b42db74ef010a07a725f9:/dot/bashrc diff --git a/dot/bashrc b/dot/bashrc index 3ca0748..990d645 100644 --- a/dot/bashrc +++ b/dot/bashrc @@ -1,64 +1,65 @@ -# -*- mode: sh; coding: utf-8 -*- -# -# Bash session things -# +### -*-bash-*- +### +### Bash session things. -if [ -z "$__mdw_bashrc" ]; then +__mdw_shell=bash -__mdw_bashrc=done +## Only do this if we haven't done it before. (Note that this guard isn't +## exported, so subshells will need to make their own arrangements.) +case ${__mdw_bashrc+t} in + t) ;; + *) __mdw_bashrc=t -[ -z "$__mdw_profile" -a -r $HOME/.bash_profile ] && . $HOME/.bash_profile -[ -r /etc/bashrc ] && . /etc/bashrc +## Fetch the common configuration. +. "$HOME/.shell-rc" -# --- First of all, set up the prompt string --- +## If we've not run the main profile yet, we should do that first. It sets +## up things we rely on. Also, if there's a system script, we should run +## that too. +case ${__mdw_profile+t} in t) ;; *) . "$HOME/.profile" ;; esac +__mdw_source_if_exists /etc/bashrc -if [ -t 0 ]; then +## Completion. +__mdw_source_if_exists /etc/bash_completion "$HOME/.bash_completion" + +###-------------------------------------------------------------------------- +### Prompt hacking. +__mdw_set_prompt_hacks () { case "$TERM" in - linux*|screen*|xterm*|vt100*|eterm*) - bold="\[$(tput bold)\]" unbold="\[$(tput sgr0)\]" nl="\[ \]" ;; - *) - bold='' unbold='' nl='' ;; + linux*|screen*|xterm*|putty*|vt100*|eterm*) + case "$(tput bold)" in + "") bold="\[$(tput md)\]" unbold="\[$(tput me)\]" ;; + *) bold="\[$(tput bold)\]" unbold="\[$(tput sgr0)\]" ;; + esac + gitcolour="\[$(tput setaf 6)\]" + rccolour="\[$(tput setaf 1)\]" + uncolour="\[$(tput op)\]" + nl="\[ +\]" + ;; esac + host='\h' dir=' \w' +} - if (( EUID == 0 )); then - left=`echo « | iconv -f utf8 -t //translit` - right=`echo » | iconv -f utf8 -t //translit` - else - case $USER in - mdw|mwooding) - u="" left="[" right="]" - ;; - *) - u="\\u@" left="{" right="}" - ;; - esac - if [ "$__mdw_tty" = "`tty`" ]; then - left="<" right=">" - else - export __mdw_tty="`tty`" - fi - fi - - if [ -z "$SSH_CLIENT" ] && - [ "$__mdw_sechost" != "`hostname`" ] - then - sec_l='(' sec_r=')' - fi - - PS1="$nl$bold$left$sec_l$u\\h$sec_r \\w$right$unbold" - PS2="$PS1 $bold>$unbold " - -fi # is stdin a tty? - -# --- Pagers are less useful within Emacs --- +__mdw_before_cmd_hack () { + set -- $(history 1); shift + __mdw_preexec "$*" +} -case "$INSIDE_EMACS" in - 22.*,comint) export PAGER=cat ;; -esac +## Only bother if the shell is interactive. +if [ -t 0 ]; then + PROMPT_DIRTRIM=5 + __mdw_source_if_exists /usr/lib/git-core/git-sh-prompt + __mdw_set_prompt_pieces + PROMPT_COMMAND=__mdw_precmd + PS0="\$(__mdw_before_cmd_hack)" +fi -# --- Little preferences --- +###-------------------------------------------------------------------------- +### Other shell tweaking. +## Random shell tweaks. notify=1 set -b shopt -u cdable_vars @@ -69,9 +70,10 @@ shopt -s cmdhist shopt -u dotglob shopt -s expand_aliases shopt -s extglob -shopt -s globstar +if (( ${BASH_VERSINFO[0]} >= 4 )); then shopt -s globstar; fi shopt -s gnu_errfmt shopt -s histappend +set -o histexpand shopt -s histreedit shopt -u histverify shopt -s hostcomplete @@ -84,269 +86,14 @@ shopt -u nullglob shopt -s promptvars shopt -u shift_verbose shopt -s sourcepath - HISTCONTROL=ignorespace:erasedups -# --- Set the CDPATH --- -# -# CDPATH=~/src:/usr/src:/usr/lib:/usr/share -# dots=.. -# i=6 -# while (( i > 0 )); do -# CDPATH=$CDPATH:$dots -# dots=$dots/.. -# (( i -= 1 )) -# done -# CDPATH=$CDPATH:/ - -# --- Some colour `ls' support --- - -[ "${TMPDIR+yes}" ] || eval `tmpdir -b` -if [ -x /usr/bin/dircolors -o -x /usr/local/bin/dircolors ]; then - eval `dircolors -b ~/.dircolors` -else - unset LS_COLORS -fi - -ls () { - if [ -t 1 ]; then - command ls $LS_OPTIONS ${LS_COLORS+--color=auto} "$@" - else - command ls "$@" - fi -} - -# --- Some colour `grep' support --- - -export GREP_COLORS="mt=01;31:ms=01;31:mc=031;31:fn=36:ln=36:bn=36:se=34" - -greplike () { - declare grep=$1; shift - if [ -t 1 ]; then - command $grep ${GREP_COLORS+--color=always} "$@" | mdw-pager - else - command $grep "$@" - fi -} -alias grep="greplike grep" -alias egrep="greplike egrep" -alias fgrep="greplike fgrep" -alias zgrep="greplike zgrep" - -# --- Set up some simple aliases --- - -alias cx='chmod a+x' -alias which="command -v" -alias rc="rc -l" -alias ssync="rsync -e ssh" -alias rootly=$__MDW_ROOTLY -alias r=rootly -alias re="rootly $EDITOR" -alias pstree="pstree -hl" -alias cdtmp='cd ${TMPDIR-/tmp}' -alias pushtmp='pushd ${TMPDIR-/tmp}' -alias e="$EDITOR" -alias svn="svnwrap svn" -alias @="ssh" - -[ -r /etc/bash_completion ] && . /etc/bash_completion -[ -r $HOME/.bash_completion ] && . $HOME/.bash_completion - -# --- Make `xt' start an xterm, maybe logging into a remote host --- - -xt () { - case "$1" in - @*) - local remote=${1#@} title - shift - if [ $# -gt 0 ]; then - title="xterm [$remote] $1" - else - title="xterm [$remote]" - fi - (xterm -title "$title" -e ssh $remote "$@" &) - ;; - *) - (xterm "$@" &) - ;; - esac -} - -# --- Turning on and off core dumps --- +###-------------------------------------------------------------------------- +### Finishing touches. -core () { - case "x$1" in - xon|xy|xyes) - ulimit -Sc `ulimit -Hc` - ;; - xoff|xn|xno) - ulimit -Sc 0 - ;; - x) - local l=`ulimit -Sc` - case $l in - 0) echo "Core dumps disabled" ;; - unlimited) echo "Core dumps enabled" ;; - *) echo "Core dump limit is $l blocks" ;; - esac - ;; - *) - echo >&2 "usage: core [yn]" - return 1 - ;; - esac -} +## Run any local hooks. +__mdw_source_if_exists "$HOME/.bashrc-local" -# --- Turning on and off path hacks --- +###----- That's all, folks -------------------------------------------------- -path-add () { - local pathvar export dir val - case $# in - 1) pathvar=PATH dir=$1 export="export PATH";; - 2) pathvar=$1 dir=$2 export=:;; - *) echo >&2 "Usage: $0 [VAR] DIR";; - esac - eval "val=\$$pathvar" - case ":$val:" in - *:"$dir":*) ;; - *) val=$dir:$val ;; - esac - eval "$pathvar=\$val" - $export -} - -path-remove () { - local pathvar export dir val - case $# in - 1) pathvar=PATH dir=$1 export="export PATH";; - 2) pathvar=$1 dir=$2 export=:;; - *) echo >&2 "Usage: $0 [VAR] DIR";; - esac - eval "val=\$$pathvar" - case ":$val:" in - :"$dir":) val= ;; - :"$dir":*) val=${val#$dir:} ;; - *:"$dir":) val=${val%:$dir} ;; - *:"$dir":*) val=${val/:$dir:/:} ;; - esac - eval "$pathvar=\$val" - $export -} - -pathhack () { - if [ $# -eq 0 ]; then - local IFS=: - for e in $PATH; do - case "$e" in - "$HOME/bin/hacks/"*) - echo ${e#$HOME/bin/hacks/} - ;; - esac - done - return - fi - local force=nil - local path=$PATH - while [ $# -gt 0 ]; do - arg=$1 - case "$arg" in - -f | --force) - force=t - shift - continue - ;; - --) - shift - break - ;; - [-+]*) - ;; - *) - break - ;; - esac - hack=${arg#[+-]} - dir=$HOME/bin/hacks/$hack - [ -d "$dir" ] || { - echo "$0: path hack $hack not found" - return 1 - } - case "$arg,$force,:$PATH:" in - -*,*,*:"$dir":*) - path-remove path "$dir" - ;; - +*,t,*:"$dir":*) - path-remove path "$dir" - path-add path "$dir" - ;; - +*,nil,*:"$dir":*) - ;; - +*,*) - path-add path "$dir" - ;; - esac - shift - done - if [ $# -eq 0 ]; then - PATH=$path - export PATH - else - PATH=$path "$@" - fi -} - -# --- Switching security worlds --- - -world () { - local nfast=${NFAST_HOME-/opt/nfast} - local kmdata - case "$#" in - 0) - echo "${NFAST_KMDATA#$nfast/kmdata-}" - ;; - *) - if [ -d "$1" ]; then - kmdata=$1 - elif [ -d "$nfast/kmdata-$1" ]; then - kmdata=$nfast/kmdata-$1 - else - echo >&2 "world: can't find world $1" - return 1 - fi - shift - case "$#" in - 0) export NFAST_KMDATA=$kmdata ;; - *) "$@" ;; - esac - ;; - esac -} - -# --- Fix `man' under Slowaris --- - -case "$MACHTYPE" in - *solaris*) - man () { - declare -i i=0 - declare arg - declare -a man - - for arg; do - case "$arg" in [0-9]*) man[i+=1]="-s" ;; esac - man[i+=1]="$arg" - done - command man "${man[@]}" - } - ;; esac - -# --- For `root' use -- some simple molly-guards --- - -if (( UID == 0 )); then - alias rm='rm -i' cp='cp -i' mv='mv -i' - set -o noclobber -fi - -[ -f "$HOME/.bashrc-local" ] && . "$HOME/.bashrc-local" - -fi