#!/usr/bin/env bash # https://github.com/junegunn/myvim set -u set -e EDIT=0 COMPRESS=-z OUTPUT=vim.$(whoami) GREPV="cat" VIMRC=.vimrc if [ ! -e ~/$VIMRC ]; then if [ -e ~/.vim/vimrc ]; then VIMRC=.vim/vimrc else >&2 echo "~/.vimrc (or ~/.vim/vimrc) not found" exit 1 fi fi usage() { echo "usage: $0 [-e|--edit] [--exclude PATTERN] [-j] [output]" } while [ $# -gt 0 ]; do case $1 in -e|--edit) EDIT=1 ;; -z|-j) COMPRESS=$1 ;; --exclude) shift; GREPV="grep -v $(printf %q "$1")" ;; -h|--help) usage; exit 0 ;; -*) echo "$0: Unrecognized option $1"; exit 1 ;; *) OUTPUT=$1 ;; esac shift done get_md5() { if which md5sum > /dev/null 2>&1; then md5sum "$1" | awk '{print $1}' else md5 -q "$1" fi } list() { (cd ~ && find -L .vim $VIMRC \ \( -name .git -o -name .hg -o -name .svn \) -prune \ -o ! -type d -print) | eval "$GREPV" } gitenv() { local NAME EMAIL if which git > /dev/null 2>&1 && NAME=$(git config user.name 2> /dev/null) && EMAIL=$(git config user.email 2> /dev/null); then echo "export GIT_AUTHOR_NAME=\"$NAME\"" echo "export GIT_AUTHOR_EMAIL=\"$EMAIL\"" echo 'export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"' echo 'export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"' fi } generate() { if [ $EDIT -eq 1 ]; then CONF="$OUTPUT.conf.sh" echo "# EDIT: environment variables" > "$CONF" gitenv >> "$CONF" echo >> "$CONF" echo "# EDIT: the list of files to be archived" >> "$CONF" list >> "$CONF" ${EDITOR:-vim} "$CONF" ENV_VARS=$(sed -n '1,/^# EDIT/{/^# EDIT/d; p;}' "$CONF") FILES=$(sed '1,/^# EDIT/d' "$CONF") rm -f "$CONF" else ENV_VARS="" FILES=$(list) fi TEMP=/tmp/myvim-$(whoami).tar.compressed tar -C ~ -h $COMPRESS -cf $TEMP -T <(echo "$FILES") MD5=$(get_md5 "$TEMP") MD5=${MD5:0:8} echo '#!/usr/bin/env bash # Created at: '$(date)' '"$ENV_VARS"' if [ "$1" == --hard ]; then HARD=1 BASE=~ echo "** Overwriting ~/.vim and ~/'"$VIMRC"' **" for e in ~/.vim ~/'"$VIMRC"'; do rm -rf ${e}.bak [ -e $e ] && mv ${e} ${e}.bak done shift else HARD="" BASE=/tmp/myvim-$(whoami)/'$MD5' fi set -eu if [ ! -d $BASE/.vim ]; then >&2 echo "Extracting Vim environment to $BASE" mkdir -p $BASE sed "1,/^# EOF #$/d" "$0" | tar -C $BASE -x '$COMPRESS' [ -z "$HARD" ] && (cd $BASE mv -f '"$VIMRC"' '"$VIMRC"'.org echo "let [s:home_org, \$HOME] = [\$HOME, \"$BASE\"]" > '"$VIMRC"' echo "set rtp^=$BASE/.vim" >> '"$VIMRC"' echo "autocmd VimEnter * let \$HOME = s:home_org" >> '"$VIMRC"' cat '"$VIMRC"'.org >> '"$VIMRC"' echo "let \$HOME = s:home_org" >> '"$VIMRC"' rm -f '"$VIMRC"'.org) fi \vim -Nu $BASE/'"$VIMRC"' "$@" exit $? # EOF #' > "$OUTPUT" cat "$TEMP" >> "$OUTPUT" chmod +x "$OUTPUT" echo "Created $OUTPUT executable" rm -f "$TEMP" } if [ ! -e ~/.vim ]; then mkdir -p ~/.vim fi generate