emacs auto-save 自动保存的问题

是即将保存,还是在保存过程中?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)))))))

其实那种保存编译的命令,可以配上 auto-save.el 用延迟build策略就可以了,比如上次保存后,5秒以后才build

这样既方便又省心

凡是保存会导致卡顿的都是装了第三方的插件,在 save file hook 上执行了很多重的操作,都是可以改进的。

使用auto-save插件自动保存mode-line晃动的情况,这个可以有办法解决吗?这个好像比较晃动的比较厉害。

另开帖详细描述

如何在失去程序本身(而不是切换buffer)聚焦后立刻保存呢?
我搜查了,照着做了没有效果

我在iTerm上会频繁左右切换Pane(一个用来写代码,一个用来运行测试),不想每次切换前都要保存一下(VSCode就可以在失去焦点时自动保存啊)

另外一个题外问题(我是新手啊):在用Emacs写C代码的时候,能有系统调用的自动补全吗?

那啥,Emacs 26.1新增了一个auto-save-visited-mode,感觉已经足够用了呀。

1 个赞