Aquí hay una manera. Debe vincular el comando a un evento del mouse. Pero si usa un clic del botón del mouse, entonces probablemente necesitará vincular el evento para la otra parte del clic (por ejemplo, hacia abajo) ignore
. Este es solo un ejemplo: es posible que no desee desperdiciar C-mouse1
en dicho comando.
La función principal (comando, en realidad) es describe-char
. Describe el punto en una posición de amortiguación dada. Parte de esa descripción incluye las propiedades de texto y las superposiciones en esa posición, y si la propiedad face
es una de estas, verá su valor.
(defun foo (event)
(interactive "e")
(let* ((mouse-pos (event-start event))
(pos-pt (posn-point mouse-pos)))
(describe-char pos-pt)))
(global-set-key [(control down-mouse-1)] 'ignore)
(global-set-key [(control mouse-1)] 'foo)
Esto podría ser un poco mejor: lo anterior podría no funcionar en algunos contextos:
(defun foo (event)
(interactive "e")
(let* ((mouse-pos (event-start event))
(mouse-buf (window-buffer (posn-window mouse-pos)))
(pos-pt (posn-point mouse-pos)))
(with-current-buffer mouse-buf (describe-char pos-pt))))
(Tenga en cuenta también que C-x =
está vinculado a what-cursor-position
qué usos describe-char
. Así que estaba en el camino correcto con C-u C-x =
).
En cuanto a Ido: a diferencia de Icomplete, que utiliza una superposición, el modo Ido inserta texto en el minibúfer. Pero la razón por la que el código anterior no funciona en ese texto es que el modo Ido elimina el texto al comienzo de cada comando, usando pre-command-hook
. Entonces, cuando se ejecuta el comando anterior, el texto que muestra las finalizaciones ya se ha eliminado.
El siguiente código soluciona ese problema, solo para el modo Ido. Vuelve a insertar el texto que muestra las finalizaciones al principio, y luego elimina las finalizaciones al final.
(defun foo (event)
(interactive "e")
(when (and (boundp 'ido-mode) ido-mode) (ido-exhibit))
(let* ((mouse-pos (event-start event))
(mouse-buf (window-buffer (posn-window mouse-pos)))
(pos-pt (posn-point mouse-pos)))
(with-current-buffer mouse-buf (describe-char pos-pt)))
(when (and (boundp 'ido-mode) ido-mode) (ido-tidy)))
describe-char: No character follows specified position
es devuelto por describe-char. Supongo que se debe a que el minibúfer se despejó en algún momento después del evento. Asumí'ignore
que esto detendría esto, pero eso no está sucediendo. ¿Algunas ideas?M-x some-text
,C-mouse-1
en ese texto en el minibúfer.) Debe hacer clic en el ratón, por supuesto, en una posición que tiene texto. Si hace clic después del final del texto, obtiene el error que mencionó.Si no puede colocar el punto en el lugar y uso correctos
C-u C-x =
, puede deberse al hecho de que el elemento relevante se muestra a través de una cadena anterior / posterior de una superposición, o porque ese elemento desaparece / cambia cuando intenta colocar el punto o cuando tuC-u C-x =
.Puede intentar evitar esos problemas de la siguiente manera:
posn-at-x-y
cual devolverá una descripción de lo que está en esa coordenada x / y. Por ejemplo, si se trata de un fragmento de texto tomado de una cadena after / before, esa cadena se mencionará allí (así como la posición dentro de esa cadena), para que pueda buscar la propiedad de la cara aplicada a esa cadena en esa posición.run-with-timer
usted puede ejecutar el código cada segundo, imprimiendo el resultado en algún tipo de búfer de depuración de su elección.fuente
Puede usar el paquete cara arriba para crear una representación de texto legible por humanos de un texto, con información de la cara. Por ejemplo:
Ejecute
M-x faceup-vire-buffer RET
, y se muestra lo siguiente:Las caras de bloqueo de fuente estándar se representan con nombres cortos, como
k
forfont-lock-keyword-face
, mientras que las caras no estándar se presentan con su nombre completo.(Faceup es un sistema de prueba de regresión para resaltar paquetes, por ejemplo, palabras clave de bloqueo de fuente, la representación de texto se almacena como un archivo de referencia).
EDITAR:
Para responder a la pregunta en el comentario: "Si estoy tratando de depurar las caras utilizadas en una pantalla de minibúfer, ¿esto todavía me dará la información?"
Si lo hace. Sin embargo, debe vincular la función a una tecla ya que ejecutarla usando
M-x
no funcionará cuando el minibúfer esté en uso. Por ejemplo:Si por "minibúfer" realmente se refería al área de eco, es decir, le gustaría inspeccionar el mensaje actual que necesitará un poco más. La siguiente función hará esto:
Por ejemplo, lo siguiente:
Te mostrará:
fuente
Una solución alternativa podría ser usar un selector de color y proporcionar el valor de color
list-faces-for-color
definido a continuación (en caso de que el selector de color esté un poco apagado, use el argumento de distancia):fuente