如何用自定义背景色填充整个行号栏?


9

在下面的屏幕截图中,我仅将linum面部的背景设置为某种颜色,但是在缓冲区的末尾有一个空白区域,并且global-visual-line-mode启用换行()时,行与行之间存在间隙:

与线换行的残破的linum背景。

理想情况下,整个左侧应为统一的颜色。这可能吗?我了解一些Elisp,因此,如果可能的话,我可能会自己编写一些说明的修复程序。


切换主题时,我已经注意到了这一点。对于我来说,解决方法是返回默认主题,然后重新启用特定主题。通常会重置背景颜色。值得一看的是默认主题设置,以了解它是否对特定的面孔更加勤奋,这可能为如何编写函数进行修复提供了线索。
elarson

固定“中间”颜色可能是可行的(我会尝试一下)。令人遗憾的是,在缓冲区结束后固定颜色是没有的-没有什么可着色的。
马拉巴巴

实际上,我经常看到这个问题,这可能是一个有价值的功能要求。
马拉巴巴

@Malabarba为什么无法将其扩展到缓冲区下方的区域?边缘毕竟也这样做。
Lenar Hoyt 2014年

1
@mcb我现在了解您的意思了。边缘有自己的脸(背景延伸到屏幕底部),边缘没有(仅借用默认脸)。
马拉巴巴2014年

Answers:


6

问题

这里的问题是没有人可以控制边距的外观。您可以使用覆盖图在页边空白处显示文本(就是linum-mode这样),但是,就像Emacs中的任何文本一样,它被限制在缓冲区的范围内。因此,除了缓冲区的最后一行之外,您无法控制边距显示。

可以做的是修复中间的那些故障线。

放什么

该变量控制您要在两条逻辑线之间的可视线上显示的内容。重要的部分是'face 'linum,可确保这些线条与的外观一致linum-mode。该"-----"零件是说明性的,您可以将其更改为空格或任何您想要的形状。

(defvar endless/margin-display
  `((margin left-margin) ,(propertize "-----" 'face 'linum))
  "String used on the margin.")

怎么做

以下代码遍历缓冲区,并linum-mode在并非“真实”的每一行上放置叠加层(类似于使用的叠加层)。

(defvar-local endless/margin-overlays nil
  "List of overlays in current buffer.")

(defun endless/setup-margin-overlays ()
  "Put overlays on each line which is visually wrapped."
  (interactive)
  (let ((ww (- (window-width)
               (if (= 0 (or (cdr fringe-mode) 1)) 1 0)))
        ov)
    (mapc #'delete-overlay endless/margin-overlays)
    (save-excursion
      (goto-char (point-min))
      (while (null (eobp))
        ;; On each logical line
        (forward-line 1)
        (save-excursion
          (forward-char -1)
          ;; Check if it has multiple visual lines.
          (while (>= (current-column) ww)
            (endles/make-overlay-at (point))
            (forward-char (- ww))))))))

(defun endles/make-overlay-at (p)
  "Create a margin overlay at position P."
  (push (make-overlay p (1+ p)) endless/margin-overlays)
  (overlay-put
   (car endless/margin-overlays) 'before-string
   (propertize " "  'display endless/margin-display)))

而且我们希望它在linum-mode更新行号时运行。

(add-hook 'linum-before-numbering-hook #'endless/setup-margin-overlays)

我刚刚测试了它org-mode,它似乎在滚动过程中引入了一些滞后,并且在没有启用自适应环绕的情况下没有明显的原因错过了间隙。屏幕截图。
Lenar Hoyt 2014年

@mcb是的,这里的性能是一个问题,但是要改善性能将是一个漫长而复杂的事情。至于org-mode问题,org大量使用了覆盖图,因此有冲突是合理的。我不知道有什么方法可以修复它,但我会考虑一下。
马拉巴巴

-1

您可以将其放在您的配置中:

(set-face-background 'fringe "#f4a460")

...显然将颜色代码更改为所需的颜色代码。


2
这将改变条纹的颜色,条纹上不显示行号。(尝试一下,您会发现区别)
马拉巴巴2014年

1
在问题的屏幕快照中也可以看到它:“行号列”的背景颜色与缓冲区相同,而边缘是行号列和缓冲区之间的小区域,为灰色。
T. Verron 2014年

你是对的。我怀疑您必须在linum-before-numbering-hook的functon中引入一个新的叠加层,并给它一个可以设置的外观。
tealeg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.