development:emacs:ediff
Ediff Mode
Because Ediff is a very useful Emacs mode (in particular for VC) i wrote a shell script to start it from the command line.
#!/bin/bash # # Copyright (C) 2013-2020 Ralf Hoppe <ralf@dfcgen.de> # # ediff.sh # # Usage: ediff.sh [--client] LOCAL REMOTE [MERGED [BASE]] # function abspath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}" } MERGE=1 # if this is a MERGE if [ $# -gt 0 ] && [ "$1" = "--client" ] ; then LOCAL=$(abspath "$2") REMOTE=$(abspath "$3") MERGED=$(abspath "$4") BASE=$(abspath "$5") EMACS_CMD="emacsclient --create-frame" # NOTE: Empty list `vc-handled-backends' is a workaround for Emacs 24 # bug #18788, regarding vc-git mode-line. ELISP_COMMON=\ "(setq rho/vc-handled-backends-backup vc-handled-backends \ rho/ediff-frame (selected-frame) \ cscope-initial-directory nil \ vc-handled-backends ()) \ (defun rho/ediff-quit-hook-external () \ (setq vc-handled-backends rho/vc-handled-backends-backup) \ (remove-hook 'ediff-quit-hook 'rho/ediff-quit-hook-external) \ (delete-frame rho/ediff-frame)) \ (add-hook 'ediff-quit-hook 'rho/ediff-quit-hook-external t)" if [ -z "$(lsof -u $USER -a -c emacs 2>/dev/null | grep -w server)" ] ; then emacs --rho-minimal --no-site-file & sleep 3 fi sleep 1 shift else LOCAL=$(abspath "$1") REMOTE=$(abspath "$2") MERGED=$(abspath "$3") BASE=$(abspath "$4") EMACS_CMD="emacs --rho-minimal --no-site-file" ELISP_COMMON=\ "(setq ediff-quit-hook 'kill-emacs \ vc-handled-backends ())" fi if [ $# -lt 2 ]; then echo "Usage: $(basename $0) [--client] LOCAL REMOTE [MERGED [BASE]]" echo " (see also GIT-DIFFTOOL(1) and GIT-MERGETOOL(1))" exit 1 fi echo -e "$# files:\nLOCAL=$LOCAL\nREMOTE=$REMOTE" if [ $# -eq 4 ] ; then echo -e "MERGED=$MERGED\nBASE=$BASE" $EMACS_CMD --eval \ "(progn $ELISP_COMMON (setq-default ediff-show-clashes-only t) (ediff-merge-files-with-ancestor \"${LOCAL}\" \"${REMOTE}\" \"${BASE}\" nil \"${MERGED}\"))" > /dev/null elif [ $# -eq 2 -o "${REMOTE}" = "${MERGED}" ] ; then $EMACS_CMD --eval \ "(progn $ELISP_COMMON (ediff-files \"$LOCAL\" \"$REMOTE\"))" > /dev/null MERGE=0 else echo "MERGED=$MERGED" $EMACS_CMD --eval \ "(progn $ELISP_COMMON (setq-default ediff-show-clashes-only t) (ediff-merge-files \"${LOCAL}\" \"${REMOTE}\" nil \"${MERGED}\"))" > /dev/null fi if [ $MERGE -ne 0 ]; then EGREPHITS="$(egrep -c '^(<<<<<<<|>>>>>>>)' $MERGED)" if [ $EGREPHITS -ne 0 ]; then TMPFILE="$(mktemp --tmpdir $(basename $MERGED).XXXXXXXXXX)" cp -p "$MERGED" "$TMPFILE" echo "Conflicts -> see file $TMPFILE" exit 1 fi fi exit 0
development/emacs/ediff.txt · Last modified: 2021/07/12 21:08 by Ralf H.