Pada "really edit the buffer", sudahkah emacs menjalankan ediff-current-file secara otomatis?

11

Konteks

Ketika emacs mendeteksi bahwa suatu file diubah di luar buffer pengeditan.

Diamati

emacs akan bertanya:

namafile berubah dalam disk; benar-benar mengedit buffer? (y, n, r atau Ch)

(Kebetulan, kadang-kadang terjadi bahkan ketika tidak ada perubahan aktual, misalnya file jarak jauh pada server dengan jam melayang, tetapi pertanyaannya menarik dalam semua kasus.)

Berharap

emacs akan bertanya:

namafile berubah dalam disk; benar-benar mengedit buffer? (y, n, r, d atau Ch)

Menekan dakan menunjukkan perbedaan antara versi, misalnya ediff-current-fileyang memungkinkan untuk menjalankan perbedaan secara interaktif.

Informasi tambahan

Itu akan mirip dengan apa yang dilakukan manajemen paket Debian ketika mendeteksi bahwa file konfigurasi yang disesuaikan secara lokal akan diperbarui oleh versi yang lebih baru dari paket kepemilikannya. Sebagai contoh, lihat Versi baru dari file konfigurasi / etc / default / grub tersedia, tetapi versi yang diinstal saat ini telah dimodifikasi secara lokal - Unix & Linux Stack Exchange

Cari sebelum Anda bertanya

Saya biasanya menemukan cara saya untuk solusi (misalnya emacsclient - Dari skrip eksternal, buka file dan jalankan beberapa ekspresi sederhana apakah emacs sudah berjalan atau tidak - Emacs Stack Exchange ) tetapi setelah mencari ini saya tidak dapat menemukan solusi yang sudah ada sebelumnya.

Saya akan mempertimbangkan menyesuaikan ini sendiri tetapi saya tidak cukup mahir di emacs-lisp dan emacs internal.

Sketsa solusi

  • Menekan C-gkemudian 'Mx ediff-current-file` melakukan pekerjaan, dengan mengorbankan beberapa penekanan tombol.
  • Tujuannya di sini adalah untuk menjalankan ediff-current-filepada satu penekanan tombol pada prompt di atas.
Stéphane Gourichon
sumber
@Gilles terima kasih. Ya, terkait dan berbeda. Tautan Anda adalah tentang waktu pembukaan file. Ini dia tentang menghemat waktu file.
Stéphane Gourichon

Jawaban:

2

grepping untuk "really edit the buffer" di sumber emacs saya menemukan fungsi ask-user-about-supersession-threatdalam file userlock.el.

Tampaknya mudah untuk menambahkan dpilihan untuk menelepon ediff-current-file. Saya belum menguji ini secara ekstensif, (suntingan ditandai dengan ;;-komentar).

(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))))
JeanPierre
sumber
Tampaknya bekerja dengan baik pada emacs 46.1 di Ubuntu 16.04. Terima kasih!
Stéphane Gourichon