簡體   English   中英

修復自動完成模式和linum模式煩惱

[英]fix an auto-complete-mode and linum-mode annoyance

我正在使用auto-complete-mode ,我認為這非常棒。 我也是linum-mode忠實粉絲,但是當兩者一起使用時,我有一個非常惱人的問題,特別是當我在一個新的緩沖區(或一個很少行的緩沖區)工作時。

基本上緩沖區是'x'行很長但是當自動完成時它會向緩沖區“添加”行,因此linum-mode保持切換,例如,在一列或兩列上顯示行號,具體取決於是否auto-complete表示完成與否。

因此,您鍵入一個句子,您會看到緩沖區的內容在每次按鍵時都會從左向右瘋狂地移動。 真的很煩人。

我認為解決方案涉及配置linum格式變量,但我不知道如何。

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

  • 動態
  • 右對齊
  • 考慮到緩沖區的'y'行比緩沖區實際有的多

我的理由是, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM