2012-05-14 36 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 )' –