Obtenez la police de caractères sous le curseur dans Emacs

96

J'ai développé mon propre thème de couleurs personnalisé, et ce serait vraiment utile si je pouvais obtenir une liste des polices de caractères affectant le texte sous le curseur.

Quelque chose comme la commande show current scope de Textmate.

Cela m'éviterait la peine de personnaliser le visage de Mx et de parcourir les options disponibles, de deviner laquelle affecte le mot actuel sur lequel je suis.

Des idées?

thedz
la source
Si vous recherchez la même fonctionnalité en utilisant le curseur de la souris (si, par exemple, vous ne pouvez pas accéder pointau texte en question), voir: emacs.stackexchange.com/a/35449/13444
Braham Snyder

Réponses:

42

Vous pouvez définir what-faceavec ce code:

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

Après ça,

M-x what-face

imprimera le visage trouvé au point courant.

(Merci à thedz d' avoir signalé que ce what-facen'était pas intégré.)

Trey Jackson
la source
3
Cela ignore les faces définies comme propriétés de texte. Si cette option hl-line-modeest activée, vous ne verrez hl-lineque le visage, pas les autres faces. Considérez gist.github.com/Wilfred/f7d61b7cdf9fdbb1d11c
Wilfred Hughes
2
Karl Fogel a signalé un bogue dans ce code dans une réponse séparée : le message de sortie dit qu'il décrit le visage au niveau du posparamètre, mais la lecture du visage se fait en réalité à (point)plutôt qu'à pos.
Rory O'Kane
Cela ne fonctionne pas, vous pouvez utiliser "Mx describe-face" à la place.
luochen1990
2
posn'est pas une fonction; pour que l'extrait de code fonctionne, vous devez le remplacer (pos)par posaux lignes 3 et 4
cebola
172

what-cursor-position avec un argument de préfixe montre la face sous le point, entre autres informations.

Le raccourci clavier est Cu Cx =

Exemple de sortie (la propriété face est indiquée dans le dernier paragraphe):

             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]
jlf
la source
11
Ce qui invoque what-cursor-position.
viam0Zah
hmmm, parfois il invoque what-cursor-position, parfois il affiche une liste de propriétés de tampon (y compris la police). Si j'obtiens le premier comportement, déplacer le curseur et répéter amène le second.
davidA
2
Je suis tellement heureux d'avoir trouvé cela, avec quelques combinaisons inconnues de commandes et de frappes au clavier, j'ai pu emacsafficher comment je l'aimais et ne pas comment le récupérer lors de mon prochain redémarrage
Variable misérable
2
Il montre le nom de la police sur l'interface graphique d'Emacs. Sur le terminal, Emacs n'est pas responsable du paramétrage de la police et donc de telles informations ne sont pas disponibles quand on le fait C-u C-x =dans Emacs fonctionnant sur le terminal, comme emacs -nw file.txt.
Fernando Basso
67

Mx décrire-visage

Yoo
la source
5
Cela inclut également le joli lien permettant de personnaliser immédiatement le visage sous le curseur
dolzenko
2
Cela fonctionne bien la plupart du temps, mais parfois pour des raisons que je ne peux pas comprendre, parfois cela ne suggère pas le visage que je recherche. Par exemple, dans eshell, quand il y a une couleur ansi, il dit simplement "par défaut".
Samuel Edwin Ward
2
Cela me montre une invite où je peux entrer quelque chose. Que dois-je saisir pour décrire la police sous le curseur?
Zelphir Kaltstahl
1
Cela a fonctionné pour moi pour personnaliser les polices de bloc de code en mode org. @Zelphir, le texte avant l'invite montrait le visage, du moins dans mon cas. Vous pourriez juste frapper return. Par exemple, mon résultat est lu Describe face (default ‘org-block-background’): .
Mallory-Erik
8

Trey est quel visage est sur la bonne voie. Cela m'a conduit à un e-mail sur une liste de diffusion qui contenait ceci:

(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))))
thedz
la source
Duh, j'ai oublié qu'il n'était pas livré avec Emacs. Puis-je mettre la source dans ma réponse avec attribution? :)
Trey Jackson
2

Il y a un bogue dans le code `what-face ': la fonction prend" pos "comme argument mais ne l'utilise pas pour obtenir le visage - à la place, elle utilise" (point) ", même si le message plus tard revendique pos dans le cas "Pas de visage à% d".

Karl Fogel
la source
2
Ce serait mieux placé comme commentaire sur cette réponse.
Adam Spiers
1
Encore mieux s'il avait un correctif ... +1 pour le repérer quand même
rath