在执行恢复缓冲区或使用自动恢复模式后,如何让Emacs保留其缓冲区的撤消历史记录?
在Vim中,如果在光盘上更改了缓冲区中打开的文件,Vim会提示我重新加载该文件.然后,如果我愿意的话,我可以简单地点击"你"来撤消重新加载,甚至可以从那时起再往前走.当我恢复缓冲区时,Emacs似乎丢弃了所有撤消信息.
Emacs允许您设置revert-buffer-function以覆盖行为.这是一个保留历史记录的恢复缓冲区实现.
;; emacs doesn't actually save undo history with revert-buffer
;; see http://lists.gnu.org/archive/html/bug-gnu-emacs/2011-04/msg00151.html
;; fix that.
(defun revert-buffer-keep-history (&optional IGNORE-AUTO NOCONFIRM PRESERVE-MODES)
(interactive)
;; tell Emacs the modtime is fine, so we can edit the buffer
(clear-visited-file-modtime)
;; insert the current contents of the file on disk
(widen)
(delete-region (point-min) (point-max))
(insert-file-contents (buffer-file-name))
;; mark the buffer as not modified
(not-modified)
(set-visited-file-modtime))
(setq revert-buffer-function 'revert-buffer-keep-history)
Run Code Online (Sandbox Code Playgroud)
我想明显的方法是杀死当前缓冲区内容的函数,然后调用insert-file从文件中读取当前内容。
如果对文件的更改包括对字符编码的更改,可能会出现问题?我还没有测试过。
这是我目前的尝试。在我看来,这有点毛茸茸的,但效果还不错。
;; Allow buffer reverts to be undone
(defun my-revert-buffer (&optional ignore-auto noconfirm preserve-modes)
"Revert buffer from file in an undo-able manner."
(interactive)
(when (buffer-file-name)
;; Based upon `delphi-save-state':
;; Ensure that any buffer modifications do not have any side
;; effects beyond the actual content changes.
(let ((buffer-read-only nil)
(inhibit-read-only t)
(before-change-functions nil)
(after-change-functions nil))
(unwind-protect
(progn
;; Prevent triggering `ask-user-about-supersession-threat'
(set-visited-file-modtime)
;; Kill buffer contents and insert from associated file.
(widen)
(kill-region (point-min) (point-max))
(insert-file-contents (buffer-file-name))
;; Mark buffer as unmodified.
(set-buffer-modified-p nil))))))
(defadvice ask-user-about-supersession-threat
(around my-supersession-revert-buffer)
"Use my-revert-buffer in place of revert-buffer."
(let ((real-revert-buffer (symbol-function 'revert-buffer)))
(fset 'revert-buffer 'my-revert-buffer)
;; Note that `ask-user-about-supersession-threat' calls
;; (signal 'file-supersession ...), so we need to handle
;; the error in order to restore revert-buffer.
(unwind-protect
ad-do-it
(fset 'revert-buffer real-revert-buffer))))
(ad-activate 'ask-user-about-supersession-threat)
Run Code Online (Sandbox Code Playgroud)
令人烦恼的是,我刚刚注意到revert-buffer文档中所有看起来相关的信息,所以可能有一种更简单的方法来做到这一点。
如果 的值
revert-buffer-function非零,则调用它来完成该命令的所有工作。否则,钩子before-revert-hook和after-revert-hook会在开头和结尾运行,如果revert-buffer-insert-file-contents-function非零,则调用它而不是重新读取访问的文件内容。
| 归档时间: |
|
| 查看次数: |
1665 次 |
| 最近记录: |