Как заставить emacsclient ждать при использовании опции --eval?


1

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

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

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

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

Ответы:


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.]

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.