Як я можу заповнити весь рядок номера рядком спеціальним кольором тла?


9

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

Сломанной Linum фон з лінії обгортання.

В ідеалі вся ліва сторона повинна бути рівномірного кольору. Чи можливо це? Я знаю деяких Елісп, тому, якщо це можливо, я б міг написати собі виправлення з деякими інструкціями.


Я помітив це при переключенні тем. Робота для мене полягає в тому, щоб повернутися до теми за замовчуванням, а потім знову ввімкнути певну тему. Зазвичай це скидає кольори фону. Можливо, варто поглянути на налаштування теми за замовчуванням, щоб побачити, чи є більш ретельними конкретні обличчя, які можуть дати зрозуміти, як написати функцію для її виправлення.
Еларсон

Виправлення кольору "посередині" може бути життєздатним (спробую). Виправлення кольору після закінчення буфера, на жаль, не --- немає нічого забарвленого.
Малабарба

Насправді я бачив це запитання так часто, що це, мабуть, гідний запит на функцію.
Малабарба

@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)

Я щойно тестував це, org-modeі, схоже, впроваджується деяке відставання під час прокрутки, і він пропускає прогалини без очевидних причин з увімкненим адаптивним обгортанням. Знімок екрана.
Ленар Хойт

@mcb Так, продуктивність тут є проблемою, але покращення цього було б довгим і складним питанням. Що стосується проблеми в органічному режимі, орг використовує накладки, тому має сенс виникнення конфлікту. Я не знаю жодного способу виправити це, але я подумаю.
Малабарба

-1

Ви можете помістити це у свій конфігурацію:

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

... очевидно, змінити колірний код на потрібний.


2
Це змінить колір бахроми, номери рядків не відображаються на бахромі. (спробуйте, і ви побачите різницю)
Малабарба

1
Це також видно на скріншоті у запитанні: "стовпчик номерів рядків" є тим самим кольором фону, що і буфер, тоді як бахрома - це невелика область між стовпцем номерів рядків та буфером, сірим кольором.
Т. Веррон

Так, ви праві. Я підозрюю, що вам доведеться запровадити нову накладку у функтонному циклі на гачку перед нумерацією та надати їй обличчя, яке ви можете встановити.
чайна нога
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.