emacs fonts themes emacs-faces font-lock

Establecer la fuente de la fuente predeterminada de Emacs por buffer/modo



fonts themes (5)

¿Cómo se cambia la cara predeterminada que usa Emacs para aplicar estilo al texto por modo?

Por ejemplo, diga que ya estoy satisfecho con las personalizaciones de caras que tengo, que incluyen una fuente predeterminada de ancho fijo. Sin embargo, en un modo particular ( markdown-mode.el , por ejemplo), quiero que la fuente predeterminada sea de ancho variable.

Es fácil diseñar encabezados, enlaces, etc. de forma única para el modo de reducción: simplemente coloque el cursor sobre el texto con estilo y Mx describe-face , luego haga clic en el enlace para personalizarlo.

Sin embargo, la cara predeterminada es la cara utilizada si no se especifica ninguna otra cara, por lo que no es específica para el modo de reducción y si se modifica afectará a todos los demás modos.

¿Qué magia puedo poner en el markdown-mode-hook para establecer la cara predeterminada para los buffers que usan este modo?


Qué tal algo como esto:

(add-hook ''markdown-mode-hook (lambda () (variable-pitch-mode t))

Luego puede personalizar la cara de variable-pitch , y las otras caras en el búfer heredarán de esta en lugar de la cara predeterminada.

Lea los documentos de buffer-face-mode para obtener más detalles de personalización. (BufFace también se usa para text-scale-increase text-scale-decrease ... muy útil).


Tengo que dar una respuesta parcial porque es demasiado complicado de resolver en el acto y ya arruiné mi presupuesto de tiempo.

Face es una propiedad de fotograma. Un marco puede mostrar múltiples búferes al mismo tiempo. El modo es una propiedad de buffer. Usted pregunta cómo variar la cara por modo. Combinando todo esto, parece que la pregunta no puede tener una sola respuesta totalmente correcta.

Puede aproximar la respuesta deseada si supone que un cuadro determinado nunca mostrará más de un búfer. De hecho, puede lograr eso con algo como esto, pero modificado para usar special-display-regexps y un conjunto de expresiones regulares que coincidan con sus nombres de búfer en modo markdown.

(append special-display-buffer-names ''("*VC-log*" "*Help*" ("*Completions*" (height . 25) (font . "8x13"))))

Sin embargo, esto probablemente no es lo que quieres. Su pregunta parece implicar cambiar las propiedades de la cara de un solo cuadro.

De nuevo suponiendo que un cuadro nunca mostrará más de un búfer a la vez, puede intentar avisar de cambiar al búfer. Pero eso podría no ser de un nivel suficientemente bajo y podría ser demasiado lento. (no probado)

(defadvice switch-to-buffer (after switch-to-buffer activate compile) "change the frame''s default face after switch-to-buffer" (doSomethingToChangePropertiesOfDefaultFace))

Y ahora para mi respuesta actual (incompleta) ...

Un enfoque mejor, aunque más complicado, instruiría al modo de rebaja para que use una nueva cara para todas las regiones que aún no tienen asignada una de las caras integradas. Puedes crear una nueva cara con cara de copia y darle propiedades interesantes con set-face- *.

Modifique los valores predeterminados de font-lock-mode de markdown para anular la función default-lock-fontify-region-function tal como se describe en el bloque de comentarios cerca de la línea 946 de font-lock.el que comienza con las "funciones de Fontificación". Probablemente pueda usar un font-lock-default-fontify-region muy ligeramente modificado que solo hace un paso extra inmediatamente después de hacerlo:

(unless font-lock-keywords-only (font-lock-fontify-syntactically-region beg end loudly))

El paso adicional analiza la región de forma similar a lo que hace font-lock-fontify-syntactically-region, y divide la región en subregiones "interesantes". Pero esta vez, usted encuentra las subregiones que tienen la cara por defecto y la propiedad de poner texto las regiones a la nueva cara que creó previamente.

En general, parece que solo debe haber un par de líneas de elisp en su archivo .emacs, además de hacer una copia de font-lock-default-fontify-region que tenga solo una pequeña diferencia con respecto al original (llame a una nueva función), Además, haga una copia de font-lock-fontify-syntactically-region y modifíquela para hacer su oferta (la parte más difícil).

En realidad, si "después" aconseja font-lock-fontify-syntactically-region, entonces probablemente ni siquiera necesite modificar font-lock-defaults o font-lock-default-fontify-region.


El modo variable-pitch variable es increíble. Me enteré a través de este hilo. Pero se puede hacer aún más impresionante:

(dolist (hook ''(erc-mode-hook LaTeX-mode-hook org-mode-hook edit-server-start-hook markdown-mode-hook)) (add-hook hook (lambda () (variable-pitch-mode t))))

Simplemente agregue el modo que desee a las fuentes de sans-serif en la lista.


En realidad es sencillo incluso para la versión 22.3.1 de emacs ...

Solo prueba lo siguiente:

(progn (set-buffer "your buffer name here") (overlay-put (make-overlay 0 (buffer-size)) ''face ''your-face))


Hay un bloque de código que me parece muy conveniente, de EmacsWiki. La ventaja de esto es que puede configurar no solo la fuente, sino también configurar convenientemente :height , :width etc.

;; Use variable width font faces in current buffer (defun my-buffer-face-mode-variable () "Set font to a variable width (proportional) fonts in current buffer" (interactive) (setq buffer-face-mode-face ''(:family "DejaVu Sans" :height 100 :width semi-condensed)) (buffer-face-mode)) ;; Use monospaced font faces in current buffer (defun my-buffer-face-mode-fixed () "Sets a fixed width (monospace) font in current buffer" (interactive) (setq buffer-face-mode-face ''(:family "Consolas" :height 100)) (buffer-face-mode)) ;; Set default font faces for Info and ERC modes (add-hook ''erc-mode-hook ''my-buffer-face-mode-variable) (add-hook ''Info-mode-hook ''my-buffer-face-mode-variable)

Combinado con load-theme-buffer-local paquete load-theme-buffer-local , incluso puede especificar fácilmente el tema de color para el búfer:

(defun my-buffer-face-mode-variable () "Set font to a variable width (proportional) fonts in current buffer" (interactive) (setq buffer-face-mode-face ''(:family "DejaVu Sans" :height 100 :width semi-condensed)) (buffer-face-mode) (load-theme-buffer-local ''leuven (current-buffer)))