Eu preciso do diff de dois buffers. Uma maneira seria criar arquivos temporários contendo o conteúdo desses buffers e usar a diff
função No entanto, os buffers contêm informações confidenciais e eu preferiria não ter essas informações em texto não criptografado no disco.
Pensei em usar o ediff, que pode comparar diretamente os buffers, mas o ediff inicia uma sessão interativa e quero usá-lo em um script.
ediff-buffers
brevemente o código fonte , parece salvar buffers em arquivos temporários no disco e, em seguida, chamar o utilitário diff do sistema nesses arquivos, para que não haja nenhuma diferença prática em chamar adiff
si mesmo.Respostas:
@tmalsburg, O comando a seguir chama diff em 2 buffers sem a criação de arquivos temporários. Ele usa pipes nomeados, como sugerido acima:
Quando chamado do Lisp, retorna o código de saída do programa diff; ou seja, 0 se os buffers tiverem o mesmo conteúdo, 1 caso contrário.
Testado para o Emacs versão 24.3 em uma máquina executando o Debian GNU / Linux 9.0 (stretch).
O código acima parece funcionar quando chamado de Lisp. Infelizmente, na maioria das vezes mostra uma diferença truncada nas chamadas interativas.
A versão a seguir usa a biblioteca assíncrona de terceiros ; não trunca as diferenças.
fonte
O AFAIU Emacs usa programas externos para fazer a diferença. Por exemplo
ediff-make-diff2-buffer
, que compararia dois buffers, chama internamenteOnde
ediff-diff-program
pode representar o GNU / Linuxdiff
. Com o novo FFI, o sistemadiff
pode estar acessível. Também uma implementação diff do Emacs Lisp pode fazer o trabalho.fonte
Que tal você usar o comando shell para chamar diff, passando um buffer de saída? Ou, shell-command-to-string para obter o diff em uma string
fonte
Se você estiver bem com Ediff, isso fará:
e chame assim:
fonte
(defun my/diff-buffers (buffer-A buffer-B) "Run Ediff on a pair of buffers, BUFFER-A and BUFFER-B." (interactive (list (read-buffer "buffer1: " (current-buffer)) (read-buffer "buffer2: " (current-buffer)))) (ediff-buffers-internal buffer-A buffer-B nil nil 'ediff-buffers))