Inicie emacs con ediff-files (de ediff-directorios) desde la línea de comandos

8

Me gustaría lanzar emacs para construir archivos o directorios. Por ejemplo, me gustaría algo como:

emacs -f ediff-files file1 file2

Pero cuando hago esto, no toma file1 y file2 como los dos archivos para diferenciarse. Por el contrario, emacs me pide que los archivos difieran.

¿Alguien sabe cómo hacer esto en una línea de comando?

Madeleine P. Vincent
fuente

Respuestas:

10

Estoy bastante seguro de que hay otras soluciones, pero puede hacerlo usando en --evallugar de -f( --funcall):

emacs --eval '(ediff-files "file1" "file2")'

De hecho, el manual de Emacs sobre "Argumentos de línea de comando para la invocación de Emacs" dice que -f functiony--funcall function

Llame a la función de la función Lisp . Si es una función interactiva (un comando), lee los argumentos de forma interactiva como si hubiera llamado a la misma función con una secuencia de teclas. De lo contrario, llama a la función sin argumentos.

Esto explica por qué no puede obtener el comportamiento que desea con -f/ --funcall.


ediff-directories toma tres argumentos, por lo que el comando que se muestra arriba cambia a

emacs --eval '(ediff-directories "dir1" "dir2" "regexp")'

Como se explica aquí , ediff-directorieshace que Emacs ingrese ediff-meta-mode, por lo que primero se lo colocará en el "Panel de grupo de sesión de Ediff". Del manual de Ediff sobre Grupos de sesiones :

Varias entradas importantes de Ediff realizan comparaciones y fusiones en directorios. Al ingresar ediff-directories, ediff-directories3[...] al usuario se le presenta un búfer tipo Dired que enumera los archivos comunes a los directorios involucrados junto con sus tamaños. [...] Llamamos a este Panel de Grupo de Sesión de búfer porque todas las sesiones de Ediff asociadas con los archivos listados tendrán este búfer como un punto focal común. [...]

En la comparación o fusión de directorios, un panel de grupo de sesión muestra solo los archivos comunes a todos los directorios involucrados. Las diferencias se mantienen en un búfer de diferencia de directorio separado y se muestran convenientemente escribiendo Den el panel del grupo de sesión correspondiente. [...]

Entonces, para mostrar la diferencia real, simplemente presione D( ediff-show-dir-diffs).

itsjeyd
fuente
eso funciona muy bien para ediff-files. ¡Gracias! Todavía no puedo ediff-directorios para trabajar. ¿Algunas ideas?
Madeleine P. Vincent
@ MadeleineP.Vincent ¿Podría ser un poco más específico acerca de lo que no funciona? Para mí emacs --eval '(ediff-directories "dir1" "dir2" "regexp")'funciona bien.
itsjeyd
Cuando uso esa llamada como ha escrito, emacs me dice: "Este grupo de sesiones no tiene miembros"
Madeleine P. Vincent
@ MadeleineP.Vincent Sí, pero este no es un mensaje de error; se muestra en lo que parece ser una especie de búfer de visión general. Para obtener la diferencia real, todo lo que necesita hacer es presionar D( ediff-show-dir-diffs).
itsjeyd
Estoy cerca, pero no del todo. Cuando presiono D, muestra dir1 y dir2, y *** No differences ***, aunque invoco ediff desde dentro de emacs con Mx, todo funciona como se esperaba (es decir, se muestran las diferencias). Tal vez tengo algo configurado de manera diferente en mis .emacs.
Madeleine P. Vincent
3

Utilizo el siguiente script: comprueba de antemano si hay diferencias y, en caso de que existan, abre Emacs con la función adecuada evaluada. Con la -dopción, asume que los elementos provistos son directorios, y en ediff-directorieslugar de ediff-filesser usados; de lo contrario, verifica si son directorios o archivos, y establece la función para usar en consecuencia.

#! / bin / sh

EMACS = $ (que emacs)

si [$ # -lt 2]; entonces
    echo "Uso ::" `basename $ 0`" [-d] item1 item2 "
    salida 1
fi

dir = "no"
if ["$ 1" = "-d"]; entonces
    dir = "yes"
    item1 = "$ 2"
    item2 = "$ 3"
más
    si [-d "$ 1" -a -d "$ 2"]; entonces
        dir = "yes"
    fi
    item1 = "$ 1"
    item2 = "$ 2"
fi

if ["$ dir" = "no"]; entonces

    # Compruebe que los archivos existen
    Si [ ! -f "$ item1"]; entonces
        printf "Archivo% s no encontrado. \ n" "$ item1"
        salida 2
    fi
    Si [ ! -f "$ item2"]; entonces
        printf "Archivo% s no encontrado. \ n" "$ item2"
        salida 2
    fi

    # Compruebe si los archivos son idénticos o no
    diffdata = `diff" $ item1 "" $ item2 "`
    if ["_" = "_ $ diffdata"]; entonces
        printf "% sy% s son idénticos. \ n" "$ item1" "$ item2"
        salida 3
    fi

fi

diff_fn = "ediff-files"
if ["$ dir" = "yes"]; entonces
    diff_fn = "directorios-ediff"
    opt = "\" \ ""
fi

# Ejecute Emacs con la función ediff-files
printf "Comparación de archivos% sy% s.." "$ item1" "$ item2"
$ EMACS -q -nw -eval "($ diff_fn \" $ item1 \ "\" $ item2 \ "$ opt)" && echo hecho.

salida 0

Como comprueba si hay diferencias por adelantado, me resulta muy útil al comparar muchos archivos en diferentes carpetas, desde la línea de comandos, en lugar de ejecutar una única sesión de diferencias en las carpetas principales. Por ejemplo, para comparar las carpetas A y B, y copiar archivos no existentes del primero al otro ...

JC Gonzalez
fuente