Obtenha a face da fonte sob o cursor no Emacs

96

Estou desenvolvendo meu próprio tema de cores personalizadas e seria muito útil se eu pudesse obter uma lista de fontes que afetam o texto sob o cursor.

Algo como o comando show current scope do Textmate.

Isso me pouparia o trabalho de personalizar Mx e olhar as opções disponíveis, adivinhando qual delas afeta a palavra atual.

Alguma ideia?

thedz
fonte
Caso você esteja procurando a mesma funcionalidade usando o cursor do mouse (se, por exemplo, você não conseguir acessarpoint o texto em questão), consulte: emacs.stackexchange.com/a/35449/13444
Braham Snyder

Respostas:

42

Você pode definir what-facecom 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))))

Depois disso,

M-x what-face

irá imprimir a face encontrada no ponto atual.

(Obrigado ao thedz por apontar que what-facenão foi incorporado.)

Trey Jackson
fonte
3
Isso ignora faces definidas como propriedades de texto. Se habilitado, hl-line-modevocê verá apenas hl-linecomo o rosto, não os outros rostos. Considere gist.github.com/Wilfred/f7d61b7cdf9fdbb1d11c
Wilfred Hughes
2
Karl Fogel apontou um bug neste código em uma resposta separada : a mensagem de saída diz que ele está descrevendo o rosto no posparâmetro, mas a leitura do rosto na verdade é feita em (point)e não em pos.
Rory O'Kane
Isso não funciona, você pode usar "Mx describe-face".
luochen1990
1
posnão é uma função; para fazer o snippet funcionar, você deve substituir (pos)por posnas linhas 3 e 4
cebola
172

what-cursor-position com um argumento de prefixo mostra o rosto sob o ponto, entre outras informações.

O atalho do teclado é Cu Cx =

Exemplo de saída (a propriedade face é mostrada no último parágrafo):

             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]
J se
fonte
11
Que invoca what-cursor-position.
viam0Zah
hmmm, às vezes invoca what-cursor-position, às vezes exibe uma lista de propriedades do buffer (incluindo a fonte). Se eu obtiver o comportamento anterior, mover o cursor e repetir traz o último.
davidA
2
Estou tão feliz por ter encontrado isso, com algumas combinações desconhecidas de comandos e pressionamentos de tecla, consegui emacsmostrar como gostei e não consegui recuperar na minha próxima reinicialização
Variável miserável
2
Ele mostra o nome da fonte na GUI do Emacs. No terminal, o Emacs não é responsável por definir a fonte e, portanto, tais informações não estão disponíveis quando se faz C-u C-x =no Emacs rodando no terminal, como emacs -nw file.txt.
Fernando Basso
67

Mx descrever rosto

Yoo
fonte
5
Isso também inclui o link que torna possível personalizar o rosto sob o cursor imediatamente
dolzenko
2
Isso funciona bem na maioria das vezes, mas às vezes, por motivos que não consigo entender, às vezes não sugere o rosto que procuro. Por exemplo, em eshell, quando há cor ansi, ele apenas diz "padrão".
Samuel Edwin Ward
2
Isso me mostra um prompt onde posso inserir algo. O que eu preciso inserir para descrever a fonte sob o cursor?
Zelphir Kaltstahl,
1
Isso funcionou para mim personalizar as fontes do bloco de código no modo org. @Zelphir, o texto antes do prompt mostrava o rosto, pelo menos no meu caso. Você pode apenas acertar return. Por exemplo, meu resultado lido Describe face (default ‘org-block-background’): .
Mallory-Erik
8

O rosto de Trey está no caminho certo. Isso me levou a um e-mail em uma lista de correspondência que tinha o seguinte:

(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
fonte
Duh, esqueci que não estava junto com o Emacs. Posso colocar a fonte na minha resposta com atribuição? :)
Trey Jackson
2

Há um bug no código `what-face ': a função aceita" pos "como um argumento, mas não o usa ao obter a face - em vez disso, usa" (point) ", embora a mensagem posterior indique pos no caso "Sem rosto em% d".

Karl Fogel
fonte
2
Isso seria melhor colocado como um comentário sobre essa resposta.
Adam Spires
1
Melhor ainda se tivesse uma correção ... +1 para identificá-lo de qualquer maneira
volta de