【问题标题】:How to disable bold fonts by overriding set-face-attribute in Emacs?如何通过覆盖 Emacs 中的 set-face-attribute 来禁用粗体字体?
【发布时间】:2014-01-08 01:17:32
【问题描述】:

这个想法是重新定义set-face-attribute,使其正常设置面部属性,但:weight 属性除外,该属性应始终设置为normal(我认为是默认值)。有了这个,我希望一劳永逸地禁用 Emacs 中的粗体字体。

我知道了:

(fset 'original-set-face-attribute (symbol-function 'set-face-attribute))

(defun set-face-attribute (face frame &rest args)
  (progn
    (original-set-face-attribute face frame args)))

到目前为止,它不起作用。如果我这样做(make-face-bold 'default),我会得到Wrong type argument: symbolp, (:weight bold)。我想我有什么 要做的是从参数列表中删除包含:weight 的元素 args.

【问题讨论】:

  • (1) 您可以使用defalias 代替fset。 (2) 因为ARGS&rest参数,所以需要使用apply(apply #'original-set-face-attributes face frame args)
  • 就个人而言,虽然我也讨厌bold 对面孔的影响(至少在MS Windows 上),但我更喜欢简单地重新定义各个面孔。一方面,如果他们使用bold,我通常还想对他们进行其他更改。
  • @Drew 但是有数百张面孔...
  • 你是对的。在我的设置中,有 300 多个。而且我想我不会费心从所有这些中删除 bold。但话又说回来,其中一些我从未见过。我想我会根据需要(和所见)将面孔修复为我想要的。
  • 如果粗体字体比另一种字体更重要,我将另一种字体设置为 nil -- :bold nil。我对其他属性也这样做。这是一个例子:(make-face 'linum-active) (set-face-attribute 'linum-active nil :foreground "black" :background "#eab700" :bold nil :italic nil :underline nil :box nil :overline nil :height 180)

标签: emacs elisp emacs-faces


【解决方案1】:

这里有一些代码让你开始:

(defadvice set-face-attribute
    (before no-bold (face frame &rest args) activate)
  (setq args
        (mapcar (lambda(x) (if (eq x 'bold) 'normal x))
                args)))

我在大多数情况下都看到了这项工作,除了basic-faces 不要调用set-face-attribute,例如error 脸。

【讨论】:

  • 标准人脸的属性可以通过X资源来设置,困扰我的是非标准人脸。
【解决方案2】:

按照 Aaron 的建议,这是另一个使用 face-remap-add-relative.

(defun remap-faces-default-attributes ()
  (let ((family (face-attribute 'default :family))
        (height (face-attribute 'default :height)))
    (mapcar (lambda (face)
              (face-remap-add-relative
               face :family family :weight 'normal :height height))
          (face-list))))

(when (display-graphic-p)
  (add-hook 'minibuffer-setup-hook 'remap-faces-default-attributes)
  (add-hook 'change-major-mode-after-body-hook 'remap-faces-default-attributes))

这一个摆脱了无处不在的粗体字体,也摆脱了可变宽度字体 并将所有面设置为相同的高度。基本上就像在终端窗口中运行 Emacs 一样,除了颜色更多。

【讨论】:

  • 如果你捕捉到 FACE-REMAP-ADD-RELATIVE 的返回值,例如在由face 键入的哈希表中,然后您可以稍后将其传递给 FACE-REMAP-REMOVE-RELATIVE 以禁用重新映射。
【解决方案3】:

好的!我改进了 abo-abo 的解决方案,这就是我想出的 与:

(defadvice set-face-attribute
  (before ignore-attributes (face frame &rest args) activate)
  (setq args
        (apply 'nconc
               (mapcar (lambda (i)
                         (let ((attribute (nth i args))
                               (value (nth (1+ i) args)))
                           (if (not (memq attribute
                                          set-face-ignore-attributes))
                               (list attribute value))))
                       (number-sequence 0 (1- (length args)) 2)))))

(setq set-face-ignore-attributes '(:weight :height :box))

它禁用:height:weight:box 属性(这是可配置的 通过set-face-ignore-attributes 变量)对于大多数字体。为此 工作,它必须在字体之前的init.el的开头 属性已设置。

【讨论】:

  • 如果您发现需要在设置面部后覆盖它们,请考虑 FACE-REMAP-ADD-RELATIVE 和朋友。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2019-08-06
  • 2012-02-02
相关资源
最近更新 更多