hl-line-mode скрыть фон, как этого избежать?

10

С:

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

текущая строка подсвечивается желтым фоном, но если текст имеет свойства фона, он также перезаписывается (например, diff-mode, rainbow-mode).

Можно ли установить фон только для деталей, которые не имеют соответствующих свойств?

ОБНОВЛЕНИЕ Я начинаю экспериментировать, кажется, что пунктир не противоречит фону:

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

Но пунктир, к сожалению, повредить внешний вид текста ...

gavenkoa
источник
1
Другая возможность, которую вы, возможно, пожелаете рассмотреть, - это функция удаления, размещаемая в конце каждого командного цикла hl-line, так что поиск выполняется от начала текущей строки до конца текущей строки (или до конца текущая визуальная линия (если применимо) и оверлейная грань линии hl могут быть удалены из любого места, где существует другой текст с другим цветом фона. Скорее всего, вы будете искать подсветку, размещенную с помощью font-lock, хотя у вас также может быть подсветка с другими наложениями (например, ошибки / дубликаты flyspell).
юрист
@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))
lawlist

Ответы:

5

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

diff-modeНапример, использует свойство текста, а не наложение. Так что в таких случаях вам не повезло.

Но для выделения, производимого наложением, вы можете просто уменьшить приоритет наложения наложения hl-line: либо на, 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))
gavenkoa
источник
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)работает тоже (начиная с курсора).

ideasman42
источник