¿Cómo puedo llenar toda la barra de números de línea con un color de fondo personalizado?

9

En la captura de pantalla a continuación, simplemente configuré el fondo de la linumcara en algún color, sin embargo, hay una región en blanco al final del búfer y hay espacios entre las líneas cuando global-visual-line-modese habilita el ajuste de línea ( ):

Fondo de linum roto con línea de envoltura.

Idealmente, todo el lado izquierdo debe estar en un color uniforme. es posible? Conozco algo de Elisp, así que si es posible, tal vez podría escribir una solución con algunas instrucciones.

Lenar Hoyt
fuente
Me di cuenta de esto al cambiar de tema. La solución para mí ha sido volver al tema predeterminado y luego volver a habilitar el tema específico. Eso generalmente restablece los colores de fondo. Puede valer la pena echar un vistazo a la configuración predeterminada del tema para ver si es más diligente con caras específicas que podrían dar una pista sobre cómo escribir una función para solucionarlo.
Elarson
Arreglar el color "intermedio" podría ser viable (lo intentaré). Lamentar el color después del final del búfer es, lamentablemente, no --- no hay nada para colorear.
Malabarba
De hecho, he visto esta pregunta tan a menudo que probablemente sea una solicitud de función que valga la pena.
Malabarba
@Malabarba ¿Por qué no es posible extenderlo al área debajo del búfer? La franja también hace esto después de todo.
Lenar Hoyt
1
@mcb Entiendo un poco mejor lo que quisiste decir ahora. La franja tiene su propia cara (cuyo fondo se extiende hasta la parte inferior de la pantalla), el margen no (solo toma prestada la cara predeterminada).
Malabarba

Respuestas:

6

El problema

El problema aquí es que no hay cara para controlar la apariencia de los márgenes. Puede mostrar texto en el margen usando superposiciones (eso es lo que linum-modehace) pero, como cualquier texto en Emacs, está limitado a los límites del búfer. Por lo tanto, no puede tener ningún control sobre la visualización del margen más allá de la última línea del búfer.

Lo que puedes hacer es arreglar esas líneas defectuosas en el medio.

Qué poner allí

Esta variable controla lo que desea mostrar en esas líneas visuales "entre" dos líneas lógicas. La parte importante es la 'face 'linum, que garantiza que estas líneas seguirán la apariencia de linum-mode. La "-----"parte es demostrativa, puede cambiarla a espacios o lo que desee.

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

Cómo hacerlo

El siguiente código pasa por el búfer y coloca superposiciones (similares a las que linum-modeusa) en cada línea que no es "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)))

Y queremos que se ejecute siempre que linum-modeactualice los números de línea.

(add-hook 'linum-before-numbering-hook #'endless/setup-margin-overlays)
Malabarba
fuente
Lo acabo de probar org-modey parece presentar cierto retraso durante el desplazamiento y no deja espacios sin ninguna razón obvia con el ajuste adaptativo activado. Captura de pantalla.
Lenar Hoyt
@mcb Sí, el rendimiento es un problema aquí, pero mejorar eso sería un asunto largo y complicado. En cuanto al problema del modo org, org hace un uso intensivo de las superposiciones, por lo que tiene sentido que haya conflicto. No conozco ninguna forma de solucionarlo, pero lo pensaré un poco.
Malabarba
-1

Podrías poner esto en tu configuración:

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

... obviamente, cambie el código de color al que desee.

Tealeg
fuente
2
Esto cambiará el color de la franja, los números de línea no se muestran en la franja. (pruébalo y verás la diferencia)
Malabarba
1
También es visible en la captura de pantalla en la pregunta: la "columna de números de línea" tiene el mismo color de fondo que el búfer, mientras que la franja es el área pequeña entre la columna de números de línea y el búfer, en gris.
T. Verron
Sí tienes razón. Sospecho que tendrías que introducir una nueva superposición en una función de ejecución en el gancho de linum-before-numbering y darle una cara que puedas configurar.
Tealeg