Emacs'ta imlecin altındaki yazı tipi yüzünü alın


97

Kendi özel renk temamı geliştiriyordum ve imlecin altındaki metni etkileyen yazı tipi yüzlerinin bir listesini elde edebilseydim gerçekten yararlı olurdu.

Textmate'in geçerli kapsam komutunu göstermesi gibi bir şey.

Bu beni Mx özelleştirme yüzünü yapma ve mevcut seçeneklere bakma, bulunduğum mevcut kelimeyi hangisinin etkilediğini tahmin etme zahmetinden kurtarırdı.

Herhangi bir fikir?


Fare imlecini kullanarak aynı işlevi arıyorsanız (örneğin, pointsöz konusu metne ulaşamıyorsanız
Braham Snyder

Yanıtlar:


42

what-faceBu kod ile tanımlayabilirsiniz :

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

Daha sonra,

M-x what-face

geçerli noktada bulunan yüzü yazdıracaktır.

( Yerleşik olmadığını belirttiği için teşekkür ederiz what-face.)


3
Bu, metin özellikleri olarak ayarlanmış yüzleri yok sayar. Etkinleştirilirse , diğer yüzleri değil, hl-line-modeyalnızca hl-lineyüz olarak göreceksiniz . Düşünün gist.github.com/Wilfred/f7d61b7cdf9fdbb1d11c
Wilfred Hughes

2
Karl Fogel ayrı bir cevapta bu koddaki bir hataya dikkat çekti : çıktı mesajı posparametredeki yüzü tanımladığını söylüyor , ancak yüzün okunması aslında at (point)yerine yapıldı pos.
Rory O'Kane

1
Bu işe yaramaz, bunun yerine "Mx define-face" kullanabilirsiniz.
luochen1990

2
posbir işlev değildir; sırayla pasajı eser, değiştirmek gerekir yapmak (pos)ile poshatlar 3 ve 4
Cebola

176

what-cursor-position önek bağımsız değişkeni, diğer bilgilerin yanı sıra nokta altındaki yüzü gösterir.

Klavye kısayolu Cu Cx =

Örnek çıktı (yüz özelliği son paragrafta gösterilmiştir):

             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
Hangi çağırır what-cursor-position.
viam0Zah

hmmm, bazen what-cursor-position'ı çağırır, bazen de arabellek özelliklerinin bir listesini görüntüler (font dahil). İlk davranışı elde edersem, imleci hareket ettirip tekrarlamak ikincisini getirir.
Davida

2
Bunu bulduğum için çok mutluyum, komutların ve tuş vuruşlarının bazı bilinmeyen kombinasyonları ile emacsonu nasıl sevdiğimi gösterdim ve bir sonraki yeniden başlatmamda nasıl geri alacağımı bilmiyordum
Miserable Variable

2
Emacs GUI üzerindeki yazı tipi adını gösterir. Terminalde, yazı tipini ayarlamaktan Emacs sorumlu değildir ve bu nedenle C-u C-x =, terminalde çalışan Emacs'de olduğu gibi bu tür bilgiler mevcut değildir emacs -nw file.txt.
Fernando Basso

68

Mx yüz tanımla


5
Bu aynı zamanda imlecin altındaki yüzü anında özelleştirmeyi mümkün kılan güzel bağlantıyı da içerir
dolzenko

2
Bu çoğu zaman işe yarıyor, ancak bazen anlayamadığım nedenlerle bazen aradığım yüzü önermiyor. Örneğin eshell'de ansi rengi olduğunda sadece "varsayılan" der.
Samuel Edwin Ward

2
Bu bana bir şey girebileceğim bir bilgi istemi gösteriyor. İmlecin altındaki yazı tipini tanımlamak için ne girmem gerekir?
Zelphir Kaltstahl

1
Bu, org modunda kod bloğu yazı tiplerini özelleştirmek için benim için çalıştı. @ Zelphir, en azından benim durumumda, istemden önceki metin yüzü gösteriyordu. Sadece vurabilirsin return. Örneğin sonucum okundu Describe face (default ‘org-block-background’): .
Mallory-Erik

8

Trey, doğru yolda olan yüzdür. Beni bir posta listesindeki şu e-postaya yönlendirdi:

(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, Emacs ile paketlenmediğini unuttum. Kaynağı atıfla cevabıma ekleyebilir miyim? :)
Trey Jackson

2

`` What-face '' kodunda bir hata var: işlev argüman olarak "pos" u alıyor ancak daha sonra yüzü alırken kullanmıyor - bunun yerine mesaj daha sonra konum iddiasında bulunsa da "(nokta)" kullanıyor "% d'de yüz yok" durumunda.


2
Bu, bu yanıta bir yorum olarak yerleştirilse iyi olur.
Adam Spiers

1
Bir düzeltme olsaydı daha da iyi ... Yine de tespit
ettiğim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.