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-mode
dział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-mode
uż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-mode
aktualizuje numery linii.
(add-hook 'linum-before-numbering-hook #'endless/setup-margin-overlays)