Como preencher a barra de número de linha inteira com uma cor de plano de fundo personalizada?

9

Na captura de tela abaixo, eu simplesmente defini o plano de fundo da linumface com alguma cor, no entanto, há uma região em branco no final do buffer e existem lacunas entre as linhas quando a quebra de linha ( global-visual-line-mode) está ativada:

Linum quebrado fundo com quebra de linha.

Idealmente, todo o lado esquerdo deve ter uma cor uniforme. Isso é possível? Conheço alguns Elisp, então, se for possível, talvez eu possa escrever uma correção com algumas instruções.

Lenar Hoyt
fonte
Percebi isso ao mudar de tema. A solução para mim foi voltar ao tema padrão e reativar o tema específico. Isso geralmente redefine as cores do plano de fundo. Pode valer a pena dar uma olhada nas configurações de tema padrão para ver se é mais diligente com faces específicas que podem dar uma pista de como escrever uma função para corrigi-la.
Elarson
A correção da cor "intermediária" pode ser viável (vou tentar). A correção da cor após o término do buffer é, lamentavelmente, não --- não há nada para ser colorido.
Malabarba
Na verdade, eu já vi isso perguntado tantas vezes que provavelmente é uma solicitação de recurso que vale a pena.
Malabarba
@ Malabarba Por que não é possível estendê-lo para a área abaixo do buffer? Afinal, a franja também faz isso.
Lenar Hoyt
11
@ MCB eu entendo um pouco melhor o que você quis dizer agora. A franja tem sua própria face (cujo fundo é estendido para a parte inferior da tela), a margem não (apenas empresta a face padrão).
Malabarba 8/10

Respostas:

6

O problema

O problema aqui é que não há rosto para controlar a aparência das margens. Você pode exibir texto na margem usando sobreposições (é o que linum-modefaz), mas, como qualquer texto no Emacs, ele é restrito aos limites do buffer. Portanto, você não pode ter nenhum controle sobre a exibição da margem além da última linha do buffer.

O que você pode fazer é corrigir essas linhas defeituosas no meio.

O que colocar lá

Essa variável controla o que você deseja exibir nessas linhas visuais "entre" duas linhas lógicas. A parte importante é a 'face 'linum, que garante que essas linhas sigam a aparência de linum-mode. A "-----"peça é demonstrativa, você pode alterá-la para espaços ou o que quiser.

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

Como fazer isso

O código a seguir passa pelo buffer e coloca sobreposições (semelhantes às linum-modeusadas) em cada linha que não é "real".

(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)))

E queremos que ele seja executado sempre que linum-modeatualizar os números das linhas.

(add-hook 'linum-before-numbering-hook #'endless/setup-margin-overlays)
Malabarba
fonte
Acabei de testá-lo org-modee parece apresentar algum atraso durante a rolagem e perde lacunas sem motivo óbvio com o empacotamento adaptável ativado. Captura de tela.
Lenar Hoyt
@ MCB Sim, o desempenho é um problema aqui, mas melhorar isso seria um assunto longo e complicado. Quanto ao problema do modo organizacional, a organização faz uso pesado de superposições, portanto, faz sentido que haja conflito. Não conheço nenhuma maneira de corrigi-lo, mas vou pensar um pouco.
Malabarba
-1

Você pode colocar isso em sua configuração:

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

... obviamente altere o código de cores para o desejado.

tealeg
fonte
2
Isso mudará a cor da franja, os números das linhas não serão exibidos na franja. (experimentá-lo e você vai ver a diferença)
Malabarba
11
Também é visível na captura de tela da pergunta: a "coluna de números de linha" tem a mesma cor de fundo do buffer, enquanto a margem é a pequena área entre a coluna de números de linha e o buffer, em cinza.
T. Verron
Sim, você está certo. Eu suspeito que você teria que introduzir uma nova sobreposição em um functon executado no gancho linum-before-numbering e dar uma cara que você pode definir.
tealeg