9

我正在使用auto-complete-mode我认为非常棒的。我也是它的忠实粉丝,linum-mode但是当两者一起使用时,我遇到了一个非常恼人的问题,尤其是当我在一个新缓冲区(或一个只有很少行的缓冲区)中工作时。

基本上缓冲区是“x”行长,但是当自动完成启动时,它会将行“添加”到缓冲区中,因此linum-mode会不断切换,例如,在一列或两列上显示行号之间,这取决于是否auto-complete建议完成或不。

因此,您键入一个句子,您会看到缓冲区的内容在每次按键时都从左到右疯狂地移动。这真的很烦人。

我认为解决方案涉及配置linum-format变量,但我不知道如何。

理想情况下,如果我的 linum 格式是:

  • 动态的
  • 右对齐
  • 考虑到缓冲区的行数比缓冲区实际的行数多

我的理由是,auto-complete建议的建议不超过“y”建议,因此,两者将开始很好地配合。

例如,如果 'y' 设置为 20 并且我的缓冲区有 75 行,那么 linum 应该使用两列:因为无论我在哪里auto-complete,都不应使缓冲区“大于”99 行。

相反,如果 'y' 仍然设置为 20 并且我的缓冲区有 95 行,那么linum应该使用三列,因为否则如果我接近缓冲区的末尾并且auto-complete踢我的缓冲区将开始左右“摆动”当我打字的时候。

我宁愿不为linum.

我想使用“动态但总是至少两列”会以某种方式解决大多数烦恼,但我所描述的仍然会很棒。

PS:我意识到我的“修复”意味着 linum 将始终显示在至少两列上,我对此很好......只要它保持右对齐并使用 2、3 或 4 列,具体取决于需求。

4

4 回答 4

13

只需将以下行放入 .emacs 即可解决此问题。它在 auto-complete.el 中。

(ac-linum-workaround)
于 2013-05-18T03:53:32.750 回答
3

我已经写了几个关于修改 linum 模式输出的先前答案,您可能可以根据自己的目的进行调整。

编辑:这是该代码的最基本版本(也在EmacsWiki上,尽管有些隐藏),它根本不修改默认输出,但使用其他答案中的技术比默认代码更有效。这对您来说可能是一个更有用的起点。

(defvar my-linum-format-string "%4d")

(add-hook 'linum-before-numbering-hook 'my-linum-get-format-string)

(defun my-linum-get-format-string ()
  (let* ((width (length (number-to-string
                         (count-lines (point-min) (point-max)))))
         (format (concat "%" (number-to-string width) "d")))
    (setq my-linum-format-string format)))

(setq linum-format 'my-linum-format)

(defun my-linum-format (line-number)
  (propertize (format my-linum-format-string line-number) 'face 'linum))
于 2012-07-15T22:32:48.850 回答
2

只是有同样的问题,在看到“修补源”之后,我相信它可以用advice. 这是我想出的

(defadvice linum-update
  (around tung/suppress-linum-update-when-popup activate)
  (unless (ac-menu-live-p)
    ad-do-it))

我想popup-live-p按照前面提到的那样使用,但不幸的是它需要弹出窗口的变量,我们事先无法知道。

于 2012-09-14T13:44:17.480 回答
1

更新: 我最终修补了 linum.el 的源代码。我添加了一个在更新之前运行的额外钩子。

这是修补文件:linum.el (github)

这是我在 init.el 中的代码:

;; Load custom linum.
(load-file "~/.emacs.d/linum.el")

;; Suppress line number updates while auto-complete window
;; is displayed.
(add-hook 'linum-before-update-hook
          '(lambda ()
             (when auto-complete-mode
               (if (ac-menu-live-p)
                   (setq linum-suppress-updates t)
                 (setq linum-suppress-updates nil)))))

希望能帮助到你!

于 2012-09-01T04:05:08.910 回答