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

又测试了一下,这两个都是在buffer内容比较多的时候才会发生,下面的gif分别录制于web-mode和emacs-lisp-mode,都是一百多行这样,而我新建了两个文件,在它们为空或者有二三十行内容的时候,不会有这两个问题。

company active时选择next在由第二行跳到第三行时变成了next-line(注意左下角的已保存标志):company

yas在保存后一个field的占位单词不会被覆盖(注意左下角的已保存标志):yas


我的防御方法就是上面说的

(when (and (not yas--active-snippets) (not company-candidates))
  ...)

我的意思, 你把下面代码的上下文都粘贴一下, 我看看能否写一个补丁, 让 auto-save.el 天生避免这种问题.

(when (and (not yas--active-snippets) (not company-candidates))
  ...)

谢谢

(run-with-idle-timer 1 t #'jester/save-all-buffers) 会有bug的代码:

(defun jester/save-all-buffers ()
  "Save all buffers."
  ;; 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))))))

修复后的代码:

(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))
    ;; 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)))))))

我推送了一个补丁: https://github.com/manateelazycat/auto-save/commit/99e2dcbe4cbc43ae46db7ceb1d07157148264b6f

可以帮我验证一下是否修正了你的问题了吗?

我的版本是针对每个 buffer 验证的, 如果当前 buffer 的 yas/company 激活的时候, 后台的 buffer 依然可以自动保存.

ok了。

是的

Reference:Emacs 中的 minibuffer 如何实现类似Google实时补全的效果? - #31,来自 cireu

可能这样好一点

(if auto-save-silent
                (with-temp-message ""
                  (let ((inhibit-message t))
                    (basic-save-buffer)))
              (basic-save-buffer))

eldoc

%E6%B7%B1%E5%BA%A6%E5%BD%95%E5%B1%8F_emacs_20191016113952

helm/ivy

%E6%B7%B1%E5%BA%A6%E5%BD%95%E5%B1%8F_emacs_20191016114047

Cc: @JJPandari

最近在用懒猫大神的auto-save,发现一个问题,就是在使用脚本语言pyhton的时候,每次自动保存,光标都会调到第一行起始位置

你的版本太老了,更新一下吧,没这个问题

好的,先试试

还是不行哦,我换成最新版本了,但是任然有问题:joy:

换成最新2月2日,更新的版本还是不行.

应该是你在 write-file-hook 里面加了 yapf 或 autopep8 之类的自动格式化工具, 因此每次保存都会格式化,导致光标跑了。去掉就好了,和 auto-save 无关。

3 个赞

还真是yapf惹的祸,谢谢了

请问一下使用auto-save进行自动保存的时候,即使开了silent模式,还是会在minibuffer中不断出现提示信息。有什么办法彻底让auto-save安静呢?

Omitting...
Omitted 2 lines.
Omitting...

已解决:这个跟自动保存没有关系,是dired-x的锅。

(setq dired-omit-verbose nil)
(setq auto-revert-verbose nil)

这样就不会提示了。

1 个赞

歪个楼,在任何编辑工具中都会关闭自动保存。感觉自己不按C-xC-s心里总是没底(我把系统的C-s也绑定了C-xC-s)。

能告诉我你们为什么这么喜欢自动保存么?我怎么get不到它的一点好处?靠自己手点不香么?手动保存完全不会打断思路,就是下意识的动作

modeline背景颜色提示当前文件状态(已保存或已修改),

;; {{ change mode-line color by evil state
(defconst my-default-color (cons (face-background 'mode-line)
                                 (face-foreground 'mode-line)))
(defun my-show-evil-state ()
  "Change mode line color to notify user evil current state."
  (let* ((color (cond ((minibufferp) my-default-color)
                      ((evil-insert-state-p) '("#e80000" . "#ffffff"))
                      ((evil-emacs-state-p)  '("#444488" . "#ffffff"))
                      ((buffer-modified-p)   '("#006fa0" . "#ffffff"))
                      (t my-default-color))))
    (set-face-background 'mode-line (car color))
    (set-face-foreground 'mode-line (cdr color))))
(add-hook 'post-command-hook #'my-show-evil-state)
;; }}

在追求极致编程速度的同时,也可以用工具解决人需要可视地确认文件状态的问题。

7 个赞

手动保存按的手累啊,用了自动保存以后,从来就没关心过保存的事情。写完直接关,写错直接undo。C-x,C-s的按键我都取消了。 :joy:
这个你要亲自试试看,就能get到了。

1 个赞

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

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

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

好点子。

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

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