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

哦哦 懂了…

@manateelazycat 猫哥,关于这个问题,我提了个可以重现问题的 issue,麻烦有空帮忙看看。

实现了一个比较满意的方案:

(setq auto-save-disable-predicates
        '((lambda ()
            (if (boundp 'org-default-notes-file)
                (and (buffer-live-p (get-buffer (concat "CAPTURE-" (buffer-name))))
                     (string-suffix-p (buffer-name) org-default-notes-file t))))))

这样可以不让 capture buffer 所关联的文件进行自动保存,但是完成 captue 后再去编辑这个文件还是可以自动保存的。

  (add-hook 'org-capture-mode-hook #'(lambda nil (setq auto-save-delete-trailing-whitespace nil)))

我是这样设置的,caputure的时候不会自动保存。

你说的这个方法我试过,不行的。

原因是 M-x,org-capture 会打开一个名字为 ~/.notes 的文件,文件名的值由 org-default-notes-file决定。 当前编辑的 buffer名称是 CAPTURE + org-default-notes-file 拼接而来。当前编辑的 org-capture buffer 本身就不会触发自动保存,因为它没有保存为文件。但是修改当前 org-capture buffer 时会触发与它关联的~/.notes 文件自动保存,所以会自动清理空格。

不知道为什么你们都是可以通过hook来实现,可能是因为我设置了org-default-notes-file 为 “~/org/agenda/inbox.org”,改变了它的 Major-mode 为 org mode?

另外,我更希望 auto-save 搭配 ws-butler 使用,因为它清除空格后会保留虚幻空格。

没看明白什么是修改当前org-capture buffer。

流程不是 org-capture → XXX(key)-> 写内容-> C-c C-c吗?

只要写内容的时候不自动保存就可以了啊。

我看 org-default-notes-file里写的是:

Used as a fall back file for org-capture.el, for templates that do not specify a target file.

所以是不是你的 capture template 的问题?

我上面贴的 github issue 有重现的步骤,你试试看就明白了。emacs -Q 下就可以重现,你当前输入的buffer 名字叫 CPTURE-xxx,他本身已经被auto-save 排除了。

就是这个流程,当前org-capture buffer 意思是指当前你写内容的这个名字叫CAPTURE-xxx 的buffer

已经习惯手动保存在潜意识下按c x c s了。

最小化步骤:

(add-to-list 'load-path "~/.emacs.d/packages/auto-save")
(require 'auto-save)
(setq auto-save-delete-trailing-whitespace t)

(add-hook 'org-capture-mode-hook #'(lambda nil (setq auto-save-delete-trailing-whitespace nil)))

我emacs -q试过了,使用

(add-hook 'org-capture-mode-hook #'(lambda nil (setq auto-save-delete-trailing-whitespace nil)))

可以啊,在org-capturre buffer 里面是不会删空格的。

你再试试。

GNU Emacs 29.0.50 (build 1, aarch64-apple-darwin21.5.0, NS appkit-2113.50 Version 12.4 (Build 21F79)) of 2022-07-17

习惯可以改,我以前也习惯手动保存。 自从用了 auto-save 1 秒保存后,1年多没按过 C-x,C-s 了😄

好,晚上有空再试试看。

auto-save在保存的时候会把org-capture窗口也一并保存了,相当于按下C-c C-c

很好奇,为啥大家都不提auto-save-visited-mode呢?

auto-save-visited-mode is an interactive native compiled Lisp function
in ‘files.el’.

(auto-save-visited-mode &optional ARG)

Toggle automatic saving to file-visiting buffers on or off.

Unlike ‘auto-save-mode’, this mode will auto-save buffer contents
to the visited files directly and will also run all save-related
hooks.  See Info node ‘Saving’ for details of the save process.

<省略部分内容>

  Probably introduced at or before Emacs version 26.1.

根据官方文档介绍空闲5秒会自动保存。

When auto-save-visited-mode is enabled, Emacs will auto-save file-visiting buffers after five seconds of idle time. You can customize the variable auto-save-visited-interval to change the idle time interval.

也有一些更多的选项可以设置。默认的就是预期的行为。

1 个赞

这个 auto-save-visited-mode 确实也行。 不过在开启 ws-butler 时,还是会自动清楚空格。

如果用默认的 5s 是没什么问题,5s 内有足够时间输入,设置为 1s 保存,就不合适了。

我的理解是后面的 (setq auto-save-delete-trailing-whitespace nil) 是全局的,退出后,所有 buffer 不再自动删除空格了,需要配合 (add-hook 'org-capture-after-finalize-hook #'(lambda nil (setq auto-save-delete-trailing-whitespace t)))

另外尝试了 setq-local 替代 setq ,还是会删掉org-capture里的空格。

1 个赞

因为 org-capture 的buffer 本身就没参与 auto-save,参与的是另外一个 buffer,它在后台打开了。你可以 C-x,b 切换过去看。

目前我这个方案是可以解决的,你可以试试看:

(setq auto-save-disable-predicates
        '((lambda ()
            (if (boundp 'org-default-notes-file)
                (and (buffer-live-p (get-buffer (concat "CAPTURE-" (buffer-name))))
                     (string-suffix-p (buffer-name) org-default-notes-file t))))))

可以给pr发个补丁,默认增加对org的支持

好的,我晚上再测试下各种情况。没问题的话,再去提个 PR

1 个赞
(add-hook 'org-capture-mode-hook #'(lambda nil (setq auto-save-delete-trailing-whitespace nil)))
(add-hook 'org-capture-after-finalize-hook #'(lambda nil (setq auto-save-delete-trailing-whitespace t)))

我这样使用完全ok。不知道你们的为什么不行?