Наложения — как не допустить, чтобы выделенные жирным шрифтом грани превосходили не выделенные жирным шрифтом грани

#emacs #elisp

#emacs #elisp

Вопрос:

Пожалуйста, я ищу помощи для управления выделенными жирным шрифтом гранями в сочетании с наложениями. При стандартном методе обычно достаточно поместить в другую грань, чтобы предотвратить ее превышение. font-lock :bold nil Однако эта же концепция, похоже, не применяется при работе с оверлеями. Что еще можно сделать при работе с оверлеями, чтобы предотвратить распространение выделения жирным шрифтом на другие грани?

Например: когда два наложения перекрываются, как я могу предотвратить выделение tab-face жирным шрифтом hr-underscore-face ?

 (defface tab-face
  '((t (:foreground "cyan" :bold t)))
  "Face for `tab-face`."
  :group 'lawlist-ruler-faces)

(defface hr-underscore-face
  '((t (:underline "yellow" :bold nil)))
  "Face for `hr-underscore-face`."
  :group 'lawlist-ruler-faces)
  

РЕДАКТИРОВАНИЕ (19 июня 2014 г.): добавлен пример .emacs конфигурации для воспроизведения проблемы и два скриншота. Путь к файлу ispell-program-name необходимо будет задать в соответствии с собственными настройками пользователя.

 ;; GNU Emacs 24.4.50.1 (x86_64-apple-darwin10.8.0,
;; NS appkit-1038.36 Version 10.6.8 (Build 10K549)) of 2014-06-01 on MP.local

(set-face-attribute 'default nil
  :background "black" :foreground "white" :font "Courier" :height 180)

(tool-bar-mode -1)

(require 'ispell)

(require 'flyspell)

(setq-default ispell-program-name
    "/Users/HOME/.0.data/.0.emacs/elpa/bin/aspell")

(custom-set-faces
  '(flyspell-incorrect ((t (:foreground "yellow" :weight bold ))))
  '(highlight ((t (:underline "yellow" :weight normal)))))

(defun zoom ()
(interactive)
  (setq buffer-face-mode-face `(:height 575))
  (buffer-face-mode 1))

(defun test-number-one ()
(interactive)
  (switch-to-buffer (get-buffer-create "test-number-ONE"))
  (zoom)
  (turn-on-flyspell)
  (setq flyspell-mark-duplications-flag nil)
  (setq flyspell-duplicate-distance 0)
  (hl-line-mode 1)
  (insert
    "This is `test-number-one`."
    "n"
    "n"
    "Aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz"
    "n"
    "n"
    "Aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz"))


(defun test-number-two ()
(interactive)
  (switch-to-buffer (get-buffer-create "test-number-TWO"))
  (zoom)
  (hl-line-mode 1)
  (insert
    "This is `test-number-two`."
    "n"
    "n"
    "Aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz"
    "n"
    "n"
    "Aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz"))
  

В примере номер один подчеркивание выделено жирным шрифтом. [Тем не менее, я хотел бы узнать, как сделать так, чтобы подчеркивание последовательно имело нормальный вес (даже если :foreground текст выделен жирным шрифтом).]

Пример
(источник: lawlist.com )


В примере номер два подчеркивание является нормальным.

Пример
(источник: lawlist.com )

Ответ №1:

:bold это псевдоним совместимости. Для более точного управления используйте :weight , например

 (defface hr-underscore-face
  '((t (:underline "yellow" :weight normal)))
  "Face for `hr-underscore-face`."
  :group 'lawlist-ruler-faces)
  

Комментарии:

1. Спасибо — я продолжу работать над этим проектом в течение следующих нескольких дней и посмотрю, смогу ли я собрать короткий рабочий пример, чтобы воспроизвести то, что я вижу. Похоже, что использование наложения, содержащего только подчеркивание (например, (:underline "yellow" :weight normal) ) в том же месте, что и другое наложение с жирным шрифтом (например, ), (:foreground "cyan" :weight bold) приводит к ситуации, которая сбивает с толку Emacs, и имеет значение, какое наложение было размещено первым. Я вижу это с flyspell-incorrect помощью; а также buffer-display-table модификация, в которой у меня есть жирная раскраска символов для вкладок.

2. По сути, я хотел бы использовать наложения для подчеркивания всей горизонтальной строки текста (текст может содержать или не содержать жирный шрифт); и я бы хотел, чтобы подчеркивание имело нормальный вес по всей длине горизонтальной строки ( без изменения внешнего вида выделенного жирным шрифтом текста, который может быть выделен жирным шрифтом).присутствует над подчеркиванием). Это очень похоже на hl-line-mode .

Ответ №2:

Я не вижу проблемы, о которой вы сообщаете, даже с кодом, который вы опубликовали (хотя я согласен с @Stefan о :weight normal ).

Оценивая ваш код, я получаю это, который показывает желтое подчеркивание по всему буферу и жирный текст только на части последней строки:

введите описание изображения здесь

Чего мне не хватает? (Это с буфером в текстовом режиме и font-lock-mode отключено.)

Комментарии:

1. Спасибо, что взглянули на эту тему — очень признателен! Я обновил вопрос с помощью примера кода, чтобы воспроизвести проблему, которую я вижу, и два скриншота. Если возможно, я хотел бы узнать о способе последовательного контроля наличия наложений в одной и той же позиции с выделением :foreground жирным шрифтом и :underline нормальным . Flyspell использует оверлеи вместо font-lock , поэтому я выбрал этот пример. hl-line-mode также использует оверлеи вместо font-lock . Ситуация, вероятно, несколько особенная, когда имеешь дело с двумя конкурирующими наложениями в одной и той же позиции.

2. Второстепенный режим, с которым я писал / работал, — это улучшенная версия vline-mode and hl-line-mode . Решение этой конкретной проблемы, которую можно увидеть в hl-line-mode , также решит ту же проблему, которую я вижу в моем пользовательском режиме перекрестия.

3. Попробуйте использовать более высокое priority значение для наложения, в котором используется грань nderline. Приоритеты наложения обычно позволяют перемещать одно наложение поверх другого (визуально). (И вы должны попытаться дать минимальный код, если хотите, чтобы люди пытались что-то переписать. Вы должны быть в состоянии повторить вашу проблему, не вводя различные режимы и т. Д.)

4. Спасибо за priority предложение. Это будет незавершенный поток. Сегодня вечером я добился некоторого прогресса, определив, что мое наложение курсора оказывает значительное влияние на визуальную проблему, описанную в этой теме — у меня есть четыре (4) базовых группы наложений, которые происходят здесь — (1) от левого края вдовы до курсора (подчеркнуто); (2) курсор (выделенный жирным шрифтом, но не подчеркнутый); (3) после курсора до конца строки (подчеркнутый); и (4) после строки (подчеркнутый) от конца строки до правого края окна. Flyspell — это пятый (5-й) элемент, появляющийся на сцене . . . .

5. См. Также Ошибку Emacs # 17824 . Это может быть актуально; не знаю.