Я хотел бы вызвать emacs' ediff-merge-files
функция для слияния файлов с синхронизатором файла унисона. Чтобы постараться не запускать новый экземпляр, я предпочитаю использовать emacsclient
:
emacsclient --eval '(ediff-merge-files "CURRENT1" "CURRENT2" nil "NEW")'
Однако emacsclient
возвраты немедленно (как это сделало бы когда данный простые файлы и --no-wait
опция). Конечно, унисон затем жалуется, что никакие файлы не были отредактированы.
Существует ли способ позволить emacsclient ожидать, пока я не закончен со слиянием?
Я вижу 2 способа сделать это.
перенесите свой вызов с ediff-merge-files вокруг другой функции emacs, которая будет ожидать вызова для окончания, может играть вокруг с выполнением некоторых взломов в рычаги запуска, но это могло стать очень грязным
перенесите свой вызов к emacsclient со сценарием, который ожидает нового файла, который будет создан перед возвратом, если временный файл создается по требованию затем, это - более легкое решение, если новый файл может уже существовать, то необходимо будет использовать файл заполнителя
Сценарий в качестве примера - ediff-ожидает, он изрублен и имеет минимальные проверки работоспособности
#!/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
Кажется, что проблема с использованием emacsclient как различный инструмент состоит в том, что это всегда возвращается 0 как код состояния, лишающий возможности мерзавца решить если слияние, за которым следуют или нет.
Решение было предложено на Подвижной Wiki:
#!/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.]