总结了一下自动保存的姿势

@Jousimies 我目前正在使用你的策略,挺好用的,多谢提醒。

这个策略在我的环境下无法奏效。我设置比较多,等有空了再排查下原因。目前用 @Jousimies 的方法过度一下。

@zqso 我刚才去看了下 org-capture 的源码,优化了下方案。你试试这个看,我这边是完全没问题了。

(setq auto-save-disable-predicates
        '((lambda ()
            (eq (buffer-base-buffer (get-buffer (concat "CAPTURE-" (buffer-name))))
                (current-buffer)))))
3 个赞

明白。果然还是大佬看问题全面些。我的使用场景相对简单,所以一直以来,就用这个了。

@manateelazycat

给 auto-save 发了个 PR,采用了 org-capture 源码中的类似的策略。 判断当前buffer 是否与 org-capture 的 buffer 有关联,有的话就不保存。 我这边测试下来一切正常了。

2 个赞

已经合并,感谢补丁

1 个赞

感谢大佬 @aqua0210 。我测试了下,正常使用了,极其舒适。也感谢 @manateelazycat 深夜合并 :partying_face:

最近又开始用 undo-tree,可是undo-tree-visualizeC-x u) 会和 auto-save 冲突,通过C-x u进行 undo 和 redo 时也会触发自动保存,有时会打断undo-tree-visualize

通过下面的设置可以彻底解决这个问题,在 undo-tree-visualize显示时,不会进行任何的自动保存,只会在退出 undo-tree-visualize后才保存。

(add-to-list 'auto-save-disable-predicates
               (lambda () (buffer-live-p (get-buffer " *undo-tree*"))))
2 个赞

你好,请问你是怎么配置auto-save的呢,我还是无法令他不自动删除行尾空格,可以看看你的这部分设置吗?

auto-save 后来做了很多小改进,默认情况下是不需要调整的。

如果你半年前用straight装过auto-save, 记得升级包。

(use-package auto-save
  :hook (find-file-hook . auto-save-enable)
  :config
  (setq auto-save-idle 1
        auto-save-silent t
        auto-save-delete-trailing-whitespace t))
1 个赞

好的谢谢,我这就试试看

我也理解不了unless 每次看半天

if nil

if (condition) {

} else {
  // "unless" function body goes here
}

可能與我遇到的情況一樣,其實不是auto-save自動刪除的空格,可能是其他配置,同樣,我也找不到誰搞的鬼。

论坛的回复框已经详细说了怎么排查配置, 读一读吧。

这种应该用:custom会更好些吧?(另外Emacs 29 引入了setopt

(use-package auto-save
  :hook (find-file-hook . auto-save-enable)
  :custom
  (auto-save-idle 1)
  (auto-save-silent t)
  (auto-save-delete-trailing-whitespace t))

或者

(use-package auto-save
  :hook (find-file-hook . auto-save-enable)
  :config
  (setopt auto-save-idle 1
          auto-save-silent t
          auto-save-delete-trailing-whitespace t))

謝謝,重新拜讀了一遍,學會了二分法。排查了一上午,最後發現auto-save在emacs 29的doom下面,已經是自動刪除空格了。設置無效,即auto-save可能跟doom的某個設置有衝突。

delete trailing whitespace, 使用的是如下配置:

;; Visualize TAB, (HARD) SPACE, NEWLINE
(setq-default show-trailing-whitespace nil) ; Don't show trailing whitespace by default
(defun enable-trailing-whitespace ()
  "Show trailing spaces and delete on saving."
  (setq show-trailing-whitespace t)
  (add-hook 'before-save-hook #'delete-trailing-whitespace nil t))
(add-hook 'prog-mode #'enable-trailing-whitespace)

可是不起作用。

使用 auto-save,

(use-package auto-save
  :ensure nil
  :load-path "site-lisp/auto-save"
  :hook (find-file-hook . auto-save-enable)
  :custom
  (auto-save-idle 1)
  (auto-save-silent t)
  (auto-save-delete-trailing-whitespace t))

依然不起作用,这个还真不好调试 ~

:custom 的机制有可能使各种 :defer 机制失败

假设包的 defcustom 写得不规范 (比如参数值必须是数字,但defcustom里错误指定了:type 为 'boolean),包加载时会报错,但用户本身并做不了什么。所以除非是热心用户,经常给上游报错,上游也很 responsive, 不太推荐setopt。

1 个赞

:custom以前用的比较多 现在不用use-package了。

我自从开始用master以后就开始用setopt,warning确实多(注意不是报错),不过我每次看到就把对应的包下载下来修改所有的defcustom定义,然后发PR出去。这样至少以后用户在用customize界面时里面的框架是正确的(不会出现要求整数结果来radio button的情况)。

2 个赞