Ciaran McCreesh’s Blag
Now with 17% more caffeine
Tag Archives: bash
Three Shiny Things
- Flag variables in Bourne shell programs
- Open in Browser Firefox extension, for all those webservers that get MIME types wrong.
noremap <Leader>v `[v`]to select the thing just pasted in Vim. Inspired bygv, which I always expect to reselect pastes for some reason.
Hot Fresh Shiny Config Files
I’ve moved my configuration files repository from Subversion to Git, since I’m sick of trying to decide whether my laptop or desktop should hold the ‘master’ copy. For the lulz, I shall also push to GitHub at irregular intervals, so you shall no longer need to pester me to upload newer versions of my bashrc / vimrc / whatever to webspace somewhere. Instead, you can just:
git clone git://github.com/ciaranm/dotfiles-ciaranm.git
We’ll see whether this lasts…
Git and Subversion information in the Bash Prompt
Here’s my variation on the “Git and Subversion status in the bash prompt” thing:
ps_scm_f() { local s= if [[ -d ".svn" ]] ; then local r=$(svn info | sed -n -e '/^Revision: \([0-9]*\).*$/s//\1/p' ) s="(r$r$(svn status | grep -q -v '^?' && echo -n "*" ))" else local d=$(git rev-parse --git-dir 2>/dev/null ) b= r= a= if [[ -n "${d}" ]] ; then if [[ -d "${d}/../.dotest" ]] ; then if [[ -f "${d}/../.dotest/rebase" ]] ; then r="rebase" elif [[ -f "${d}/../.dotest/applying" ]] ; then r="am" else r="???" fi b=$(git symbolic-ref HEAD 2>/dev/null ) elif [[ -f "${d}/.dotest-merge/interactive" ]] ; then r="rebase-i" b=$(<${d}/.dotest-merge/head-name) elif [[ -d "${d}/../.dotest-merge" ]] ; then r="rebase-m" b=$(<${d}/.dotest-merge/head-name) elif [[ -f "${d}/MERGE_HEAD" ]] ; then r="merge" b=$(git symbolic-ref HEAD 2>/dev/null ) elif [[ -f "${d}/BISECT_LOG" ]] ; then r="bisect" b=$(git symbolic-ref HEAD 2>/dev/null )"???" else r="" b=$(git symbolic-ref HEAD 2>/dev/null ) fi if git status | grep -q '^# Changed but not updated:' ; then a="${a}*" fi if git status | grep -q '^# Changes to be committed:' ; then a="${a}+" fi if git status | grep -q '^# Untracked files:' ; then a="${a}?" fi b=${b#refs/heads/} b=${b// } [[ -n "${r}${b}${a}" ]] && s="(${r:+${r}:}${b}${a:+ ${a}})" fi fi s="${s}${ACTIVE_COMPILER}" s="${s:+${s} }" echo -n "$s" }
This is added to PS1 as normal.
For Subversion, it gives us the revision, and a * if anything’s been modified.
For Git, we get quite a bit more. If we’re in the middle of a merge, interactive rebase or am, we get told so. If we’re in the middle of a bisect, we get question marks, since I’ve not had to bisect anything since I wrote that code and I haven’t implemented anything fancy for it. We also get the branch, and a combination of * for changed but not updated files, + for changed and committed files and ? for untracked files.
It’s generally sufficiently fast to not be annoying, although the initial cd into a large project can take a few seconds. It’s probably possible to drop to a single ‘git status’ call if performance matters, although the kernel does a pretty good job of speeding up subsequent runs.