Проблема
Проблема здесь в том, что нет лица, чтобы контролировать внешний вид полей. Вы можете отображать текст на полях, используя оверлеи (вот что 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)