「バッファを本当に編集する」で、emacsはediff-current-fileを自動的に実行しましたか?


11

環境

emacsが編集バッファーの外でファイルが変更されたことを検出したとき。

観察された

emacsは尋ねます:

ディスクでsomefilenameが変更されました。本当にバッファを編集しますか?(y、n、rまたはCh)

(ちなみに、実際には変更がない場合でも発生することがあります。たとえば、時計がずれているサーバー上のリモートファイルですが、問題はすべてのケースで興味深いものです。)

願い

emacsは尋ねます:

ディスクでsomefilenameが変更されました。本当にバッファを編集しますか?(y、n、r、dまたはCh)

を押すdと、バージョン間の違いが表示されます。たとえばediff-current-file、インタラクティブに違いを確認できます。

追加情報

これは、ローカルにカスタマイズされた構成ファイルが所有するパッケージの新しいバージョンによって更新されたことを検出したときに、Debianパッケージ管理が行うことと似ています。例については、新しいバージョンの構成ファイル/ etc / default / grubが利用可能ですが、現在インストールされているバージョンはローカルで変更されています-Unix&Linux Stack Exchange

尋ねる前に検索

私は通常、解決策への道を見つけます(例:emacsclient-外部スクリプトからファイルを開いて、emacsが既に実行されているかどうかにかかわらず、単純な式を実行します-Emacs Stack Exchange)。これを検索した後、既存の解決策は見つかりませんでした。

私はこれを自分で調整することを検討しますが、emacs-lispとemacsの内部については十分に熟達していません。

ソリューションのスケッチ

  • C-g次に、「Mx ediff-current-file」を押すと、いくつかのキーストロークを犠牲にして機能します。
  • ここでの目標ediff-current-fileは、上記のプロンプトで1回のキープレスで実行することです。


@ギレスありがとうございます。はい、関連しています。リンクはファイルを開く時間についてです。ここでは、ファイルの保存時間について説明します。
ステフェイン・グーリッホン

回答:


2

emacsソースの「バッファを実際に編集」するためのgreppingask-user-about-supersession-threat、fileで関数を見つけましたuserlock.el

dを呼び出すための選択肢を追加するのは簡単なようediff-current-fileです。ただし、これについては十分にテストしていません(;;-コメント付きの編集)。

(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))))

Ubuntu 16.04上のemacs 46.1でうまく機能するようです。ありがとう!
ステフェイン・グーリッホン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.