在“真正编辑缓冲区”上,emacs是否自动运行ediff-current-file?


11

语境

当emacs检测到文件在编辑缓冲区之外被更改时。

观测到的

emacs将询问:

磁盘中的文件名已更改;真的编辑缓冲区吗?(y,n,r或Ch)

(顺便说一句,有时即使没有实际更改,也会发生这种情况,例如时钟漂移的服务器上的远程文件,但是在所有情况下,这个问题都很有趣。)

希望

emacs会问:

磁盘中的文件名已更改;真的编辑缓冲区吗?(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在上述提示下一次按一下键即可运行。


@吉尔斯谢谢你。是的,相关且不同。您的链接是关于文件打开时间的。这是关于文件节省时间。
斯特凡纳·古里科

Answers:


2

ask-user-about-supersession-threat在文件中找到功能的emacs源中grepping “真正编辑缓冲区” 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上运行良好。谢谢!
斯特凡纳·古里科
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.