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.