Come posso riempire l'intera barra del numero di riga con un colore di sfondo personalizzato?


9

Nello screenshot seguente ho semplicemente impostato lo sfondo della linumfaccia su un colore, tuttavia c'è una regione vuota alla fine del buffer e ci sono degli spazi tra le linee quando global-visual-line-modeè abilitato il wrapping ( ):

Sfondo di linum rotto con avvolgimento di linea.

Idealmente, l'intero lato sinistro dovrebbe essere di colore uniforme. È possibile? Conosco un po 'di Elisp, quindi se è possibile, potrei forse scrivere una correzione con alcune istruzioni.


Ho notato questo quando si cambia tema. Il problema per me è stato di tornare al tema predefinito e quindi riattivare il tema specifico. Questo di solito ripristina i colori di sfondo. Potrebbe essere utile dare un'occhiata alle impostazioni predefinite del tema per vedere se è più diligente con facce specifiche che potrebbero dare un indizio su come scrivere una funzione per risolverlo.
elarson,

Correggere il colore "nel mezzo" potrebbe essere praticabile (ci proverò). Purtroppo, riparare il colore dopo la fine del buffer non è --- non c'è niente da colorare.
Malabarba,

In effetti, ho visto questo chiedere in giro così spesso che probabilmente è una richiesta di funzionalità utile.
Malabarba,

@Malabarba Perché non è possibile estenderlo nell'area sotto il buffer? La frangia lo fa anche dopo tutto.
Lenar Hoyt,

1
@mcb Capisco un po 'meglio cosa intendevi ora. La frangia ha una sua faccia (il cui sfondo è esteso nella parte inferiore dello schermo), il margine no (prende semplicemente in prestito la faccia predefinita).
Malabarba,

Risposte:


6

Il problema

Il problema qui è che non c'è volto per controllare l'aspetto dei margini. Puoi visualizzare il testo a margine usando gli overlay (questo è quello che linum-modefa) ma, come qualsiasi testo in Emacs, è vincolato ai limiti del buffer. Quindi non puoi avere alcun controllo sulla visualizzazione dei margini oltre l'ultima riga del buffer.

Quello che puoi fare è correggere quelle linee difettose nel mezzo.

Cosa mettere lì

Questa variabile controlla ciò che si desidera visualizzare su quelle linee visive "tra" due linee logiche. La parte importante è la 'face 'linum, che assicura che queste linee seguano l'aspetto di linum-mode. La "-----"parte è dimostrativa, puoi cambiarla in spazi o come desideri.

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

Come farlo

Il codice seguente passa attraverso il buffer e posiziona le sovrapposizioni (simili a quelle linum-modeutilizzate) su ogni riga che non è "reale".

(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 vogliamo che venga eseguito ogni volta che linum-modeaggiorna i numeri di riga.

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

L'ho appena testato org-modee sembra introdurre un po 'di ritardo durante lo scorrimento e manca spazi vuoti senza una ragione ovvia con la funzione di adattamento attivata. Immagine dello schermo.
Lenar Hoyt,

@mcb Sì, le prestazioni sono un problema qui, ma migliorarlo sarebbe una questione lunga e complicata. Per quanto riguarda il problema della modalità org, org fa un uso pesante delle sovrapposizioni, quindi ha senso che ci sarebbero conflitti. Non sono a conoscenza di alcun modo per risolverlo, ma ci penserò su.
Malabarba,

-1

Potresti metterlo nella tua configurazione:

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

... ovviamente cambia il codice colore in quello che desideri.


2
Questo cambierà il colore della frangia, i numeri di riga non vengono visualizzati sulla frangia. (provalo e vedrai la differenza)
Malabarba

1
È anche visibile sullo screenshot nella domanda: la "colonna dei numeri di riga" ha lo stesso colore di sfondo del buffer, mentre la frangia è la piccola area tra la colonna dei numeri di riga e il buffer, in grigio.
T. Verron,

Sì hai ragione. Ho il sospetto che dovresti introdurre un nuovo overlay in una sequenza funzionale al gancio linum-prima-numerazione e dargli una faccia che puoi impostare.
tealeg
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.