Como fazer o emacsclient esperar ao usar a opção --eval?

1

Gostaria de invocar a função ediff-merge-files do emacs para mesclar arquivos com o sincronizador de arquivos unison. Para evitar iniciar uma nova instância, prefiro usar emacsclient :

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

No entanto, emacsclient retorna instantaneamente (como seria feito quando dados arquivos simples e a opção --no-wait ). É claro que uníssono reclama que nenhum arquivo foi editado.

Existe uma maneira de deixar o emacsclient esperar até terminar a fusão?

    
por Florian Jenn 11.12.2009 / 17:59

3 respostas

1

vejo duas maneiras de fazer isso.

wrap your call to ediff-merge-files around another emacs function that will wait for the call to finish, can play around with doing some hacks into the startup hooks, but this could get very messy

wrap your call to emacsclient with a script that waits for the new file to be created before returning, if the temporary file is created on demand then this is an easier solution, if the new file may already exist, then you'll need to use a placeholder file

Exemplo de script - ediff-wait, ele é cortado e tem verificações mínimas de integridade

#!/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
    
por 11.12.2009 / 19:36
1

O Emacsclient esperará se você pedir para criar um novo quadro. Por isso, use:

emacsclient -c --eval '(ediff-merge-files "CURRENT1" "CURRENT2" nil "NEW")' se você quiser criar um quadro gráfico ou

emacsclient -t --eval '(ediff-merge-files "CURRENT1" "CURRENT2" nil "NEW")' se você quiser um quadro de terminal.

    
por 03.07.2013 / 05:27
0

Parece que o problema com o uso do emacsclient como uma ferramenta diff é que ele sempre retorna 0 como código de status, tornando impossível para o git decidir se a fusão foi bem-sucedida ou não.

Uma solução foi proposta no wiki do 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

Coloque isso em um script de shell em seu caminho e as coisas devem ser dândi.

[NOTA: Este problema foi corrigido no tronco do emacs.]

    
por 26.10.2010 / 10:42

Tags