【问题标题】:Overlays -- how to prevent bold faces from trumping non-bold faces叠加层——如何防止粗体面胜过非粗体面
【发布时间】:2019-09-18 07:04:53
【问题描述】:

我正在寻求一些帮助,以控制 粗体 面与叠加。使用标准的font-lock 方法,通常将:bold nil 放在另一面就足够了,以防止它被压倒。但是,在处理叠加层时,同样的概念似乎并不适用。在处理叠加层时,还有什么办法可以防止 bold 渗入其他面?

例如:当两个叠加层重叠时,如何防止tab-face bold 胜过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)

编辑(2014 年 6 月 19 日):添加了示例 .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

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    :bold 是一个兼容性别名。如需更精细的控制,请使用:weight,例如

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

    【讨论】:

    • 谢谢——我将在接下来的几天里继续研究这个项目,看看我是否可以整理一个简短的工作示例来重现我所看到的。似乎在与另一个具有 bold 的叠加层(例如,(:foreground "cyan" :weight bold))相同的位置使用仅包含下划线的叠加层(例如,(:underline "yellow" :weight normal))会导致使 Emacs 感到困惑的情况,这很重要至于首先放置哪个叠加层。我在flyspell-incorrect 中看到了这一点;还有buffer-display-table 修改,其中我有一个粗体标签字形着色。
    • 基本上,我想使用叠加层来为整个水平文本行加下划线(该文本可能包含也可能不包含一些粗体);并且,我希望下划线在水平线的整个长度上具有 normal 权重(而不改变 bold 的外观可能出现在下划线上方的文本)。它与hl-line-mode 非常相似。
    【解决方案2】:

    即使使用您发布的代码,我也没有看到您报告的问题(尽管我同意 @Stefan 关于 :weight normal 的观点)。

    评估您的代码我得到了这个,它在整个缓冲区中显示黄色下划线,并且仅在最后一行的一部分上显示粗体文本:

    我错过了什么? (这是文本模式下的缓冲区,font-lock-mode 已关闭。)

    【讨论】:

    • 感谢您查看此线程——非常感谢!我已经用示例代码更新了问题,以重现我看到的问题,以及两个屏幕截图。如果可能的话,我想学习一种方法来一致地控制在同一位置有叠加层,:foregroundbold:underlinenormal。 Flyspell 使用覆盖,而不是 font-lock,所以这就是我选择该示例的原因。 hl-line-mode 也使用覆盖,而不是 font-lock。在处理同一位置的两个相互竞争的叠加层时,情况可能有些特殊。
    • 我一直在编写/工作的次要模式是 vline-modehl-line-mode 的升级版。解决这个在hl-line-mode 中可以看到的特定问题同样会解决我在自定义十字准线模式中看到的相同问题。
    • 尝试使用较高的priority 值用于使用下线面的叠加层。叠加优先级通常让您将一个叠加层移到另一个叠加层之上(视觉上)。 (如果您希望人们尝试重现某些内容,您应该尝试提供最少的代码。您应该能够在不引入各种模式等的情况下重现您的问题。)
    • 感谢priority 的建议。这将是一个正在进行的线程。我今晚取得了一些进展,发现我的光标覆盖对这个线程中描述的视觉问题有重大影响——我在这里发生了四 (4) 个 base 组覆盖——(1 ) 从左寡妇边缘到光标(下划线); (2) 光标(粗体,但不带下划线); (3) 光标到行尾后(下划线);并且,(4) 从行尾到右窗口边缘的后字符串(下划线)。 Flyspell 是出现在现场的第五(5)个元素。 . . .
    • 另见Emacs bug #17824。这可能是相关的;不知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    相关资源
    最近更新 更多