Em "realmente edite o buffer", o emacs executou o ediff-current-file automaticamente?

11

Contexto

Quando o emacs detecta que um arquivo foi alterado fora de um buffer de edição.

Observado

O emacs perguntará:

nome do arquivo alterado no disco; realmente editar o buffer? (y, n, r ou Ch)

(Aliás, às vezes acontece mesmo quando não há alteração real, por exemplo, arquivo remoto em um servidor com relógio desviado, mas a pergunta é interessante em todos os casos.)

Desejado

o emacs perguntaria:

nome do arquivo alterado no disco; realmente editar o buffer? (y, n, r, d ou Ch)

Pressionar dmostraria a diferença entre as versões, por exemplo, o ediff-current-fileque permite percorrer as diferenças interativamente.

Informação adicional

Isso seria semelhante ao que o gerenciamento de pacotes Debian faz quando detecta que um arquivo de configuração personalizado localmente é atualizado por uma versão mais recente de seu próprio pacote. Para um exemplo, consulte Uma nova versão do arquivo de configuração / etc / default / grub está disponível, mas a versão instalada atualmente foi modificada localmente - Unix e Linux Stack Exchange

Pesquise antes de perguntar

Normalmente encontro o meu caminho para soluções (por exemplo, emacsclient - a partir de um script externo, abra um arquivo e execute uma expressão simples, independentemente de o emacs já estar em execução ou não - Emacs Stack Exchange ), mas depois de pesquisar sobre isso, não consegui encontrar nenhuma solução pré-existente.

Eu consideraria ajustar isso sozinho, mas não sou proficiente o suficiente no emacs-lisp e no emacs internals.

Esboço da solução

  • Pressionar C-gentão 'Mx ediff-current-file' faz o trabalho, ao custo de algumas teclas.
  • O objetivo aqui seria executar ediff-current-fileum pressionamento de tecla no prompt acima.
Stéphane Gourichon
fonte
@Gilles obrigado. Sim, relacionado e diferente. Seu link é sobre o horário de abertura do arquivo. Aqui está o tempo de salvar arquivos.
Stéphane Gourichon 23/10/16

Respostas:

2

grepping para "realmente edite o buffer" no emacs source, encontrei a função ask-user-about-supersession-threatno arquivo userlock.el.

Parece simples adicionar uma dopção para ligar ediff-current-file. Eu não testei isso extensivamente, no entanto (edições marcadas com ;;-comentários).

(defun ask-user-about-supersession-threat (fn)
  "Ask a user who is about to modify an obsolete buffer what to do.
This function has two choices: it can return, in which case the modification
of the buffer will proceed, or it can (signal 'file-supersession (file)),
in which case the proposed buffer modification will not be made.

You can rewrite this to use any criterion you like to choose which one to do.
The buffer in question is current when this function is called."
  (discard-input)
  (save-window-excursion
    (let ((prompt
       (format "%s changed on disk; \
really edit the buffer? (y, n, r, d or C-h) " ;;- changed
           (file-name-nondirectory fn)))
      (choices '(?y ?n ?r ?d ?? ?\C-h))       ;;- changed
      answer)
      (while (null answer)
    (setq answer (read-char-choice prompt choices))
    (cond ((memq answer '(?? ?\C-h))
           (ask-user-about-supersession-help)
           (setq answer nil))
          ((eq answer ?r)
           ;; Ask for confirmation if buffer modified
           (revert-buffer nil (not (buffer-modified-p)))
           (signal 'file-supersession
               (list "File reverted" fn)))
          ((eq answer ?d)                     ;;- added
           (ediff-current-file))              ;;- added
          ((eq answer ?n)
           (signal 'file-supersession
               (list "File changed on disk" fn)))))
      (message
       "File on disk now will become a backup file if you save these changes.")
      (setq buffer-backed-up nil))))
Jean Pierre
fonte
Parece funcionar bem no emacs 46.1 no Ubuntu 16.04. Obrigado!
Stéphane Gourichon