[英]fix an auto-complete-mode and linum-mode annoyance
我正在使用auto-complete-mode
,我認為這非常棒。 我也是linum-mode
忠實粉絲,但是當兩者一起使用時,我有一個非常惱人的問題,特別是當我在一個新的緩沖區(或一個很少行的緩沖區)工作時。
基本上緩沖區是'x'行很長但是當自動完成時它會向緩沖區“添加”行,因此linum-mode
保持切換,例如,在一列或兩列上顯示行號,具體取決於是否auto-complete
表示完成與否。
因此,您鍵入一個句子,您會看到緩沖區的內容在每次按鍵時都會從左向右瘋狂地移動。 這真的很煩人。
我認為解決方案涉及配置linum格式變量,但我不知道如何。
理想情況下,如果我的linum格式是:
我的理由是, auto-complete
不應該提出超過'y'的建議,因此,兩者應該開始很好地一起玩。
例如,如果'y'設置為20而我的緩沖區有75行,那么linum應該使用兩列:因為無論我在哪里auto-complete
都不會使緩沖區“大於”99行。
相反,如果'y'仍然設置為20並且我的緩沖區有95行,那么linum
應該使用三列,否則如果我接近緩沖區的末尾並且我的緩沖區中的auto-complete
踢將開始“搖擺“當我輸入時左右。
對於linum
我寧願不用硬編碼“3列寬”。
我想使用“動態但總是至少兩列”會以某種方式解決大多數煩惱,但仍然像我描述的那樣會很棒。
PS:我意識到我的'修復'意味着linum總是會顯示在至少兩列上,我很好...只要它保持右對齊並使用2,3或4列,具體取決於需要。
只需將以下行放在.emacs中即可解決此問題。 它在auto-complete.el中。
(ac-linum-workaround)
我已經寫了幾個關於修改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))
在看到“修補源代碼”之后遇到同樣的問題我相信可以通過advice
完成。 這是我想出來的
(defadvice linum-update
(around tung/suppress-linum-update-when-popup activate)
(unless (ac-menu-live-p)
ad-do-it))
我想使用popup-live-p
,但不幸的是它需要彈出窗口的變量,我們事先無法知道。
更新:我最終修補了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)))))
希望能幫助到你!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.