Ottieni il tipo di carattere sotto il cursore in Emacs


96

Ho sviluppato il mio tema colore personalizzato e sarebbe davvero utile se potessi ottenere un elenco di caratteri che influenzano il testo sotto il cursore.

Qualcosa come il comando show current scope di Textmate.

Ciò mi eviterebbe la fatica di personalizzare il viso di Mx e guardare attraverso le opzioni disponibili, indovinando quale influisce sulla parola corrente su cui mi trovo.

Qualche idea?


Nel caso in cui stai cercando la stessa funzionalità utilizzando il cursore del mouse (se, ad esempio, non riesci a ottenere pointil testo in questione), vedi: emacs.stackexchange.com/a/35449/13444
Braham Snyder

Risposte:


42

Puoi definire what-facecon questo codice:

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

Dopo di che,

M-x what-face

stamperà il volto trovato nel punto corrente.

(Grazie a thedz per aver sottolineato che what-facenon era integrato.)


3
Questo ignora le facce impostate come proprietà del testo. Se abilitato hl-line-mode, vedrai solo hl-linela faccia, non le altre facce. Considera gist.github.com/Wilfred/f7d61b7cdf9fdbb1d11c
Wilfred Hughes

2
Karl Fogel ha evidenziato un bug in questo codice in una risposta separata : il messaggio di output dice che sta descrivendo la faccia nel posparametro, ma la lettura della faccia viene effettivamente eseguita in (point)piuttosto che in pos.
Rory O'Kane

Questo non funziona, puoi usare invece "Mx description-face".
luochen1990

2
posnon è una funzione; per far funzionare lo snippet, sostituire (pos)con possulle righe 3 e 4
cebola

172

what-cursor-position con un argomento prefisso mostra la faccia sotto il punto, tra le altre informazioni.

La scorciatoia da tastiera è Cu Cx =

Output di esempio (la proprietà face è mostrata nell'ultimo paragrafo):

             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]

11
Che invoca what-cursor-position.
viam0Zah

hmmm, a volte invoca what-cursor-position, a volte mostra un elenco di proprietà del buffer (incluso il font). Se ottengo il primo comportamento, spostando il cursore e ripetendo si attiva il secondo.
davidA

2
Sono così felice di averlo trovato, con alcune combinazioni sconosciute dei comandi e delle sequenze di tasti ho avuto modo emacsdi mostrare come mi piaceva e non ho saputo come recuperarlo al mio prossimo riavvio
Miserable Variable

2
Mostra il nome del font sulla GUI di Emacs. Sul terminale, Emacs non è responsabile dell'impostazione del carattere e quindi tali informazioni non sono disponibili quando lo si fa C-u C-x =in Emacs in esecuzione sul terminale, come emacs -nw file.txt.
Fernando Basso

67

Mx descrivere-faccia


5
Questo include anche il simpatico link che rende possibile personalizzare immediatamente la faccia sotto il cursore
dolzenko

2
Funziona bene la maggior parte delle volte, ma a volte per motivi che non riesco a capire a volte non suggerisce il viso che sto cercando. Ad esempio in eshell quando c'è un colore ansi dice solo "default".
Samuel Edwin Ward

2
Questo mi mostra un prompt in cui posso inserire qualcosa. Cosa dovrei inserire per descrivere il carattere sotto il cursore?
Zelphir Kaltstahl

1
Questo ha funzionato per me per personalizzare i caratteri del blocco di codice in modalità organizzazione. @Zelphir, il testo prima del prompt mostrava il volto, almeno nel mio caso. Potresti semplicemente colpire return. Ad esempio il mio risultato letto Describe face (default ‘org-block-background’): .
Mallory-Erik

8

La faccia di Trey è sulla strada giusta. Mi ha portato a un'e-mail su una mailing list che aveva questo:

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

Duh, ho dimenticato che non era in bundle con Emacs. Posso inserire la fonte nella mia risposta con l'attribuzione? :)
Trey Jackson,

2

C'è un bug nel codice "what-face": la funzione accetta "pos" come argomento ma poi non lo usa quando ottiene la faccia - invece usa "(point)", anche se il messaggio successivamente afferma pos nel caso "Nessun volto in% d".


2
Sarebbe meglio posizionarlo come commento su quella risposta.
Adam Spires

1
Ancora meglio se avesse una correzione ... +1 per averlo individuato comunque
rath
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.