Comment puis-je remplir toute la barre de numéro de ligne avec une couleur d'arrière-plan personnalisée?


9

Dans la capture d'écran ci-dessous, j'ai simplement défini l'arrière-plan du linumvisage sur une certaine couleur, mais il y a une région vide à la fin du tampon et il y a des espaces entre les lignes lorsque le retour à la ligne ( global-visual-line-mode) est activé:

Fond de linum cassé avec retour à la ligne.

Idéalement, tout le côté gauche devrait être d'une couleur uniforme. Est-ce possible? Je connais certains Elisp, donc si c'est possible, je pourrais peut-être écrire un correctif moi-même avec quelques instructions.


Je l'ai remarqué lors du changement de thème. Pour moi, le travail a consisté à revenir au thème par défaut, puis à réactiver le thème spécifique. Cela réinitialise généralement les couleurs d'arrière-plan. Il pourrait être utile de jeter un coup d'œil aux paramètres de thème par défaut pour voir s'il est plus diligent avec des visages spécifiques qui pourraient donner un indice sur la façon d'écrire une fonction pour la corriger.
elarson

La fixation de la couleur "entre les deux" pourrait être viable (je vais essayer). La correction de la couleur après la fin du tampon n'est malheureusement pas --- il n'y a rien à colorier.
Malabarba

En fait, j'ai vu cette question si souvent que c'est probablement une demande de fonctionnalité intéressante.
Malabarba

@Malabarba Pourquoi n'est-il pas possible de l'étendre dans la zone sous le tampon? La frange le fait aussi après tout.
Lenar Hoyt

1
@mcb Je comprends un peu mieux ce que tu voulais dire maintenant. La frange a son propre visage (dont l'arrière-plan s'étend jusqu'au bas de l'écran), pas la marge (elle emprunte simplement le visage par défaut).
Malabarba

Réponses:


6

Le problème

Le problème ici est qu'il n'y a pas de visage pour contrôler l'apparence des marges. Vous pouvez afficher du texte dans la marge en utilisant des superpositions (c'est ce qui linum-modefait) mais, comme tout texte dans Emacs, il est limité aux limites du tampon. Vous ne pouvez donc pas avoir de contrôle sur l'affichage de la marge au-delà de la dernière ligne du tampon.

Ce que vous pouvez faire, c'est réparer ces lignes défectueuses entre les deux.

Que mettre là

Cette variable contrôle ce que vous souhaitez afficher sur ces lignes visuelles «entre» deux lignes logiques. La partie importante est la 'face 'linum, qui garantit que ces lignes suivront l'apparence de linum-mode. La "-----"partie est démonstrative, vous pouvez la changer en espaces ou tout ce que vous souhaitez.

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

Comment faire

Le code suivant passe par le tampon et place des superpositions (similaires à celles linum-modeutilisées) sur chaque ligne qui n'est pas «réelle».

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

Et nous voulons qu'il s'exécute chaque fois que linum-modeles numéros de ligne sont mis à jour.

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

Je viens de le tester org-modeet il semble introduire un certain retard lors du défilement et il manque des lacunes sans raison évidente avec le bouclage adaptatif activé. Capture d'écran.
Lenar Hoyt

@mcb Oui, les performances sont un problème ici, mais l'amélioration serait une question longue et compliquée. Quant au problème du mode org, org fait un usage intensif des superpositions, il est donc logique qu'il y ait un conflit. Je ne connais aucun moyen de le réparer, mais je vais y réfléchir.
Malabarba

-1

Vous pouvez mettre ceci dans votre configuration:

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

... changez évidemment le code de couleur en celui que vous voulez.


2
Cela changera la couleur de la frange, les numéros de ligne ne sont pas affichés sur la frange. (essayez-le et vous verrez la différence)
Malabarba

1
Il est également visible sur la capture d'écran de la question: la "colonne des numéros de ligne" est de la même couleur d'arrière-plan que le tampon, tandis que la frange est la petite zone entre la colonne des numéros de ligne et le tampon, en gris.
T. Verron,

Oui tu as raison. Je soupçonne que vous devrez introduire une nouvelle superposition dans une course de functon au crochet linum-avant-numérotation et lui donner un visage que vous pouvez définir.
tealeg
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.