Voici une façon. Vous devez lier la commande à un événement de souris. Mais si vous utilisez un clic avec le bouton de la souris, vous devrez probablement lier l'événement à l'autre partie du clic (par exemple, vers le bas) ignore
. Ce n'est qu'un exemple - vous ne voudrez peut-être pas gaspiller C-mouse1
une telle commande.
La fonction principale (commande, en fait) est describe-char
. Il décrit le point à une position tampon donnée. Une partie de cette description comprend les propriétés du texte et les superpositions à cette position, et si la propriété en face
fait partie, vous verrez sa valeur.
(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)
Cela pourrait être légèrement meilleur - ce qui précède pourrait ne pas fonctionner dans certains contextes:
(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))))
(Notez aussi que C-x =
c'est lié à what-cursor-position
, qui utilise describe-char
. Donc vous étiez sur la bonne voie avec C-u C-x =
.)
En ce qui concerne Ido: contrairement à Icomplete, qui utilise une superposition, le mode Ido insère du texte dans le mini-tampon. Mais la raison pour laquelle le code ci-dessus ne fonctionne pas sur ce texte est que le mode Ido supprime le texte au début de chaque commande, en utilisant pre-command-hook
. Ainsi, lorsque la commande ci-dessus est exécutée, le texte indiquant les achèvements a déjà été supprimé.
Le code suivant résout ce problème, uniquement pour le mode Ido. Il réinsère le texte montrant les achèvements au début, puis supprime les achèvements à la fin.
(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
est retourné par describe-char. Je suppose que c'est dû au fait que le mini-tampon a été effacé à un moment donné après l'événement. J'ai supposé que'ignore
cela arrêterait cela, mais cela ne se produit pas. Des idées?M-x some-text
,C-mouse-1
sur ce texte dans le mini - tampon.) Vous devez de cliquer cours de la souris à une position qui a le texte. Si vous cliquez après la fin du texte, vous obtenez l'erreur que vous avez mentionnée.Si vous ne pouvez pas placer le point au bon endroit et l'utiliser
C-u C-x =
, cela peut être dû au fait que l'élément pertinent est affiché via la chaîne avant / après d'une superposition, ou parce que cet élément disparaît / change lorsque vous essayez de placer le point dans ou quand vousC-u C-x =
.Vous pouvez essayer d'éviter ces problèmes comme suit:
posn-at-x-y
qui renverra une description de ce qui est à cette coordonnée x / y. Par exemple, s'il s'agit d'un morceau de texte extrait d'une chaîne après / avant, cette chaîne sera mentionnée là-bas (ainsi que la position dans cette chaîne), vous pouvez donc rechercher la propriété face appliquée à cette chaîne à cette position.run-with-timer
vous pouvez exécuter le code toutes les secondes, en imprimant le résultat dans une sorte de tampon de débogage de votre choix.la source
Vous pouvez utiliser le pack up face vers le haut pour créer une représentation textuelle lisible par l'homme d'un texte, avec des informations sur le visage. Par exemple:
Exécutez
M-x faceup-vire-buffer RET
, et ce qui suit est affiché:Les faces standard de verrouillage de police sont représentées en utilisant des noms courts, comme
k
pourfont-lock-keyword-face
, tandis que les faces non standard sont présentées en utilisant leur nom complet.(Faceup est un système de test de régression pour mettre en évidence des packages, par exemple des mots-clés de verrouillage de police, la représentation textuelle est stockée en tant que fichier de référence.)
ÉDITER:
Pour répondre à la question dans le commentaire: "Si j'essaie de déboguer les visages utilisés dans un affichage à mini-tampons, est-ce que cela va me donner des informations?"
Oui. Cependant, vous devez lier la fonction à une clé car son exécution à l'aide de
M-x
ne fonctionnera pas lorsque le mini-tampon est en cours d'utilisation. Par exemple:Si vous par le "mini-tampon" voulait vraiment dire la zone d'écho - c'est-à-dire, vous voudriez inspecter le message actuel dont vous aurez besoin un peu plus. La fonction suivante le fera:
Par exemple, les éléments suivants:
Vous montrera:
la source
Une autre solution pourrait être d'utiliser un sélecteur de couleurs et de fournir la valeur de couleur
list-faces-for-color
définie ci-dessous (dans le cas où le sélecteur de couleurs est un peu décalé, utilisez l'argument distance):la source