2013-12-19 5 views
2

Идея состоит в том, чтобы переопределить set-face-attribute так, чтобы он устанавливал атрибуты лица, обычно, за исключением атрибута :weight, который всегда должен быть установлен на normal (по умолчанию это значение по умолчанию). С этим я надеюсь раз и навсегда отключить смелые шрифты в Emacs.Как отключить жирный шрифт, переопределив атрибут set-face в 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

(1) Вы можете использовать 'defalias' вместо' fset'. (2) Поскольку 'ARGS' является параметром' & rest', вам необходимо использовать 'appply':' (применить # 'атрибуты face frame-set-face-attributes face frame args) '. – Drew

+0

Лично, хотя я слишком ненавижу эффект «полужирный» на лицах (по крайней мере, в MS Windows), я предпочитаю просто переопределять отдельные лица. Во-первых, обычно есть что-то еще, что я хочу изменить о них, если они используют 'bold'. – Drew

+0

@Drew Но есть сотни лиц ... –

ответ

2

Вот код, чтобы начать Вас:

(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 лица.

+0

Атрибуты стандартных лиц могут быть установлены через ресурсы X, это нестандартные меня беспокоят. –

0

Хорошо! Я улучшил решение АВО АВО и это то, что я придумал с:

(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 перед установкой шрифта .

+1

Если вы обнаружите, что вам необходимо переопределить лица после их установки, рассмотрите FACE-REMAP-ADD-RELATIVE и друзей. –

1

Следующее предложение Аарона, вот еще одно решение, использующее 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 в окне терминала, за исключением большего количества цветов.

+0

Если вы уловили возвращаемое значение FACE-REMAP-ADD-RELATIVE, например. в хэш-таблице с ключом 'face', затем вы можете передать его FACE-REMAP-REMOVE-RELATIVE, чтобы отключить переназначение. –

 Смежные вопросы

  • Нет связанных вопросов^_^