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


¿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 exclusiva para el modo de reducción: simplemente coloque el cursor sobre el texto con estilo y M-x describe-face, luego haz 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 por defecto para los buffers usando este modo?


32
2018-02-10 21:33


origen


Respuestas:


Qué tal algo como esto:

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

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

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


28
2018-02-11 00:37



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 reducción 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.


6
2018-02-11 09:39



los variable-pitch-mode es impresionante. 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 sans-serif en la lista.


5
2017-09-20 22:34



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))

2
2018-01-13 22:21



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

;; 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, incluso puede especificar el tema de color para el búfer fácilmente:

(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)))

0
2018-05-24 06:02