Wie kann ich die gesamte Zeilennummernleiste mit einer benutzerdefinierten Hintergrundfarbe füllen?

9

Im folgenden Screenshot habe ich einfach den Hintergrund des linumGesichts auf eine bestimmte Farbe eingestellt. Am Ende des Puffers befindet sich jedoch ein leerer Bereich und es gibt Lücken zwischen den Zeilen, wenn der Zeilenumbruch ( global-visual-line-mode) aktiviert ist:

Gebrochener Linum-Hintergrund mit Zeilenumbruch.

Idealerweise sollte die gesamte linke Seite eine einheitliche Farbe haben. Ist das möglich? Ich kenne einige Elisp, also wenn es möglich ist, könnte ich vielleicht selbst ein Update mit einigen Anweisungen schreiben.

Lenar Hoyt
quelle
Ich habe dies beim Themenwechsel bemerkt. Die Lösung bestand für mich darin, zum Standardthema zurückzukehren und das spezifische Thema wieder zu aktivieren. Dadurch werden normalerweise die Hintergrundfarben zurückgesetzt. Es kann sinnvoll sein, einen Blick auf die Standardeinstellungen für das Thema zu werfen, um festzustellen, ob es mit bestimmten Gesichtern sorgfältiger ist, die möglicherweise einen Hinweis darauf geben, wie eine Funktion zum Beheben des Problems geschrieben wird.
Elarson
Das Fixieren der Farbe "dazwischen" könnte sinnvoll sein (ich werde es versuchen). Das Fixieren der Farbe nach dem Pufferende ist leider nicht --- es gibt nichts, was gefärbt werden könnte.
Malabarba
Tatsächlich habe ich dies so oft gesehen, dass es wahrscheinlich eine lohnende Feature-Anfrage ist.
Malabarba
@ Malabarba Warum ist es nicht möglich, es in den Bereich unterhalb des Puffers zu erweitern? Das macht doch auch der Rand.
Lenar Hoyt
1
@mcb Ich verstehe ein bisschen besser, was du jetzt gemeint hast. Der Rand hat ein eigenes Gesicht (dessen Hintergrund bis zum unteren Bildschirmrand reicht), der Rand nicht (er leiht nur das Standardgesicht aus).
Malabarba

Antworten:

6

Das Problem

Das Problem hierbei ist, dass es kein Gesicht gibt, mit dem das Erscheinungsbild der Ränder gesteuert werden kann. Sie können Text am Rand mithilfe von Überlagerungen anzeigen (genau das ist der linum-modeFall), aber wie jeder Text in Emacs ist er auf die Grenzen des Puffers beschränkt. Sie können also keine Kontrolle über die Randanzeige über die letzte Zeile des Puffers hinaus haben.

Was Sie können tun, ist es, diese fehlerhaften Linien in-zwischen beheben.

Was dort zu setzen

Diese Variable steuert, was auf diesen visuellen Linien „zwischen“ zwei logischen Linien angezeigt werden soll. Der wichtige Teil ist der 'face 'linum, der sicherstellt, dass diese Linien dem Erscheinungsbild von folgen linum-mode. Der "-----"Teil ist demonstrativ, Sie können ihn in Leerzeichen oder was auch immer Sie möchten ändern.

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

Wie es geht

Der folgende Code durchläuft den Puffer und platziert Überlagerungen (ähnlich den linum-modeverwendeten) in jeder Zeile, die nicht "echt" ist.

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

Und wir möchten, dass es immer dann ausgeführt wird, wenn linum-modedie Zeilennummern aktualisiert werden.

(add-hook 'linum-before-numbering-hook #'endless/setup-margin-overlays)
Malabarba
quelle
Ich habe es gerade getestet org-modeund es scheint eine gewisse Verzögerung beim Scrollen zu verursachen, und es fehlen Lücken ohne offensichtlichen Grund, wenn der adaptive Wrap aktiviert ist. Bildschirmfoto.
Lenar Hoyt
@mcb Ja, Leistung ist hier ein Problem, aber eine Verbesserung wäre eine lange und komplizierte Angelegenheit. Was das Org-Modus-Problem betrifft, verwendet Org stark Overlays, daher ist es sinnvoll, dass es zu Konflikten kommt. Mir ist keine Möglichkeit bekannt, das Problem zu beheben, aber ich werde darüber nachdenken.
Malabarba
-1

Sie könnten dies in Ihre Konfiguration einfügen:

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

... ändern Sie natürlich den Farbcode in den gewünschten.

Tealeg
quelle
2
Dadurch wird die Streifenfarbe geändert. Auf dem Streifen werden keine Zeilennummern angezeigt. (
Probieren
1
Es ist auch auf dem Screenshot in der Frage sichtbar: Die "Zeilennummernspalte" hat dieselbe Hintergrundfarbe wie der Puffer, während der Rand der kleine Bereich zwischen der Zeilennummernspalte und dem Puffer in Grau ist.
T. Verron
Ja, du hast Recht. Ich vermute, Sie müssten ein neues Overlay in einem Funktionslauf am Linum-before-Numbering-Hook einführen und ihm ein Gesicht geben, das Sie festlegen können.
Tealeg