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

仿照我的代码,让auto-save跳过有yas展开的buffer吧

改了,加了个:

;; yas overlay and company-select-next has problem with this.
(when (and (not yas--active-snippets) (not company-candidates))
  ...)

没把predicate抽出来,也没防御yas和company这两个变量不存在的问题,我是自己用这个函数而且无论怎么配这两个包一定会用。

可以写成(unless (or )),短一点。

1 个赞

我的大脑只能理解if not,理解不了unless。。。

3 个赞

company也有冲突?好像没感觉到啊,除了yas里C-g终止company总会打断snippet以外,没觉得自动保存有啥问题?

我是在company active的时候company-select-next,第一下正常,第二下就会跑到文件内容的下一行去(next-line)。


C-g的问题可以用这里的abort-company-or-yas,binding和函数分别如下:

(general-define-key
   :keymaps 'yas-keymap
   "C-g" 'abort-company-or-yas)
1 个赞

能否录个gif?我看看怎么打个补丁

帮我提交一个 PR 吧: GitHub - manateelazycat/auto-save: Automatically save files without temporary files to protect your finger. ;)

谢谢

又测试了一下,这两个都是在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惹的祸,谢谢了