Using vimdiff to view single diffs

    hg cat <filename> | vim - -c  ":vert diffsplit <filename>" -c "map q :qa!<CR>";

Using bash to save as a command:

hgdiff() {
    hg cat $1 | vim - -c  ":vert diffsplit $1" -c "map q :qa!<CR>";
}

Then just use hgdiff <filename> to invoke, and q from within vim to quit.

ErikTerpstra added:

If you want the new version on the right side, try this instead:

hgdiff() {
    vimdiff -c 'map q :qa!<CR>' <(hg cat "$1") "$1";
}

ErnieRael added:

A bash script, I call it hgdiff, like hg diff for -r -c options

Get rid of the <space> before the "#!"

 #!/bin/bash

usage() {
    echo "${0##*/} ([-c REV] | [-r REV1 [-r REV2]]) FILE" >&2
    echo "    with -c, older REV on the left" >&2
    echo "    with -r, REV1 on the left. If no REV2, right side modifiable" >&2
    exit 1
}

hgrevtmp()
{
    local tmpf=$(mktemp --tmpdir hgTmpRev$1.XXXXXXXXXX)
    hg cat -r $1 "$2" >> "$tmpf"
    if [ $? != 0 ]; then return 1; fi
    chmod a-w "$tmpf"
    echo "$tmpf"
}

declare -a rev
declare -a change
nRev=0
nChange=0

declare TEMP
TEMP=$(getopt "hr:c:" "$@")
if [ $? != 0 ]; then usage; fi
eval set -- "$TEMP"

while true
do
  case "$1" in
    -r) rev[nRev++]=$2; shift 2;;
    -c) change[nChange]=$2; shift 2;;
    -h) usage;;
    --) shift; break;;
     *) echo Internal Error; exit 1;;
  esac
done

# echo rev: ${rev[*]}
# echo change: ${change[*]}
# echo remain: $# $*

if [[ $# != 1 ]]; then
    echo "exactly one FILE can be specified, not $#"
    someError=true
fi
if [[ $nRev > 0 && $nChange > 0 ]]; then
    echo "can only specify one of -c and -r"
    someError=true
fi
if [[ $nRev > 2 ]]; then
    echo "at most two -r can be specified, not $nRev"
    someError=true
fi
if [[ $nChange > 1 ]]; then
    echo "only one -c can be specified, not $nChange"
    someError=true
fi

if [ "$someError" = true ]; then usage; fi

deleteTemps() {
    #echo delete: $tmpf1 $tmpf2
    rm -f "$tmpf1" "$tmpf2"
}

# bail if an error and delete the temps
set -e
trap deleteTemps ERR

# convert rev to version number in local repository
convertToRev() {
    hg log -r $1 --template '{rev}'
}

toPrevRev() {
    if [ $1 == 0 ]; then
        echo "null"
        return;
    fi

    # get the array of parents for the rev
    local parents=($(hg log -r $1 --template '{parents}'))
    if [ $? != 0 ]; then return 1; fi
    # Note: parents without "[i]" is first item in array
    if [ -z "$parents" ]; then
        echo $(($1 - 1))
    else
        convertToRev $parents
    fi
}

repo_file=$1
noMod="set nomodifiable"

chg=${change[0]}
if [ -n "$chg" ]; then
    # diff given rev against previous rev
    chg=$(convertToRev $chg)
    # subtract one from change number to get previous
    tmpf1=$(hgrevtmp $(toPrevRev $chg) "$repo_file")
    tmpf2=$(hgrevtmp $chg "$repo_file")
    f2=$tmpf2
    f2Mod=$noMod
else
    if [ $nRev == 0 ]; then
        tmpf1=$(hgrevtmp tip "$repo_file")
        f2=$repo_file
    else
        rev=$(convertToRev ${rev[0]})
        tmpf1=$(hgrevtmp $rev "$repo_file")
        if [ $nRev == 1 ]; then
            f2=$repo_file
        else
            rev=$(convertToRev ${rev[1]})
            tmpf2=$(hgrevtmp $rev "$repo_file")
            f2=$tmpf2
            f2Mod=$noMod
        fi
    fi
fi

(
    gvim --nofork -d -c ":set columns=170" \
        $(cygpath -m "$tmpf1") \
        -c "set nomodifiable" \
        $(cygpath -m "$f2") \
        -c "wincmd w" \
        -c "$f2Mod" \
        -c "wincmd =" \
        -c "map q :qa<CR>"
    deleteTemps
) &


CategoryTipsAndTricks

UsingVimdiffForSingleDiffs (last edited 2010-11-10 05:03:36 by ErnieRael)