Obtener el tipo de letra debajo del cursor en Emacs


96

He estado desarrollando mi propio tema de color personalizado, y sería realmente útil si pudiera obtener una lista de fuentes que afectan al texto debajo del cursor.

Algo como el comando show current scope de Textmate.

Eso me ahorraría la molestia de hacer Mx custom-face y mirar a través de las opciones disponibles, adivinando cuál afecta la palabra actual en la que estoy.

¿Algunas ideas?


En caso de que esté buscando la misma funcionalidad con el cursor del mouse (si, por ejemplo, no puede acceder pointal texto en cuestión), consulte: emacs.stackexchange.com/a/35449/13444
Braham Snyder

Respuestas:


42

Puedes definir what-facecon este código:

(defun what-face (pos)
  (interactive "d")
  (let ((face (or (get-char-property (pos) 'read-face-name)
                  (get-char-property (pos) 'face))))
    (if face (message "Face: %s" face) (message "No face at %d" pos))))

Después de esto,

M-x what-face

imprimirá la cara encontrada en el punto actual.

(Gracias a thedz por señalar que what-faceno estaba integrado).


3
Esto ignora las caras definidas como propiedades de texto. Si está habilitado hl-line-mode, solo verá hl-linecomo la cara, no las otras caras. Considere gist.github.com/Wilfred/f7d61b7cdf9fdbb1d11c
Wilfred Hughes

2
Karl Fogel señaló un error en este código en una respuesta separada : el mensaje de salida dice que está describiendo la cara en el posparámetro, pero la lectura de la cara en realidad se realiza en (point)y no en pos.
Rory O'Kane

Esto no funciona, puede usar "Mx describe-face" en su lugar.
luochen1990

1
posno es una función; para que el fragmento funcione, debe reemplazar (pos)con posen las líneas 3 y 4
cebola

172

what-cursor-position con un argumento de prefijo muestra la cara debajo del punto, entre otra información.

El atajo de teclado es Cu Cx =

Salida de ejemplo (la propiedad de la cara se muestra en el último párrafo):

             position: 5356 of 25376 (21%), column: 4
            character: r (displayed as r) (codepoint 114, #o162, #x72)
    preferred charset: ascii (ASCII (ISO646 IRV))
code point in charset: 0x72
               syntax: w    which means: word
             category: .:Base, L:Left-to-right (strong), a:ASCII, l:Latin, r:Roman
          buffer code: #x72
            file code: #x72 (encoded by coding system undecided-unix)
              display: by this font (glyph code)
    nil:-apple-Monaco-medium-normal-normal-*-12-*-*-*-m-0-iso10646-1 (#x55)

Character code properties: customize what to show
  name: LATIN SMALL LETTER R
  general-category: Ll (Letter, Lowercase)
  decomposition: (114) ('r')

There are text properties here:
  face                 org-level-2
  fontified            t

[back]

11
Que invoca what-cursor-position.
viam0Zah

hmmm, a veces invoca what-cursor-position, a veces muestra una lista de propiedades del búfer (incluida la fuente). Si obtengo el comportamiento anterior, mover el cursor y repetirlo trae el segundo.
davidA

2
Estoy tan feliz de haber encontrado esto, con algunas combinaciones desconocidas de los comandos y pulsaciones de teclas pude emacsmostrar cómo me gustó y no cómo recuperarlo en mi próximo reinicio
Variable miserable

2
Muestra el nombre de la fuente en la GUI de Emacs. En la terminal, Emacs no es responsable de configurar la fuente y, por lo tanto, dicha información no está disponible cuando lo hace C-u C-x =en Emacs ejecutándose en la terminal, como emacs -nw file.txt.
Fernando Basso

67

Mx describe la cara


5
Esto también incluye el bonito enlace que permite personalizar la cara debajo del cursor inmediatamente
dolzenko

2
Esto funciona bien la mayor parte del tiempo, pero a veces, por razones que no puedo entender, a veces no sugiere la cara que estoy buscando. Por ejemplo, en eshell, cuando hay un color ansi, solo dice "predeterminado".
Samuel Edwin Ward

2
Esto me muestra un mensaje donde puedo ingresar algo. ¿Qué debería ingresar para describir la fuente debajo del cursor?
Zelphir Kaltstahl

1
Esto me funcionó para personalizar las fuentes de bloques de código en modo org. @Zelphir, el texto antes del mensaje mostraba la cara, al menos en mi caso. Podrías simplemente golpear return. Por ejemplo, mi resultado leyó Describe face (default ‘org-block-background’): .
Mallory-Erik

8

La cara de Trey está en el camino correcto. Me llevó a un correo electrónico en una lista de correo que tenía esto:

(defun what-face (pos)
    (interactive "d")
        (let ((face (or (get-char-property (point) 'read-face-name)
            (get-char-property (point) 'face))))
    (if face (message "Face: %s" face) (message "No face at %d" pos))))

Duh, olvidé que no estaba incluido con Emacs. ¿Puedo incluir la fuente en mi respuesta con atribución? :)
Trey Jackson

2

Hay un error en el código 'what-face': la función toma "pos" como argumento pero luego no lo usa cuando obtiene la cara - en su lugar usa "(point)", aunque el mensaje más tarde afirma pos en el caso "Sin rostro en% d".


2
Esto estaría mejor ubicado como comentario sobre esa respuesta.
Adam Spires

1
Incluso mejor si tuviera una solución ... +1 por detectarlo de todos modos
rath
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.