Inicie o emacs com arquivos ediff (de diretórios ediff) na linha de comando

8

Gostaria de lançar o emacs para ediff arquivos ou diretórios. Por exemplo, eu gostaria de algo como:

emacs -f ediff-files file1 file2

Mas quando faço isso, não leva arquivo1 e arquivo2 como os dois arquivos a serem diferentes. Em vez disso, o emacs solicita que os arquivos sejam diferentes.

Alguém sabe como fazer isso em uma linha de comando?

Madeleine P. Vincent
fonte

Respostas:

10

Tenho certeza de que existem outras soluções, mas você pode fazer isso usando em --evalvez de -f( --funcall):

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

De fato, o manual do Emacs sobre "Argumentos de linha de comando para invocação do Emacs" diz que -f functione--funcall function

Chame a função de função Lisp . Se for uma função interativa (um comando), ele lê os argumentos interativamente, como se você tivesse chamado a mesma função com uma sequência de teclas. Caso contrário, ele chama a função sem argumentos.

Isso explica por que você não pode obter o comportamento desejado com -f/ --funcall.


ediff-directories leva três argumentos; portanto, o comando mostrado acima muda para

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

Conforme explicado aqui , ediff-directoriesfaz com que o Emacs entre ediff-meta-mode, então você será incluído no "Painel do grupo de sessões do Ediff" primeiro. No manual Ediff sobre Grupos de sessões :

Várias entradas principais do Ediff realizam comparação e mesclagem em diretórios. Ao entrar ediff-directories, ediff-directories3[...] o usuário recebe um buffer do tipo Dired que lista os arquivos comuns aos diretórios envolvidos, juntamente com seus tamanhos. [...] Chamamos esse painel de grupo de sessões de buffer porque todas as sessões do Ediff associadas aos arquivos listados terão esse buffer como ponto focal comum. [...]

Na comparação ou mesclagem de diretórios, um painel de grupo de sessões exibe apenas os arquivos comuns a todos os diretórios envolvidos. As diferenças são mantidas em um buffer de diferenças de diretório separado e são exibidas convenientemente, digitando- Dse no painel do grupo de sessões correspondente. [...]

Então, para exibir o diff real, basta pressionar D( ediff-show-dir-diffs).

itsjeyd
fonte
isso funciona muito bem para arquivos ediff. Obrigado! Ainda não consigo ediff-diretórios para trabalhar. Alguma ideia?
Madeleine P. Vincent
@ MadeleineP.Vincent Você poderia ser um pouco mais específico sobre o que não está funcionando? Para mim, emacs --eval '(ediff-directories "dir1" "dir2" "regexp")'funciona bem.
itsjeyd
Quando uso essa ligação como você escreveu, o emacs me diz: "Este grupo de sessões não tem membros"
Madeleine P. Vincent
@ MadeleineP.Vincent Sim, mas esta não é uma mensagem de erro; é exibido no que parece ser algum tipo de buffer de visão geral. Para obter o diff real, tudo que você precisa fazer é pressionar D( ediff-show-dir-diffs).
itsjeyd
Estou perto, mas não estou lá. Quando *** No differences ***clico em D, ele mostra dir1 e dir2 e , mesmo que eu invoque ediff do emacs com o Mx, tudo funciona como esperado (ou seja, as diferenças são mostradas). Talvez eu tenha algo definido de maneira diferente nos meus .emacs.
Madeleine P. Vincent
3

Eu uso o seguinte script: ele verifica com antecedência se há diferenças e, se houver, abre o Emacs com a função apropriada avaliada. Com a -dopção, assume que os itens fornecidos são diretórios e, em ediff-directoriesvez de, ediff-filessão usados; caso contrário, verifica se são diretórios ou arquivos e define a função para usá-la de acordo.

#! / bin / sh

EMACS = $ (que emacs)

if [$ # -lt 2]; então
    echo "Usage ::" `basename $ 0`" [-d] item1 item2 "
    saída 1
fi

dir = "não"
if ["$ 1" = "-d"]; então
    dir = "sim"
    item1 = "$ 2"
    item2 = "$ 3"
outro
    se [-d "$ 1" -a -d "$ 2"]; então
        dir = "sim"
    fi
    item1 = "$ 1"
    item2 = "$ 2"
fi

if ["$ dir" = "no"]; então

    # Verifique se os arquivos existem
    E se [ ! -f "$ item1"]; então
        printf "O arquivo% s não foi encontrado. \ n" "$ item1"
        saída 2
    fi
    E se [ ! -f "$ item2"]; então
        printf "O arquivo% s não foi encontrado. \ n" "$ item2"
        saída 2
    fi

    # Verifique se os arquivos são idênticos ou não
    diffdata = `diff" $ item1 "" $ item2 "`
    if ["_" = "_ $ diffdata"]; então
        printf "% se% s são idênticos. \ n" "$ item1" "$ item2"
        saída 3
    fi

fi

diff_fn = "arquivos ediff"
if ["$ dir" = "yes"]; então
    diff_fn = "diretórios ediff"
    opt = "\" \ ""
fi

# Execute o Emacs com a função ediff-files
printf "Comparando arquivos% se% s..." "$ item1" "$ item2"
$ EMACS -q -nw -eval "($ diff_fn \" $ item1 \ "\" $ item2 \ "$ opt)" && echo concluído.

saída 0

Como ele verifica se há diferenças antecipadamente, acho muito útil ao comparar vários arquivos em pastas diferentes, na linha de comando, em vez de executar uma única sessão diff nas pastas pai. Por exemplo, para comparar as pastas A e B e copiar arquivos inexistentes do primeiro para o outro ...

JC Gonzalez
fonte