emacs auto-save 自动保存的问题

自己使用 auto-save (http://www.emacswiki.org/emacs/download/init-auto-save.el)来进行文件的自动保存,但是在使用过程中发现一些问题。第一,在即将保存的时候,此时突然打字,会出现短暂的卡顿的情况。第二,在即将保存的时候,在emacs中执行其他的任务会被自动保存打断。所以,如何才能真正做到“安静”地自动保存文件呢?感觉使用这个插件在实际过程中会被干扰。

1 个赞

你可以试试这个,只在你停顿的时候自动保存(我没用过,不保证效果)。说明在这里

我用的就是这个插件。

run-idlle-timer是不是就可以解决?

:rofl: 抱歉没看仔细

是即将保存,还是在保存过程中?emacs不是多线程,而自动保存必须用主进程,所以buffer多,保存的hook多,会碰到问题

因该是保存过程中,也就是在从保存开始到结束,emacs给人的感觉是中间有一段间隔。虽然这个时间很短暂,但是emacs给用户的感觉还是有点时间的,能感觉到。

今天刚用上了 super-save,是会在发生事件的时候保存,比如你切换了 buffer,或者焦点不在 emacs 上时。目前用下来还不错。

如果监测文件目录以自动 build,而 build 一般比较耗时,那自动保存(到当前目录)不见得是个好主意–后台 每时每刻 都在 building。。。

一个建议是:保存文件副本到别处,不管当前文件 hook 了多少东西,都不会受到拖累。


至于保存时机,个人觉得隔段时间存个副本好一些。

我觉得切换buff或失去焦点触发保存很好,我也换成super-save了

我也觉得直接自动保存到当前目录有点没有安全感,请问下有可自动备份到临时目录的插件吗?

emacs 自带的 auto-save 功能就可以自动保存到临时目录可以参考

也可试试 backup-file : 自动将emacs中所做的更改保存在特定文件夹中。

使用陈斌的配置,发现在编辑文件的时候在目录~/.backups下并没有保存的临时文件,奇怪了?这个配置我之前使用过,一直没发现有保存的文件。

保存到特定目录或者多版本保存的策略都难用的要死。

特别是停电或程序崩溃时,你怎么知道哪个临时版本才是你想要的版本?

自动保存的意义是不要有任何脑负担,版本管理交给git去处理,比临时文件策略稳健的多。

如果有性能问题可以定制手指头松了多长时间去保存或者直接定位真实的性能问题。

Hi,我上面说的在保存短暂过程中卡顿的问题针对emacs可以解决吗?这个确实明显感觉道卡顿,特别在保存那个短暂的过程中突然又打字了,会感觉道卡顿.这个不知道有没有办法解决?

用 profile-start 和 profile-report 这两个命令排查一下性能原因。

我用auto-save.el很多年了,一般保存卡顿都是别的插件写的有问题,然后把有问题代码挂到 save file hook上导致的。

2 个赞

我刚刚测试了编辑 ~/.viminfo 文件,产生了保存的临时文件。如图 2019-10-06-144602_393x66_scrot

非常赞成懒猫的话,版本管理还是交给git处理吧!我推荐的backup-file包就是通过git管理在emacs中修改文件的备份。

确实有道理.版本控制还是交给git来管理比较好.

我不知道,没在使用 emacs。不过,编辑器面临的问题大体类似。

保存到特定目录,最好绕过文件 hook,这样不会受到拖累,做到精简、高效、可靠。如果我们是在谈论 Crash Recovery 的话。

super-save只存一个文件,少数情况下会漏掉,很烦,我提过issue,具体不去找了。lazycat的遍历所有buffer的比较可靠,不过我没手动遍历,改用了built-in的save-some-buffers,并且加了focus-out-hook,否则在我写网页时,切去浏览器看它自动给我刷新的结果,还要等idle delay的1秒钟(我喜欢1秒钟,0.5 0.3秒能更快触发监控文件的其它进程,但是mode line的保存标志一直抖动看着难受)。贴一下代码,没几行:

(setq auto-save-default nil)

(defvar jester-auto-save-idle 1 "Time in seconds before auto-saving all buffers.")
(run-with-idle-timer jester-auto-save-idle t #'jester/save-all-buffers)
;; (cancel-function-timers 'jester/save-all-buffers) ; for debugging
(add-hook 'focus-out-hook #'jester/save-all-buffers)

;;----------------------------------------------------------------------------
;; Save all buffers.
;;----------------------------------------------------------------------------
(defun jester/save-all-buffers ()
  "Save all buffers."
  ;; yas overlay and company-select-next has problem with this.
  (when (and (not yas--active-snippets)
             (not company-candidates)
             (not (eq major-mode 'snippet-mode)))
    ;; https://github.com/manateelazycat/lazycat-emacs/commit/da13a688ef89f8ab2c577a3e9d2a7bcf0ef9b71d
    (with-temp-message
       (with-current-buffer " *Minibuf-0*" (buffer-string))
     (save-some-buffers t #'(lambda () (and (buffer-file-name) (buffer-modified-p)))))))