2012-05-14 77 views
3

我正在使用global-linum-mode行號。如果當前行的行號用不同的顏色(和/或不同的背景)突出顯示,那將會很好。任何人都有一個想法如何實現這一目標?着色當前行號

謝謝!

回答

8

我從我之前回答的Relative Line Numbers In Emacs得出了這個答案,因爲它處理的是在linum格式化過程中記住當前行號的相同問題。

我從linum臉上繼承,但使用hl-line的背景色。如果前景和背景不匹配很好,你可以用
的Mxcustomize-faceRETmy-linum-hlRET

(require 'hl-line) 

(defface my-linum-hl 
    `((t :inherit linum :background ,(face-background 'hl-line nil t))) 
    "Face for the current line number." 
    :group 'linum) 

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

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

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

(defvar my-linum-current-line-number 0) 

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

(defun my-linum-format (line-number) 
    (propertize (format my-linum-format-string line-number) 'face 
       (if (eq line-number my-linum-current-line-number) 
        'my-linum-hl 
       'linum))) 

(defadvice linum-update (around my-linum-update) 
    (let ((my-linum-current-line-number (line-number-at-pos))) 
    ad-do-it)) 
(ad-activate 'linum-update) 

與其他答案明確分配前景色,這是更有效生成的動態寬度大於默認的dynamic格式,但您可以通過註釋行(add-hook linum-before-numbering-hook 'my-linum-get-format-string)(並可選修改初始值my-linum-format-string以設置您的首選寬度)來使用最大速度的靜態寬度。

+0

謝謝!優秀作品!順便說一句 - 這個想法是使用它*而不是* hl-line(或者用當前行的下劃線代替突出顯示)。 – user673592

+0

我認爲可能是這樣。原來,這可以在使用或不使用'hl-line'的情況下快樂地工作,但是如果你想避免加載'hl-line'庫,你可以刪除'(require'hl-line)'並且改變' ,(face-background'hl-line nil t)'爲硬編碼值。 – phils

+0

由於'linum'的實現細節,多個窗口中的相同緩衝區將共享當前行高亮。每個窗口中的點數保持正確,因此無論哪個窗口是最新的,都將具有正確的亮點。解決這個問題需要更改linum以及它如何在緩衝區局部變量中緩存/重用覆蓋。如果有人決定解決這個問題,你也可以擴展linum來追蹤當前行並將其傳遞給'linum-format' :) – toolbear

0

我不確定行號,但可以使用global-hl-line-mode突出顯示當前行。

5

它可以通過擴展hlinum來實現。

(require 'hlinum) 
(hlinum-activate) 

您可以更改linum-highlight-face來自定義背景和前景色。

+0

很好的工作,但記得首先顯示行號,例如用'(global-linum-mode 1 )' –