108 votes

Obtenir le visage de la police sous le curseur dans Emacs

J'ai développé mon propre thème de couleurs personnalisé, et il 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 de faire M-x customize-face et de regarder les options disponibles, en devinant laquelle affecte le mot sur lequel je suis.

Des idées ?

0 votes

Si vous souhaitez obtenir la même fonctionnalité en utilisant l'option souris curseur (si, par exemple, vous ne pouvez pas obtenir de point sur le texte en question), voir : emacs.stackexchange.com/a/35449/13444

190voto

jlf Points 1943

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

Le raccourci clavier est C-u C-x =

Exemple de sortie (la propriété de la face est montré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]

12 votes

Qui invoque what-cursor-position .

0 votes

Hmmm, parfois il invoque what-cursor-position, parfois il affiche une liste des propriétés du tampon (y compris la police). Si j'obtiens le premier comportement, le fait de déplacer le curseur et de répéter l'opération fait apparaître le second.

2 votes

Je suis si heureux d'avoir trouvé ceci, avec quelques combinaisons inconnues de commandes et de frappes j'ai obtenu emacs pour montrer comment je l'ai aimé et pas comment le récupérer lors de mon prochain redémarrage.

73voto

Yoo Points 3276

M-x décrire-face

5 votes

Cela inclut également le lien sympathique permettant de personnaliser immédiatement le visage sous le curseur.

3 votes

Cela fonctionne bien la plupart du temps, mais parfois, pour des raisons que je n'arrive pas à comprendre, cela ne suggère pas le visage que je recherche. Par exemple, dans eshell, lorsqu'il y a une couleur ansi, il est simplement indiqué "default".

2 votes

Cela me montre une invite où je peux entrer quelque chose. Que dois-je saisir pour décrire la police de caractères qui se trouve sous le curseur ?

44voto

Trey Jackson Points 49816

Vous pouvez définir what-face avec 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 la face trouvée au point actuel.

(Merci à ledz pour avoir souligné que what-face n'a pas été intégré).

3 votes

Cela ignore les faces définies comme propriétés de texte. Si vous activez hl-line-mode vous ne verrez que hl-line comme le visage, pas les autres visages. Considérons gist.github.com/Wilfred/f7d61b7cdf9fdbb1d11c

2 votes

Karl Fogel a signalé un bug dans ce code dans une réponse séparée le message de sortie dit qu'il décrit le visage au niveau du pos mais la lecture de la face est en fait effectuée au niveau du paramètre (point) plutôt qu'à pos .

1 votes

Cela ne fonctionne pas, vous pouvez utiliser "M-x describe-face" à la place.

8voto

thedz Points 3494

Le visage de Trey est sur la bonne voie. Il m'a conduit à un email sur une liste de diffusion qui avait 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))))

0 votes

Duh, j'ai oublié qu'il n'était pas fourni avec Emacs. Je peux mettre la source dans ma réponse avec l'attribution :)

2voto

Karl Fogel Points 31

Il y a un bug dans le code `what-face' : la fonction prend "pos" comme argument mais ne l'utilise pas pour obtenir la face -- à la place elle utilise "(point)", même si le message qui suit est le suivant demandes d'indemnisation pos dans le cas "No face at %d".

2 votes

Il serait préférable de commenter cette réponse.

1 votes

Encore mieux s'il y avait un correctif... +1 pour l'avoir repéré quand même

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X