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

不习惯自动保存,但C-x C-s确实很累,我也不用,我的是shift-s,后来发现在某些情况下,S按得太多,也有那么点累,然后我就针对某些情况单独处理,把保存的行为用输入空格事件来触发,虽然还是手动按保存,但没有再按累的情况

;;在每次输入空格时都触发保存按钮,先插入空格在保存,与正常输入空格不冲突
(defun my-insert-spc()
  (interactive)
  (progn
    (insert-char 32)
    (save-buffer)
    ))
3 个赞

还有这样玩的 :+1:
如果按连续快速按几个空格会不会有卡顿啊?
我用自动保存的另外一个原因是Emacs和外部的编辑器同时编辑同一个文件的时候,我只要切换窗口马上就可以编辑。

好点子。

我的办法是窗口失去焦点就保存。用起来也挺舒服。

连接按空格时没有卡顿,不过比起正常连续输入空格的操作是要慢那么一点

如果使用evil的话,也可以在其他state回到normal state时自动保存

请问下通过auto-save.el 开了自动删除尾行空格后,为什么在org-capture mode 会自动删除星号后面的空格,但是在org-mode 却不会? 如下图中,在NEXT后面打一个空格,很快就会被删掉。

自动保存不能和保存时删除空格、保存时自动缩进这种一起开吧?不然写到一半顿了一下就被删掉了空格/改了缩进,不是很抓狂

auto-save.el 可以做到不删除当前行的空格,不影响indent。但是在org-capture-mode 不知道什么不行。

我也有这个问题。我的解决方法是在这个buffer时,把auto-save禁用了。反正你需要用C-c C-c完成。

为啥不用默认自动保存?没有任何这种问题⋯⋯

1 个赞

:+1: 现在用 super-save + ws-butlersuper-save 开启 1 s 空闲自动保存。
解决了一些以前遇到的问题:

  1. 不会在 markdown-mode 启动清除尾行空格
  2. 只有改动的行清除空格,这样不会产生额外的 diff
  3. 不会影响 undo-tree
  4. 不会影响 org-capture
3 个赞

我目前的解决方案是

  1. 在org-capture关掉auto-save:
(add-hook 'org-capture-prepare-finalize-hook 'auto-save-disable)
(add-hook 'org-capture-after-finalize-hook 'auto-save-enable)
  1. 给删除当前行空格加advice:
  (advice-add
   'auto-save-delete-trailing-whitespace-except-current-line
   :around
   (lambda (fn) (interactive) (unless (org-capture-mode) fn)))
  1. 还尝试了在auto-save-disable-predicates加入org-capture buffer的判断,但这个尝试失败了。
 (setq auto-save-disable-predicates
        '((lambda () (string-suffix-p
                      "gpg" (file-name-extension (buffer-name)) t))
          ;;  FIXME 2022-01-15: not working below:
          ;; (lambda () (string-match-p
          ;;             (regexp-quote "CAPTURE-") (buffer-name)))
          ))

目前我用 super-save 没这个问题,体验和 auto-save 差不多。设置 1秒保存。

前段时间一直在用你提到的 super-save + ws-butler 方案, 但它只保存当前 buffer,以及 (setq super-save-exclude '(".gpg")) 不起作用,还没排查出什么原因,暂时回到auto-save了。 :rofl:

我这边 (setq super-save-exclude '(".gpg")) 正常。

本来想用回 auto-save 的,结果我关闭了自动删除尾行空格,在 org-capture 时还是会自动删空格。实在没办法,就放弃了 :grinning_face_with_smiling_eyes:

(setq auto-save-delete-trailing-whitespace nil)

请问下你用什么命令会编辑非当前buffer?

org-agenda-mode 下切换 TODO 状态时,相关 buffer 就变成了编辑状态,要手动切过去,才会保存。

我前边提到的第一/二个方案对我有用,你试试看有没有用。不过你目前方案用习惯了也没必要切回来了。 :grin:

多谢分享,目前暂时没遇到这种情况。agenda 用的也少了 :grinning_face_with_smiling_eyes: ,以后遇到问题再考虑

我是通过在 insert 转回 normal 模式时设置 hook ,进行自动保存。


;;; Hook
(add-hook 'sniem-insert-to-normal-hook
          (lambda ()
            (run-with-timer
             6 nil (lambda ()
                     (when (and (buffer-modified-p)
                                sniem-normal-mode)
                       (save-buffer))))))

用 timer 判断,若 6s 后依然是 normal 模式,就保存。避免打断补全和编辑。

你这个timer在什么时候会cancel呢?

这个是我今天才写的,一小时发现了些问题,对其有了些优化。

;;; Hook
(defvar spring/sniem-auto-save-blacklist '("COMMIT_EDITMSG")
  "The blacklist of buffers to auto save.")
(add-hook 'sniem-insert-to-normal-hook
          (lambda ()
            (run-with-timer
             6 nil
             (lambda (current-buf)
               (when (get-buffer current-buf)
                 (with-current-buffer current-buf
                   (when (and (not (derived-mode-p 'special-mode))
                              (not (memq current-buf
                                         spring/sniem-auto-save-blacklist))
                              (buffer-modified-p)
                              sniem-normal-mode)
                     (save-buffer)))))
             (buffer-name))))

这个 timer 没有设置 repeat

1 个赞