Jak mogę wypełnić cały pasek numeru linii niestandardowym kolorem tła?

9

Na poniższym zrzucie ekranu po prostu ustawiłem tło linumtwarzy na jakiś kolor, jednak na końcu bufora jest pusty obszar i między liniami są przerwy, gdy global-visual-line-modewłączone jest zawijanie linii ( ):

Złamane tło linum z zawijaniem linii.

Idealnie cała lewa strona powinna mieć jednolity kolor. czy to możliwe? Znam trochę Elisp, więc jeśli to możliwe, mógłbym sam napisać poprawkę z instrukcjami.

Lenar Hoyt
źródło
Zauważyłem to podczas zmiany motywów. Obejściem problemu było powrót do domyślnego motywu, a następnie ponowne włączenie określonego motywu. To zwykle resetuje kolory tła. Warto przyjrzeć się domyślnym ustawieniom motywu, aby sprawdzić, czy jest bardziej pracowity z określonymi twarzami, które mogą być wskazówką, jak napisać funkcję, aby to naprawić.
elarson
Naprawienie koloru „pomiędzy” może być wykonalne (spróbuję). Naprawianie koloru po zakończeniu bufora niestety nie jest --- nie ma nic do pokolorowania.
Malabarba
W rzeczywistości widziałem to tak często, że jest to prawdopodobnie opłacalne żądanie funkcji.
Malabarba
@Malabarba Dlaczego nie można go rozszerzyć na obszar poniżej bufora? Grzywka też to robi.
Lenar Hoyt,
1
@mcb Rozumiem trochę lepiej, co miałeś na myśli. Grzywka ma własną twarz (której tło jest rozszerzone do dolnej części ekranu), margines nie ma (tylko pożycza domyślną twarz).
Malabarba

Odpowiedzi:

6

Problem

Problem polega na tym, że nie ma twarzy, która kontrolowałaby wygląd marginesów. Możesz wyświetlać tekst na marginesie za pomocą nakładek (tak właśnie linum-modedziała), ale podobnie jak każdy tekst w Emacsie, jest on ograniczony do granic bufora. Więc nie możesz mieć żadnej kontroli nad wyświetlaniem marginesów poza ostatnim wierszem bufora.

Co można zrobić, to naprawić te uszkodzone linie pomiędzy.

Co tam umieścić?

Ta zmienna kontroluje to, co chcesz wyświetlać na tych liniach wizualnych „pomiędzy” dwiema liniami logicznymi. Ważną częścią jest to 'face 'linum, co zapewnia, że ​​linie te będą się pojawiać linum-mode. "-----"Część jest poglądowe, można go zmienić na przestrzeni lub cokolwiek chcesz.

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

Jak to zrobić

Poniższy kod przechodzi przez bufor i umieszcza nakładki (podobne do linum-modeużywanych) w każdej linii, co nie jest „prawdziwe”.

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

I chcemy, aby działał za każdym razem, gdy linum-modeaktualizuje numery linii.

(add-hook 'linum-before-numbering-hook #'endless/setup-margin-overlays)
Malabarba
źródło
Właśnie go przetestowałem org-modei wydaje się, że wprowadza pewne opóźnienie podczas przewijania i pomija luki bez wyraźnego powodu przy włączonym zawijaniu adaptacyjnym. Zrzut ekranu.
Lenar Hoyt
@mcb Tak, wydajność jest tutaj problemem, ale poprawa tego byłaby długa i skomplikowana. Jeśli chodzi o problem związany z trybem org, org często korzysta z nakładek, więc ma sens konflikt. Nie wiem, jak to naprawić, ale zastanowię się.
Malabarba
-1

Możesz umieścić to w swojej konfiguracji:

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

... oczywiście zmień kod koloru na taki, jaki chcesz.

tealeg
źródło
2
Spowoduje to zmianę koloru grzywki, numery linii nie są wyświetlane na grzywce. (spróbuj, a zobaczysz różnicę)
Malabarba,
1
Widać to również na zrzucie ekranu w pytaniu: „kolumna numerów linii” ma ten sam kolor tła co bufor, podczas gdy obwódka to mały obszar między kolumną numerów linii a buforem, w kolorze szarym.
T. Verron,
Tak, masz rację. Podejrzewam, że musiałbyś wprowadzić nową nakładkę w biegu funkcyjnym na haczyku przed numerowaniem i nadać mu twarz, którą możesz ustawić.
tealeg