我正在编写一个次要模式,以便在使用nlinum-mode
(由@Stefan编写)时突出显示当前行号,当光标打开时,我将所有内容都工作除了 窗口顶部的第一行。
nlinum-mode
的代码可在此处找到:http://elpa.gnu.org/packages/nlinum.html
在弄清楚为什么不起作用的任何帮助下(例如,当光标在窗口顶部的第一行时)将非常感激。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; M-x hl-nlinum-mode
(defvar nlinum-highlight-current-line-number-string nil
"An overlay string used to highlight the current line number.")
(make-variable-buffer-local 'nlinum-highlight-current-line-number-string)
(defvar nlinum-highlight-p nil
"Set to non-`nil` when overlay is present, and `nil` when not present.")
(make-variable-buffer-local 'nlinum-highlight-p)
(defface ln-active-face
'((t (:foreground "black" :background "#eab700" :bold nil :italic nil
:underline nil :box nil :overline nil)))
"Face for `ln-active-face`."
:group 'linum)
(defface ln-inactive-face
'((t (:foreground "SteelBlue" :background "black" :bold t :italic nil
:underline nil :box nil :overline nil)))
"Face for `ln-active-face`."
:group 'linum)
(defun hl-nlinum-remove-overlay ()
(when nlinum-highlight-p
(remove-overlays (point-min) (point-max)
'before-string nlinum-highlight-current-line-number-string)
(setq nlinum-highlight-p nil)))
(defun nlinum-highlight-current-line-number ()
(when nlinum-mode
(hl-nlinum-remove-overlay)
(let* (
(pbol (point-at-bol))
(line (nlinum--line-number-at-pos))
(line-mod
(cond
((eq nlinum--width 2)
(cond
((< line 10)
(concat " " (format "%s" line)))
(t (format "%s" line))))
((eq nlinum--width 3)
(cond
((< line 10)
(concat " " (format "%s" line)))
((and
(> line 9)
(< line 100))
(concat " " (format "%s" line)))
(t (format "%s" line))))
((eq nlinum--width 4)
(cond
((< line 10)
(concat " " (format "%s" line)))
((and
(> line 9)
(< line 100))
(concat " " (format "%s" line)))
((and
(> line 99)
(< line 1000))
(concat " " (format "%s" line)))
(t (format "%s" line))))
(t (format "%s" line))))
(str (propertize line-mod 'face 'ln-active-face) )
(final-line-number (propertize " " 'display `((margin left-margin) ,str))))
(setq nlinum-highlight-current-line-number-string final-line-number)
(overlay-put (make-overlay pbol pbol)
'before-string nlinum-highlight-current-line-number-string)
(setq nlinum-highlight-p t))))
(define-minor-mode hl-nlinum-mode
"A minor-mode for highlighting the current line number when nlinum-mode is active."
:init-value nil
:lighter " HL#"
:keymap nil
:global nil
:group 'linum
(cond
(hl-nlinum-mode
(when (not nlinum-mode)
(nlinum-mode 1))
(add-hook 'post-command-hook #'nlinum-highlight-current-line-number nil t))
(t
(remove-hook 'post-command-hook #'nlinum-highlight-current-line-number t)
(remove-overlays (point-min) (point-max)
'before-string nlinum-highlight-current-line-number-string))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
答案 0 :(得分:4)
您可以在配置中设置此项,在nlinum
包的1.7版中启用突出显示当前行号:
(setq nlinum-highlight-current-line t)
答案 1 :(得分:2)
问题可能在于您致电(hl-nlinum-remove-overlay)
。我不完全确定我理解代码的工作方式,但这是我的分析:您遇到的主要问题是您希望覆盖替换 nlinum&# 39; s,但是从post-command-hook
开始这样做总是不行,因为nlinum通过jit-lock添加了它的叠加层,这通常由redisplay运行,即在后命令之后 - 钩。
我认为您可以通过在jit-lock-fontify-now
中的当前行调用nlinum-highlight-current-line-number
来解决此问题。这是否会解决你的第一行错误&#34;,我不确定,等等。
这就是说,我认为您的代码不应该尝试替换 nlinum的叠加层。相反它应该去修改 nlinum的叠加层。即:
jit-lock-fontify-now
hl-nlinum--last-overlay
中藏匿的)不同,则取消修改最后一个叠加层。如果ol
是nlinum当前行的叠加层,您应该可以使用以下内容对其进行修改:
(let* ((spc (overlay-get ol 'before-string))
(disp (get-text-property 0 'display spc))
(str (nth 1 disp)))
(put-text-property 0 (length str) 'face 'foo str))