auto-complete editorconfig auto-save 配合使用时,在文件末尾处出现问题

我一直在用 @manateelazycat 写的自动保存脚本。目前的版本是从 emacswiki 上复制下来的。 https://www.emacswiki.org/emacs/auto-save.el

非常爽,但是有一个问题,就是如果在文件的末尾有自动补全的提示框展开,这个时候好像是会临时增加几行空白行(参见动图中行号的变化),自动补全的提示其实是显示在这些空白行上的(是这样么?我猜的),如果这个时候触发了自动保存,那么这些空白行就会消失,然后导致错乱。

如果这个时候重新调整 emacs 的窗口大小,就正常显示了。

临时解决方案是把自动保存的触发时间调的长一点。。。但是这样好不爽啊,习惯了自动保存之后总是会忘记保存。 不知有没有什么更好的解决方案?


更新
感谢 @manateelazycat @casouri 提供的思路 尝试使用了 company-box/company-childframe 还是不行,排查之后,发现问题不在于自动保存!(错怪 manateelazycat 了 :joy:
原因在于我用了 editorconfig 配置!设置了自动删除末尾空行!

所以现在在想怎么和 editorconfig 配合一下。。。


更新
之前一直以为是 company 的锅,结果是 auto-complete 的问题。。。(怪不得开了 company-childframe 还是不行)(错怪了无数人啊23333) 所以全局都开 company-mode 就 ok 了。

Jietu20180706-172043-HD

不知道修改auto-rever-buffer有没有效果?

实在不行用company-box/company-childframe补全吧。

1 个赞

我自己对 auto-save.el 的配置是这样弄得:

(require 'auto-save)

;;; Code:

(auto-save-enable)
(setq auto-save-slient t)

(defun delete-trailing-whitespace-except-current-line ()
  (interactive)
  (let ((begin (line-beginning-position))
        (end (line-end-position)))
    (save-excursion
      (when (< (point-min) begin)
        (save-restriction
          (narrow-to-region (point-min) (1- begin))
          (delete-trailing-whitespace)))
      (when (> (point-max) end)
        (save-restriction
          (narrow-to-region (1+ end) (point-max))
          (delete-trailing-whitespace))))))

(add-hook 'before-save-hook 'delete-trailing-whitespace-except-current-line) ;cleanup white before save file.

文件保存的时候自动删除所有不用的空行, 但是当前行除外, 避免正在写代码把的时候, 龟儿子 delete-trailing-whitespace 把我当前行的缩进也给删除了.

1 个赞

我想的是检测光标在末尾就不自动保存,但是估计 company 添加的那些空行,这时候检测当前光标应该不在末尾。这样应该行不通。
更好的方案应该是检测 company 提示是否展开,展开就不自动保存,但是我找不到得到 company 是否展开的办法。
还有个思路就是在某个时机重绘一下界面,因为调整一下窗口大小就会正常了。但是在什么时机,用什么办法重绘不会太浪费性能呢。。。

难道这三个东西真的不能完美配合了吗。。。 求大神帮忙。。 :sob:

我发布了新版本: https://www.emacswiki.org/emacs/auto-save.el

参考的配置文件: https://www.emacswiki.org/emacs/init-auto-save.el

1 个赞

你像我这样, 让 company 用 posframe 来渲染, 补全会自动在弹出的 frame 里面显示, 就不会污染你当前的 buffer 了:

https://www.emacswiki.org/emacs/init-company-mode.el

(require 'company-posframe)
(company-posframe-mode 1)
(push '(company-posframe-mode . nil)
      desktop-minor-mode-table)
2 个赞

谢谢!刚才尝试了 company-posframe-mode 但是不管用,估计是我没配置对。待我再试试!

新版本增加了自动删除多余空格的功能,但是这好像不属于自动保存的范畴。我觉得这个功能单独拿出来放在外面比较好,毕竟有可能其他人已经在别的地方增加了类似的功能。

只是一个选项, 默认不会开, 喜欢的自己开.

是我傻了。。我同时开启了 auto-complete 和 company。只用 company 就没问题了(即使不使用 posframe 也没问题)。
新问题是 Mac 下的 company-quickhelp 不怎么好用。 emacsmacport 直接无法使用 company-quickhelp (参见 https://github.com/company-mode/company-mode/issues/733 )还是 Linux 好啊啥都有 :sob: 。公司给配的 Mac 所以不太想折腾。以后自己再买个本子一定装 Linux。


现在解决方案是停用 auto-complete 转用 company + company-posframe (虽然目前不兼容 company-quickhelp)