2009-02-10 23 views
31

¿Cómo se cambia la cara predeterminada que Emacs usa para dar formato al texto por modo?Establecer la fuente de la fuente predeterminada de Emacs por búfer/modo

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

Es fácil diseñar encabezados, enlaces, etc. únicamente para el modo de reducción: simplemente coloque el cursor sobre el texto con estilo y M-x 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 usando este modo?

+0

Si hay alguna variable que controla las caras predeterminadas, entonces puede localizarla para el búfer actual solo en un gancho que se llama al abrir un archivo w/markdown. – jfs

+0

La pregunta se realiza de forma general, luego se realiza un ejemplo específico y las respuestas giran en torno a este ejemplo específico. Si realmente necesita "** Configurar la cara de fuente predeterminada de Emacs por modo **", vea [Usando una fuente diferente para cada modo principal - Emacs Stack Exchange] (http://emacs.stackexchange.com/questions/3038/ using-a-different-font-for-each-major-mode/3042 # 3042) –

Respuesta

27

¿Qué tal algo como esto:

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

A continuación, puede personalizar la cara variable-pitch, y las otras caras de la memoria intermedia se heredan de esto en vez de la cara por defecto.

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

+0

Según mi entender, esto requiere Emacs 23, no puede encontrar '' pitch-mode'' ni '' buffer-face-mode' en Emacs 22. – danielpoe

+1

Guau, la gente todavía usa Emacs 22? – jrockway

+0

Gracias, el truco. Sin embargo, cuando un buffer usa fuentes de paso variable, el desplazamiento se hace tan lento que es inutilizable. Pero esto es probablemente solo un error. –

6

tengo que dar una respuesta parcial, porque esto es demasiado complicado de averiguar sobre el terreno y que ya me dejó presupuesto de tiempo.

Face es propiedad de un marco. 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 desea. Su pregunta parece implicar cambiar las propiedades de la cara de un solo cuadro.

Nuevamente suponiendo que un cuadro nunca mostrará más de un búfer a la vez, puede intentar avisarle al switch-to-buffer. 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 mi respuesta real (incompleta) ...

Una mejor, aunque más complicado, enfoque daría instrucciones rebaja en modo de utilizar una nueva cara para todas las regiones que no están ya asignó una de las caras integradas. Puedes crear una nueva cara con cara de copia y darle propiedades interesantes con set-face- *.

Modifique el font-lock-default de markdown-mode para anular la función predeterminada font-lock-fontify-region-function como se describe en el bloque de comentarios cerca de la línea 946 de font-lock.el que comienza con "Funciones de Fontificación".Probablemente se puede utilizar una fuente-lock-default-fontify-región muy ligeramente modificada que hace sólo un paso adicional inmediatamente después de que hace:

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

El paso adicional analiza la región similar a lo que font-lock-fontify- syntactically-region lo hace, rompiendo 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 todo esto se siente como debería ser solo un par de líneas de elisp en su archivo .emacs, además de hacer una copia de font-lock-default-fontify-region que tiene solo una pequeña diferencia del original (llamar a uno nueva función), además de hacer una copia de font-lock-fontify-syntactically-region y modificarla para hacer su puja (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.

+0

Los nombres y números de línea hablan con GNU emacs 22.3.1. – JeffJ

+0

O simplemente obtenga una versión reciente de emacs y use buffer-face-mode. – jrockway

+0

Cool. Pero probablemente esperaré hasta que emacs 23 se envíe realmente antes de actualizarlo. – JeffJ

2

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

Solo trata de lo siguiente:

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

también podría encontrar una definición de una función que cambie fácilmente la fuente de un búfer en http://junis.orgfree.com/SetBufferFont.el –

+0

las superposiciones no son buenas, porque son lentas. solo son buenos si no tienes demasiados al mismo tiempo ... – alinsoar

5

El -mode variable-pitch es impresionante. Me enteré a través de este hilo. Pero puede ser 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)))) 

Apenas añada modo de lo que quiera fuentes sans-serif en la lista.

+0

Lo que hace el código anterior es habilitar 'modo de tono variable' para todos los modos enumerados en todas las líneas, excepto la última. –

0

Hay un bloque de código que me parece muy conveniente, de EmacsWiki. La ventaja de esto es que se puede establecer la cara no sólo la fuente, pero convenientemente configurar :height, :width etc, así

;; 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, puede incluso especificar el 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))) 
Cuestiones relacionadas