我正在使用auto-complete-mode
,我认为这非常棒。我也是linum-mode
的忠实粉丝,但是当两者一起使用时,我遇到了一个非常恼人的问题,特别是当我在一个新缓冲区(或一个只有很少行的缓冲区)中工作时。 / p>
基本上缓冲区的长度为'x'行但是当自动完成时它会向缓冲区“添加”行,因此linum-mode
会保持切换,例如,在一列或两列上显示行号,取决于auto-complete
是否暗示完成。
因此,您键入一个句子,您会看到缓冲区的内容在每次按键时都会从左向右疯狂地移动。 真的很烦人。
我认为解决方案涉及配置 linum-format 变量,但我不知道如何。
理想情况下,如果我的linum格式是:
我的理由是auto-complete
不会提出超过'y'的建议,因此,两人将开始很好地一起玩。
例如,如果'y'设置为20而我的缓冲区有75行,那么linum应该使用两列:因为无论我在哪里auto-complete
都不会使缓冲区“大于”99行
相反,如果'y'仍然设置为20而我的缓冲区有95行,那么linum
应该使用三列,否则如果我接近缓冲区的末尾并且{{1}当我输入时,我的缓冲区中的踢开始左右开始“摇摆”。
我宁愿不为auto-complete
硬编码“3列宽”。
我想使用“动态但总是至少有两列”会以某种方式解决大多数烦恼,但仍然像我描述的那样很棒。
PS:我意识到我的“修复”意味着linum总是会显示在至少两列上,我很好......只要它保持右对齐并使用2,根据需要提供3或4列。
答案 0 :(得分:13)
只需将以下行放在.emacs中即可解决此问题。它在auto-complete.el。
(ac-linum-workaround)
答案 1 :(得分:3)
我已经写过几个关于修改linum-mode输出的答案,你可以根据自己的目的调整它。
编辑:这是该代码的最基本版本(也在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))
答案 2 :(得分:2)
在看到“修补源代码”之后遇到同样的问题我相信可以使用advice
完成。这就是我提出的问题
(defadvice linum-update
(around tung/suppress-linum-update-when-popup activate)
(unless (ac-menu-live-p)
ad-do-it))
我想使用popup-live-p
,但不幸的是它需要弹出窗口的变量,我们事先无法知道。
答案 3 :(得分: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)))))
希望它有所帮助!