1

Я хотел бы вызвать ediff-merge-files в emacs для объединения файлов с синхронизатором файлов unison. Чтобы избежать запуска нового экземпляра, я предпочитаю использовать emacsclient:

emacsclient --eval '(ediff-merge-files "CURRENT1" "CURRENT2" nil "NEW")'

Тем не менее, emacsclient возвращается мгновенно (как это было бы при наличии простых файлов и опции --no-wait ). Конечно, тогда unison жалуется, что файлы не были отредактированы.

Есть ли способ позволить emacsclient подождать, пока я не закончу слияние?

3 ответа3

1

Я вижу 2 способа сделать это.

оберните ваш вызов в ediff-merge-files вокруг другой функции emacs, которая будет ждать завершения вызова, может поиграться с некоторыми взломами хуков запуска, но это может стать очень грязным

оберните ваш вызов в emacsclient сценарием, который ожидает создания нового файла перед возвратом, если временный файл создается по требованию, то это более простое решение, если новый файл может уже существовать, тогда вам нужно будет использовать файл заполнителя

Пример скрипта - ediff-wait, он взломан и имеет минимальные проверки работоспособности

#!/bin/sh

[ -f $3 ] && exit 1  # merge file exists?

emacsclient --eval "( ediff-merge-files \"$1\" \"$2\" nil \"$3\" )"
while /bin/true; do
  [ -f $3 ] && exit 0
  sleep 1
done
1

Emacsclient будет ждать, если вы попросите его создать новый фрейм. Следовательно, используйте либо:

emacsclient -c --eval '(ediff-merge-files "CURRENT1" "CURRENT2" nil "NEW")' если вы хотите создать графический фрейм или

emacsclient -t --eval '(ediff-merge-files "CURRENT1" "CURRENT2" nil "NEW")' если вы хотите получить фрейм терминала.

0

Кажется, что проблема с использованием emacsclient в качестве инструмента сравнения заключается в том, что он всегда возвращает 0 в качестве кода состояния, что делает невозможным для git решение, было ли слияние успешным или нет.

Решение было предложено на вики Mercurial:

#!/bin/bash

if [ $# -lt 1 ]; then
  echo 1>&2 "Usage: $0 local other base output"
  exit 1
fi

local=$1
other=$2
base=$3
output=$4

OUTPUT=`emacsclient --no-wait --eval "(ediff-merge-with-ancestor \"$local\" \"$other\" \"$base\" nil \"$output\")" 2>&1`
echo $OUTPUT | grep -v "Ediff Control Panel"

if echo "$OUTPUT" | grep -q '^*ERROR*'; then
    exit 1
fi

Поместите это в скрипт на вашем пути, и все должно быть хорошо.

[ПРИМЕЧАНИЕ: эта проблема была исправлена в транке emacs.]

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .