X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/2ab4329692381a068a0264fea3b93143fb376eea..4e7092a3248d55e4af0b45c38a67e3a7998b59a7:/dot/shell-rc diff --git a/dot/shell-rc b/dot/shell-rc index ac8819d..ea4f575 100644 --- a/dot/shell-rc +++ b/dot/shell-rc @@ -14,39 +14,102 @@ __mdw_source_if_exists () { done } -## Set the temporary directory again. (A setuid or setgid program may have -## unhelpfully forgotten this for us.) -case ${TMPDIR+t} in t) ;; *) eval $(tmpdir -b); esac +###-------------------------------------------------------------------------- +### Hooks. + +__mdw_addhook () { + local hk=$1 fn=$2 t + + eval t=\${$hk+t} + case $t in t) ;; *) echo >&2 "unknown hook \`$hk'"; return 2; esac + + eval t=\$$hk + case " $t " in + *" $fn "*) ;; + *) eval "$hk=\${$hk:+\$$hk }\$fn" ;; + esac +} + +__mdw_delhook () { + local hk=$1 fn=$2 t l r + + eval t=\${$hk+t} + case $t in t) ;; *) echo >&2 "unknown hook \`$hk'"; return 2; esac + + eval t=\" \$$hk \" + case $t in + *" $fn "*) + l=${t%% $fn*} r=${t##*$fn } + l=${l# } r=${r% } + eval "$hk=\$l\${l:+ }\$r" + ;; + esac +} + +__mdw_setrc () { return $1; } + +__mdw_runhook () { + local hk=$1 saverc=$? t i; shift + + eval t=\${$hk+t} + case $t in t) ;; *) echo >&2 "unknown hook \`$hk'"; return 2; esac + + eval t=\$$hk + for i in $t; do __mdw_setrc $saverc; "$i" "$@"; done +} ###-------------------------------------------------------------------------- ### Prompt machinery. -__mdw_set_prompt_hacks () { host=$(hostname); dir=""; } +__mdw_host=$(hostname) +__mdw_hqual= +__mdw_hqual=$__mdw_hqual${SCHROOT_CHROOT_NAME+/$SCHROOT_CHROOT_NAME} +__mdw_hqual=$__mdw_hqual${CROSS_BUILDENV+/$CROSS_BUILDENV} +__mdw_set_prompt_hacks () { host=$__mdw_host; dir=""; } + +__mdw_system=$(uname -s) +: ${USER-${LOGNAME-$(id -un)}} +__mdw_user=$USER + +case $(id -u) in + 0) + __mdw_rootp=t + ;; + *) + case $__mdw_system in + CYGWIN_*) + case " $(id -G) " in + *" 544 "*) __mdw_rootp=t __mdw_user="$__mdw_user%admin" ;; + *) __mdw_rootp=nil ;; + esac + ;; + *) + __mdw_rootp=nil + ;; + esac +esac __mdw_set_prompt_pieces () { - local hqual - hqual="" ## Fancy highlighting in some terminals. local bold unbold nl gitcolour rccolour uncolour - local host dir - bold="" unbold="" nl="" gitcolour="" rccolour="" uncolour="" + local host dir more + bold="" unbold="" nl="" gitcolour="" rccolour="" uncolour="" more="" __mdw_set_prompt_hacks ## Choose the right delimiters. Highlight root prompts specially; ## highlight when I'm running as some other user. Highlight when this ## isn't the outermost shell on the terminal. - local left right user u tty - user=${USER-${LOGNAME-$(id -un)}} - case $(id -u) in - 0) + local left right u tty + case $__mdw_rootp in + t) left=$(echo « | iconv -f UTF-8 -t //translit) right=$(echo » | iconv -f UTF-8 -t //translit) ;; - *) - case $user in + nil) + case $USER in mdw | mwooding | nemo) u="" left="[" right="]" ;; - *) u="$user@" left="{" right="}" ;; + *) u="$__mdw_user@" left="{" right="}" ;; esac tty=$(tty) case "$__mdw_tty" in @@ -65,47 +128,76 @@ __mdw_set_prompt_pieces () { *) sec_l="" sec_r="" esac - ## If this is an schroot environment then point this out. - hqual="$hqual${SCHROOT_CHROOT_NAME+/$SCHROOT_CHROOT_NAME}" + ## If this is an schroot environment or some other interesting augmented + ## environment then point this out. ## Put together the main pieces. - __mdw_prompt_left="$nl$bold$left$sec_l$u$host$hqual$sec_r$dir" + __mdw_prompt_left="$nl$bold$left$sec_l$u$host$__mdw_hqual$sec_r$dir" __mdw_prompt_git_left="$unbold$gitcolour" __mdw_prompt_git_right="$uncolour$bold" __mdw_prompt_rc_left="$unbold$rccolour" __mdw_prompt_rc_right="$uncolour$bold" __mdw_prompt_right="$right$unbold" + __mdw_prompt_more=" $more$bold>$unbold " } __mdw_set_prompt () { - __mdw_last_rc=$? - local git rc - if type __git_ps1 >/dev/null 2>&1; then - git="$__mdw_prompt_git_left$(__git_ps1)$__mdw_prompt_git_right" - else - git="" - fi - case $__mdw_last_rc in - 0) rc="" ;; - *) rc="$__mdw_prompt_rc_left rc=$__mdw_last_rc$__mdw_prompt_rc_right" ;; + case "${TERM-dumb}:${INSIDE_EMACS+$INSIDE_EMACS}" in + dumb:) + case $(id -u) in 0) PS1='# ' ;; *) PS1='$ ' ;; esac + PS2='> ' + ;; + *) + __mdw_last_rc=$? + local git rc + if type __git_ps1 >/dev/null 2>&1; then + git="$__mdw_prompt_git_left$(__git_ps1)$__mdw_prompt_git_right" + else + git="" + fi + case $__mdw_last_rc in + 0) rc="" ;; + *) rc="$__mdw_prompt_rc_left rc=$__mdw_last_rc$__mdw_prompt_rc_right" ;; + esac + PS1="$__mdw_prompt_left$git$rc$__mdw_prompt_right" + PS2="$PS1$__mdw_prompt_more" + unset __mdw_last_rc + ;; esac - PS1="$__mdw_prompt_left$git$rc$__mdw_prompt_right" - PS2="$PS1 $bold>$unbold " - unset __mdw_last_rc } -__mdw_precmd () { - __mdw_set_prompt - case ${STY+t} in - t) printf "k%s\\" "$__mdw_shell" ;; - esac +__mdw_xterm_settitle () { + printf >/dev/tty \ + "]2;%s@%s:%s – %s\\" \ + "$__mdw_user" "$__mdw_host$__mdw_hqual" "$PWD" \ + "$1" } +__mdw_xterm_precmd () { __mdw_xterm_settitle "$__mdw_shell"; } +__mdw_xterm_preexec () { __mdw_xterm_settitle "$1"; } -__mdw_preexec () { - case ${STY+t} in - t) printf "k%s\\" "$1" ;; - esac +__mdw_screen_settitle () { + printf >/dev/tty \ + "k%s\\" \ + "$1" } +__mdw_screen_precmd () { __mdw_screen_settitle "$__mdw_shell"; } +__mdw_screen_preexec () { __mdw_screen_settitle "$1"; } + +if [ -t 0 ]; then + case ${STY+t},${__mdw_precmd_hook+t},${__mdw_preexec_hook+t},${TERM} in + ,t,t,xterm*) + __mdw_addhook __mdw_precmd_hook __mdw_xterm_precmd + __mdw_addhook __mdw_preexec_hook __mdw_xterm_preexec + ;; + t,t,t,*) + __mdw_addhook __mdw_precmd_hook __mdw_screen_precmd + __mdw_addhook __mdw_preexec_hook __mdw_screen_preexec + ;; + esac + case ${__mdw_precmd_hook+t} in + t) __mdw_addhook __mdw_precmd_hook __mdw_set_prompt ;; + esac +fi ###-------------------------------------------------------------------------- ### Some handy aliases. @@ -125,6 +217,15 @@ alias pushtmp='pushd ${TMPDIR-/tmp}' alias e="$EDITOR" alias svn="svnwrap svn" alias @="ssh" +alias make="nice make" +alias cross-run="nice cross-run" +alias gdb="gdb -q" + +## Shut up Lisp interpreters. +alias clisp="clisp -q -q" +alias cmucl="rlwrap cmucl -quiet" +alias ecl="rlwrap ecl" +alias sbcl="rlwrap sbcl --noinform" ###-------------------------------------------------------------------------- ### Colour output. @@ -155,6 +256,21 @@ alias egrep="greplike egrep" alias fgrep="greplike fgrep" alias zgrep="greplike zgrep" +## Arrange for `diff' output to be in colour. +export DIFF_COLORS="hd=1:ln=36:ad=32:de=31" +difflike () { + local diff=$1; shift + if [ -t 1 ]; then + command $diff \ + ${DIFF_COLORS+--color=always} \ + ${DIFF_COLORS+--palette="$DIFF_COLORS"} \ + "$@" | mdw-pager + else + command $diff "$@" | cat + fi +} +alias diff="difflike diff" + ###-------------------------------------------------------------------------- ### Other hacks. @@ -328,6 +444,16 @@ pathhack () { ###-------------------------------------------------------------------------- ### Finishing touches. +## Make sure `$HOME/bin' is on the path. +path_add "$HOME/bin" + +## Set the temporary directory again. (A setuid or setgid program may have +## unhelpfully forgotten this for us.) +case ${TMPDIR+t} in + t) ;; + *) if __mdw_programp tmpdir; then eval $(tmpdir -b); fi ;; +esac + ## For `root' use -- some simple molly-guards. case $(id -u) in 0)