Как я могу заполнить всю строку номера строки пользовательским цветом фона?

9

На скриншоте ниже я просто установил фон linumлица на какой-то цвет, однако в конце буфера есть пустая область и между строками есть промежутки, когда global-visual-line-modeвключена перенос строки ( ):

Сломанный linum фон с линией переноса.

В идеале вся левая сторона должна быть одинакового цвета. Это возможно? Я знаю немного Elisp, поэтому, если это возможно, я мог бы, возможно, написать исправление самостоятельно с некоторыми инструкциями.

Ленар Хойт
источник
Я заметил это при переключении тем. Обходной путь для меня состоял в том, чтобы вернуться к теме по умолчанию и затем снова включить определенную тему. Это обычно сбрасывает цвета фона. Возможно, стоит взглянуть на настройки темы по умолчанию, чтобы увидеть, является ли она более прилежной с конкретными гранями, которые могут дать подсказку, как написать функцию для ее исправления.
Эларсон
Исправление цвета «между» может быть целесообразным (я попробую). К сожалению, исправление цвета после окончания буфера - нет ничего, что могло бы быть окрашено.
Малабарба
На самом деле, я видел, как это часто спрашивают, так что это, вероятно, стоящий запрос.
Малабарба
@ Malabarba Почему невозможно расширить его в область ниже буфера? Край делает это тоже в конце концов.
Ленар Хойт
1
@mcb Я немного лучше понимаю, что ты имел в виду. Край имеет свое собственное лицо (фон которого расширен до нижней части экрана), поле не имеет (оно просто занимает лицо по умолчанию).
Малабарба

Ответы:

6

Проблема

Проблема здесь в том, что нет лица, чтобы контролировать внешний вид полей. Вы можете отображать текст на полях, используя оверлеи (вот что 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)
Malabarba
источник
Я только что проверил это, org-modeи кажется, что во время прокрутки возникает некоторая задержка, и она пропускает пропуски без видимой причины с включенным адаптивным переносом. Скриншот.
Ленар Хойт
@mcb Да, производительность - это проблема, но ее улучшение будет долгим и сложным делом. Что касается проблемы режима org, org интенсивно использует оверлеи, поэтому имеет смысл конфликтовать. Я не знаю ни одного способа исправить это, но я подумаю над этим.
Малабарба
-1

Вы можете поместить это в свой конфиг:

(set-face-background 'fringe "#f4a460")

... очевидно, измените цветовой код на тот, который вы хотите.

tealeg
источник
2
Это изменит цвет полосы, номера строк не отображаются на краю. (попробуйте, и вы увидите разницу)
Малабарба
1
Это также видно на скриншоте в вопросе: «столбец с номерами строк» ​​имеет тот же цвет фона, что и буфер, тогда как полоса - это небольшая область между столбцом с номерами строк и буфером, выделенная серым цветом.
Т. Веррон
Да, ты прав. Я подозреваю, что вам нужно будет ввести новый оверлей в прогоне functon на крюке linum-before-numbering-hook и дать ему лицо, которое вы можете установить.
tealeg