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-mode
hace) 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-mode
usa) 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-mode
actualice los números de línea.
(add-hook 'linum-before-numbering-hook #'endless/setup-margin-overlays)