Проблема
Проблема тут полягає в тому, що немає обличчя, яке б контролювало зовнішній вигляд поля. Ви можете відображати текст у полі за допомогою накладок (саме це і linum-mode
робиться), але, як і будь-який текст у Emacs, він обмежений межами буфера. Таким чином, ви не можете мати контроль над відображенням поля за межами останнього рядка буфера.
Що ви можете зробити - це виправити між собою ті несправні лінії.
Що туди покласти
Ця змінна керує тим, що ви хочете відображати у цих візуальних лініях "між" двома логічними лініями. Важливою частиною є те 'face 'linum
, що забезпечує, щоб ці лінії слідували за появою linum-mode
. "-----"
Частина показовий, ви можете змінити його в прогалини або все , що ви хочете.
(defvar endless/margin-display
`((margin left-margin) ,(propertize "-----" 'face 'linum))
"String used on the margin.")
Як це зробити
Наступний код проходить через буфер і розміщує накладки (подібні до linum-mode
використання) у кожному рядку, який не є "реальним".
(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)))
І ми хочемо, щоб він працював щоразу, коли linum-mode
оновлює номери рядків.
(add-hook 'linum-before-numbering-hook #'endless/setup-margin-overlays)