Starten Sie Emacs mit Ediff-Dateien (von Ediff-Verzeichnissen) über die Befehlszeile

8

Ich möchte Emacs starten, um entweder Dateien oder Verzeichnisse zu bearbeiten. Zum Beispiel möchte ich etwas wie:

emacs -f ediff-files file1 file2

Aber wenn ich das mache, werden Datei1 und Datei2 nicht als die beiden Dateien verwendet, um sich zu unterscheiden. Emacs fordert mich vielmehr auf, die Dateien zu unterscheiden.

Weiß jemand, wie man das in einer Kommandozeile macht?

Madeleine P. Vincent
quelle

Antworten:

10

Ich bin mir ziemlich sicher, dass es andere Lösungen gibt, aber Sie können dies --evalanstelle von -f( --funcall) tun :

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

In der Tat, die Emacs - Handbuch auf „Befehlszeilenargumente für Emacs Invocation“ sagt , dass -f functionund--funcall function

Rufen Sie die Lisp- Funktion auf . Wenn es sich um eine interaktive Funktion (einen Befehl) handelt, werden die Argumente interaktiv gelesen, als hätten Sie dieselbe Funktion mit einer Tastenfolge aufgerufen. Andernfalls wird die Funktion ohne Argumente aufgerufen.

Dies erklärt, warum Sie mit -f/ nicht das gewünschte Verhalten erzielen können --funcall.


ediff-directories nimmt drei Argumente an, daher ändert sich der oben gezeigte Befehl in

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

Wie hier erläutert , ediff-directorieswird Emacs eingegeben ediff-meta-mode, sodass Sie zuerst im "Ediff Session Group Panel" angezeigt werden. Aus dem Ediff-Handbuch zu Sitzungsgruppen :

Mehrere wichtige Einträge von Ediff führen Vergleiche und Zusammenführungen in Verzeichnissen durch. Bei der Eingabe ediff-directorieswird ediff-directories3[...] dem Benutzer ein Dired-ähnlicher Puffer angezeigt, in dem die für die beteiligten Verzeichnisse gemeinsamen Dateien zusammen mit ihrer Größe aufgelistet sind. [...] Wir nennen diesen Puffer Sitzungsgruppenbereich, da alle Ediff-Sitzungen, die den aufgelisteten Dateien zugeordnet sind, diesen Puffer als gemeinsamen Schwerpunkt haben. [...]

Beim Verzeichnisvergleich oder beim Zusammenführen werden in einem Sitzungsgruppenfenster nur die Dateien angezeigt, die allen beteiligten Verzeichnissen gemeinsam sind. Die Unterschiede werden in einem separaten Verzeichnisdifferenzpuffer gespeichert und bequem durch Eingabe Din das entsprechende Sitzungsgruppenfenster angezeigt . [...]

Um den tatsächlichen Unterschied anzuzeigen, drücken Sie einfach D( ediff-show-dir-diffs).

itsjeyd
quelle
das funktioniert gut für ediff-dateien. Vielen Dank! Ich kann immer noch keine Ediff-Verzeichnisse zum Arbeiten. Irgendwelche Ideen?
Madeleine P. Vincent
@ MadeleineP.Vincent Könnten Sie etwas genauer sagen, was nicht funktioniert? Für mich emacs --eval '(ediff-directories "dir1" "dir2" "regexp")'funktioniert gut.
Itsjeyd
Wenn ich diesen Anruf benutze, wie Sie geschrieben haben, sagt mir emacs: "Diese Sitzungsgruppe hat keine Mitglieder"
Madeleine P. Vincent
@ MadeleineP.Vincent Ja, aber dies ist keine Fehlermeldung. Es wird in einer Art Übersichtspuffer angezeigt. Um den tatsächlichen Unterschied zu erhalten, müssen Sie nur D( ediff-show-dir-diffs) drücken .
Itsjeyd
Ich bin nah dran, aber nicht ganz da. Wenn ich D drücke, werden dir1 und dir2 angezeigt, und *** No differences ***obwohl ich ediff aus emacs mit Mx aufrufe, funktioniert alles wie erwartet (dh die Unterschiede werden angezeigt). Vielleicht habe ich etwas anderes in meinen .emacs eingestellt.
Madeleine P. Vincent
3

Ich verwende das folgende Skript: Es prüft im Voraus, ob es Unterschiede gibt, und öffnet Emacs mit der entsprechenden ausgewerteten Funktion. Bei dieser -dOption wird davon ausgegangen, dass die bereitgestellten Elemente Verzeichnisse sind und ediff-directoriesstattdessen ediff-filesverwendet werden. Andernfalls wird überprüft, ob es sich um Verzeichnisse oder Dateien handelt, und die entsprechende Funktion wird festgelegt.

#! / bin / sh

EMACS = $ (welche Emacs)

if [$ # -lt 2]; dann
    echo "Usage ::" `basename $ 0`" [-d] item1 item2 "
    Ausfahrt 1
fi

dir = "nein"
if ["$ 1" = "-d"]; dann
    dir = "ja"
    item1 = "$ 2"
    item2 = "$ 3"
sonst
    if [-d $ 1 -a -d $ 2]; dann
        dir = "ja"
    fi
    item1 = "$ 1"
    item2 = "$ 2"
fi

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

    # Überprüfen Sie, ob Dateien vorhanden sind
    wenn [ ! -f "$ item1"]; dann
        printf "Datei% s nicht gefunden. \ n" "$ item1"
        Ausfahrt 2
    fi
    wenn [ ! -f "$ item2"]; dann
        printf "Datei% s nicht gefunden. \ n" "$ item2"
        Ausfahrt 2
    fi

    # Überprüfen Sie, ob die Dateien identisch sind oder nicht
    diffdata = `diff" $ item1 "" $ item2 "`
    if ["_" = "_ $ diffdata"]; dann
        printf "% s und% s sind identisch. \ n" "$ item1" "$ item2"
        Ausfahrt 3
    fi

fi

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

# Führen Sie Emacs mit der Funktion ediff-files aus
printf "Vergleichen der Dateien% s und% s ..." "$ item1" "$ item2"
$ EMACS -q -nw -eval "($ diff_fn \" $ item1 \ "\" $ item2 \ "$ opt)" && echo done.

Ausfahrt 0

Da es im Voraus prüft, ob es Unterschiede gibt, finde ich es sehr praktisch, wenn ich viele Dateien in verschiedenen Ordnern über die Befehlszeile vergleiche, anstatt eine einzelne Diff-Sitzung in den übergeordneten Ordnern auszuführen. Zum Beispiel zum Vergleichen der Ordner A und B und zum Kopieren nicht vorhandener Dateien von der ersten in die andere ...

JC Gonzalez
quelle