hl-line-mode приховати фон, як цього уникнути?


10

З:

(when window-system
  (set-face-background 'hl-line "light yellow")
  (global-hl-line-mode 1))

Поточний рядок виділений жовтим фоном, але якщо текст має фонові властивості, він також буде перезаписаний (наприклад, диф-режим, режим веселки).

Чи можна встановити фон лише для частин, які не мають відповідних властивостей?

ОНОВЛЕННЯ Я починаю експериментувати, здається, що шпилька не суперечить фону:

(set-face-stipple 'hl-line '(4 4 "\x01\x00\x00\x00"))
(set-face-attribute 'hl-line nil :inherit nil)

Але штрип, на жаль, пошкоджує зовнішній вигляд тексту ...


1
Ще одна можливість, яку ви можете розглянути, - це функція видалення, розміщена в кінці кожного циклу командних рядків hl, таким чином, що пошук виконується від початку поточного рядка до кінця поточного рядка (або до кінця поточну візуальну лінію, якщо вона застосовується) та обличчя накладення hl-лінії можна потім видалити звідки б там не було іншого тексту з іншим кольором фону. Ви, ймовірно, будете шукати виділення, розміщене за допомогою шрифтового блокування, хоча, можливо, також підсвітка розміщена за допомогою інших накладок (наприклад, помилки / дублікати мухоспеціалізації).
законник

@lawlist Я зацікавлений у його реалізації; Ви можете додати повне рішення нижче?
Каушал Моді

@kaushalmodi - Я знаю, як це зробити для конкретних накладок або необробленого тексту в точці, але не для конкретних властивостей тексту / підкреслення шрифту в точці. Оскільки мені потрібно було б дослідити, як перевірити ці два останні події, щоб правильно відповісти на це питання, я вирішив зробити коментар замість цього. Ось фрагмент [запозичений з однієї з бібліотек Дрю] для перевірки на конкретні накладення в пункті: (when (memq NAME-OF-FACE (mapcar (function (lambda (ovr) (overlay-get ovr 'face))) (overlays-at (point)))) (remove-overlays BEGINNING-POINT ENDING-POINT 'face hl-line))
список законів

Відповіді:


5

Проблема полягає в тому, що іноді властивість тексту faceвикористовується для виділення та hl-line-modeвикористовує накладку. І накладки завжди відображаються "зверху" faceпідсвічування властивостей тексту .

diff-mode, наприклад, використовує властивість тексту, а не накладення. Тож у таких випадках вам не пощастило.

Але для виділення, яке виробляється накладанням, ви можете просто зменшити пріоритет накладання накладної рядка hl: або hl-line-overlayабо global-hl-line-overlay, так що ця накладка виявиться «нижче» іншої підсвітки.

Якщо ви використовуєте бібліотеку, hl-line+.elви можете використовувати параметр hl-line-overlay-priorityдля встановлення пріоритету накладання. Дивіться також сторінку Emacs Wiki Виділення поточної лінії . (Знову ж таки, зміна пріоритету накладання не впливає, якщо інша підсвітка не є накладанням.)


Дякую за відповідь Я не переймаюся різницею між обличчями та накладками ... +1
gavenkoa

Як отримати доступ до цієї hl-line-overlayвласності? Це, наприклад, не з'являється в customize-variable.
9000

@ 9000: Як йдеться у відповіді, якщо ви користуєтеся бібліотекою, hl-line+.elви просто налаштуєте параметр hl-line-overlay-priority. В іншому випадку ви не можете (за винятком перевизначення або надання поради попередньо передбачених функцій). Це сенс надання цієї опції користувача.
Дрю

3

Закінчую частковим рішенням - виділяємо лише з кінця рядка:

(defun my-hl-line-range-function ()
  (cons (line-end-position) (line-beginning-position 2)))
(setq hl-line-range-function #'my-hl-line-range-function)

(when window-system
  (require 'hl-line)
  (set-face-attribute 'hl-line nil :inherit nil :background "light yellow")
  (setq global-hl-line-sticky-flag t)
  (global-hl-line-mode 1))

2

Натрапивши на це питання, намагаючись не hl-lineпереосмислити передумови (хоча в цьому випадку це були настанови відступу):

Я зупинився на цьому, що починає малювати лінію виділення після відступу:

(defun my-hl-line-range-function ()
  (cons
   (+ (line-beginning-position 1) (current-indentation))
   (line-beginning-position 2)))
(setq hl-line-range-function #'my-hl-line-range-function)

Заміна (+ (line-beginning-position 1) (current-indentation))з (point)роботою теж (починаючи з курсором).

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