O problema
O problema aqui é que não há rosto para controlar a aparência das margens. Você pode exibir texto na margem usando sobreposições (é o que linum-mode
faz), mas, como qualquer texto no Emacs, ele é restrito aos limites do buffer. Portanto, você não pode ter nenhum controle sobre a exibição da margem além da última linha do buffer.
O que você pode fazer é corrigir essas linhas defeituosas no meio.
O que colocar lá
Essa variável controla o que você deseja exibir nessas linhas visuais "entre" duas linhas lógicas. A parte importante é a 'face 'linum
, que garante que essas linhas sigam a aparência de linum-mode
. A "-----"
peça é demonstrativa, você pode alterá-la para espaços ou o que quiser.
(defvar endless/margin-display
`((margin left-margin) ,(propertize "-----" 'face 'linum))
"String used on the margin.")
Como fazer isso
O código a seguir passa pelo buffer e coloca sobreposições (semelhantes às linum-mode
usadas) em cada linha que não é "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)))
E queremos que ele seja executado sempre que linum-mode
atualizar os números das linhas.
(add-hook 'linum-before-numbering-hook #'endless/setup-margin-overlays)