Avvia emacs con i file ediff (delle directory ediff) dalla riga di comando


8

Vorrei lanciare emacs per modificare file o directory. Ad esempio, vorrei qualcosa come:

emacs -f ediff-files file1 file2

Ma quando lo faccio, non ci vogliono file1 e file2 come i due file per diff. Piuttosto, emacs mi chiede che i file differiscano.

Qualcuno sa come farlo in una riga di comando?

Risposte:


10

Sono abbastanza sicuro che ci siano altre soluzioni, ma puoi farlo usando --evalinvece di -f( --funcall):

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

In effetti, il manuale Emacs su "Argomenti della riga di comando per l'invocazione di Emacs" dice che -f functione--funcall function

Chiama la funzione funzione Lisp . Se è una funzione interattiva (un comando), legge gli argomenti in modo interattivo proprio come se avessi chiamato la stessa funzione con una sequenza di tasti. Altrimenti, chiama la funzione senza argomenti.

Questo spiega perché non è possibile ottenere il comportamento desiderato con -f/ --funcall.


ediff-directories accetta tre argomenti, quindi il comando mostrato sopra cambia in

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

Come spiegato qui , ediff-directoriesfa entrare Emacs ediff-meta-mode, quindi verrai prima inserito nel "Pannello gruppo sessioni Ediff". Dal manuale Ediff sui gruppi di sessioni :

Diverse voci principali di Ediff eseguono il confronto e l'unione di directory. Entrando ediff-directories, ediff-directories3, [...] l'utente è presentato con un Dired simile buffer che i file di liste comuni alle directory coinvolti con le loro dimensioni. [...] Questo pannello del gruppo di sessioni viene chiamato buffer perché tutte le sessioni Ediff associate ai file elencati avranno questo buffer come punto focale comune. [...]

Nel confronto o nella fusione delle directory, un pannello del gruppo di sessioni visualizza solo i file comuni a tutte le directory interessate. Le differenze vengono conservate in un buffer delle differenze di directory separato e vengono comodamente visualizzate digitando Dil pannello del gruppo di sessioni corrispondente. [...]

Quindi, per visualizzare l'attuale diff, basta premere D( ediff-show-dir-diffs).


funziona benissimo per i file ediff. Grazie! Non riesco ancora a far funzionare le directory ediff. Qualche idea?
Madeleine P. Vincent,

@ MadeleineP.Vincent Potresti essere un po 'più specifico su ciò che non funziona? Per me emacs --eval '(ediff-directories "dir1" "dir2" "regexp")'funziona benissimo.
È il

Quando uso quella chiamata come hai scritto, emacs mi dice "Questo gruppo di sessioni non ha membri"
Madeleine P. Vincent,

@ MadeleineP.Vincent Sì, ma questo non è un messaggio di errore; viene visualizzato in quello che sembra essere una sorta di buffer di panoramica. Per ottenere la differenza effettiva, tutto ciò che devi fare è premere D( ediff-show-dir-diffs).
È il

Sono vicino, ma non del tutto lì. Quando *** No differences ***premo D, mostra dir1 e dir2 e , anche se invoco ediff dall'interno di Emacs con Mx, tutto funziona come previsto (ovvero, vengono mostrate le differenze). Forse ho qualcosa impostato diversamente nei miei .emacs.
Madeleine P. Vincent,

3

Uso il seguente script: controlla in anticipo se ci sono differenze e, nel caso ce ne siano, apre Emacs con la funzione appropriata valutata. Con l' -dopzione, presuppone che gli elementi forniti siano directory e ediff-directoriesinvece di ediff-filesessere utilizzati; in caso contrario controlla se si tratta di directory o file e imposta la funzione da utilizzare di conseguenza.

#! / Bin / sh

EMACS = $ (quale emacs)

if [$ # -lt 2]; poi
    echo "Utilizzo ::" `basename $ 0`" [-d] item1 item2 "
    uscita 1
fi

dir = "no"
if ["$ 1" = "-d"]; poi
    dir = "YES"
    item1 = "$ 2"
    item2 = "$ 3"
altro
    se [-d "$ 1" -a -d "$ 2"]; poi
        dir = "YES"
    fi
    item1 = "$ 1"
    item2 = "$ 2"
fi

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

    # Verifica che i file esistano
    Se [ ! -f "$ item1"]; poi
        printf "File% s non trovato. \ n" "$ item1"
        uscita 2
    fi
    Se [ ! -f "$ item2"]; poi
        printf "File% s non trovato. \ n" "$ item2"
        uscita 2
    fi

    # Controlla se i file sono identici o meno
    diffdata = `diff" $ item1 "" $ item2 "`
    if ["_" = "_ $ diffdata"]; poi
        printf "% s e% s sono identici. \ n" "$ item1" "$ item2"
        uscita 3
    fi

fi

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

# Esegui Emacs con la funzione ediff-files
printf "Confronto tra i file% se% s.." "$ item1" "$ item2"
$ EMACS -q -nw -eval "($ diff_fn \" $ item1 \ "\" $ item2 \ "$ opt)" && echo done.

uscita 0

Dal momento che controlla se ci sono differenze in anticipo, lo trovo molto utile quando si confrontano molti file in diverse cartelle, dalla riga di comando, invece di eseguire una singola sessione diff nelle cartelle principali. Ad esempio per confrontare le cartelle A e B e copiare i file inesistenti dal primo all'altro ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.