Lancez emacs avec les fichiers ediff (des répertoires ediff) à partir de la ligne de commande


8

Je voudrais lancer emacs pour éditer des fichiers ou des répertoires. Par exemple, j'aimerais quelque chose comme:

emacs -f ediff-files file1 file2

Mais quand je fais cela, il ne prend pas les fichiers file1 et file2 comme diff deux. Au contraire, emacs me demande de différencier les fichiers.

Est-ce que quelqu'un sait comment faire cela en une seule ligne de commande?

Réponses:


10

Je suis sûr qu'il existe d'autres solutions, mais vous pouvez le faire en utilisant --evalau lieu de -f( --funcall):

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

En fait, le manuel Emacs sur "Arguments de ligne de commande pour l'invocation Emacs" dit que -f functionet--funcall function

Appelez la fonction de fonction Lisp . S'il s'agit d'une fonction interactive (une commande), elle lit les arguments de manière interactive comme si vous aviez appelé la même fonction avec une séquence de touches. Sinon, il appelle la fonction sans arguments.

Cela explique pourquoi vous ne pouvez pas obtenir le comportement souhaité avec -f/ --funcall.


ediff-directories prend trois arguments, donc la commande ci-dessus devient

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

Comme expliqué ici , ediff-directoriesfait entrer Emacs ediff-meta-mode, vous serez donc d'abord déposé dans le "panneau de groupe de session Ediff". Extrait du manuel Ediff sur les groupes de sessions :

Plusieurs entrées importantes d'Ediff effectuent des comparaisons et des fusions sur des répertoires. En entrant ediff-directories, ediff-directories3[...] l'utilisateur se voit présenter un tampon de type Dired qui répertorie les fichiers communs aux répertoires concernés ainsi que leurs tailles. [...] Nous appelons ce panneau de groupe de sessions tampon car toutes les sessions Ediff associées aux fichiers répertoriés auront ce tampon comme point focal commun. [...]

Dans la comparaison ou la fusion de répertoires, un panneau de groupe de sessions affiche uniquement les fichiers communs à tous les répertoires impliqués. Les différences sont conservées dans un tampon de différence de répertoire distinct et sont facilement affichées en tapant Ddans le panneau de groupe de sessions correspondant. [...]

Donc, pour afficher le diff réel, appuyez simplement sur D( ediff-show-dir-diffs).


qui fonctionne très bien pour les fichiers ediff. Merci! Je ne peux toujours pas travailler avec les répertoires ediff. Des idées?
Madeleine P. Vincent

@ MadeleineP.Vincent Pourriez-vous être un peu plus précis sur ce qui ne fonctionne pas? Pour moi, ça emacs --eval '(ediff-directories "dir1" "dir2" "regexp")'marche bien.
itsjeyd

Quand j'utilise cet appel comme vous l'avez écrit, emacs me dit: "Ce groupe de session n'a pas de membres"
Madeleine P. Vincent

@ MadeleineP.Vincent Oui, mais ce n'est pas un message d'erreur; il est affiché dans ce qui semble être une sorte de tampon de vue d'ensemble. Pour obtenir la différence réelle, il vous suffit de cliquer sur D( ediff-show-dir-diffs).
itsjeyd

Je suis proche, mais pas tout à fait là. Lorsque je frappe D, il affiche dir1 et dir2, et *** No differences ***, même si j'invoque ediff depuis emacs avec Mx, tout fonctionne comme prévu (c'est-à-dire que les différences sont affichées). Peut-être que j'ai quelque chose de différent dans mes .emacs.
Madeleine P. Vincent

3

J'utilise le script suivant: il vérifie à l'avance s'il y a des différences, et s'il y en a, il ouvre Emacs avec la fonction appropriée évaluée. Avec l' -doption, il suppose que les éléments fournis sont des répertoires, et ediff-directoriesau lieu de ediff-filesest utilisé; sinon, il vérifie s'il s'agit de répertoires ou de fichiers et définit la fonction à utiliser en conséquence.

#! / bin / sh

EMACS = $ (quels emacs)

if [$ # -lt 2]; puis
    echo "Usage ::" `basename $ 0`" [-d] item1 item2 "
    sortie 1
Fi

dir = "non"
if ["$ 1" = "-d"]; puis
    dir = "oui"
    item1 = "$ 2"
    item2 = "$ 3"
autre
    if [-d "$ 1" -a -d "$ 2"]; puis
        dir = "oui"
    Fi
    item1 = "$ 1"
    item2 = "$ 2"
Fi

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

    # Vérifiez que les fichiers existent
    si [ ! -f "$ item1"]; puis
        printf "Fichier% s introuvable. \ n" "$ item1"
        sortie 2
    Fi
    si [ ! -f "$ item2"]; puis
        printf "Fichier% s introuvable. \ n" "$ item2"
        sortie 2
    Fi

    # Vérifiez si les fichiers sont identiques ou non
    diffdata = `diff" $ item1 "" $ item2 "`
    if ["_" = "_ $ diffdata"]; puis
        printf "% s et% s sont identiques. \ n" "$ item1" "$ item2"
        sortie 3
    Fi

Fi

diff_fn = "fichiers ediff"
if ["$ dir" = "yes"]; puis
    diff_fn = "répertoires ediff"
    opt = "\" \ ""
Fi

# Exécuter Emacs avec la fonction ediff-files
printf "Comparaison des fichiers% s et% s.." "$ item1" "$ item2"
$ EMACS -q -nw -eval "($ diff_fn \" $ item1 \ "\" $ item2 \ "$ opt)" && echo done.

sortie 0

Puisqu'il vérifie s'il y a des différences à l'avance, je trouve cela très pratique lors de la comparaison de nombreux fichiers dans différents dossiers, à partir de la ligne de commande, au lieu d'exécuter une seule session diff dans les dossiers parents. Par exemple pour comparer les dossiers A et B, et copier des fichiers inexistants du premier vers l'autre ...

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.