修复自动完成模式和linum模式烦恼

时间:2012-07-14 13:39:19

标签: emacs autocomplete

我正在使用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列。

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

希望它有所帮助!