Emacsでカーソルの下のフォントフェイスを取得する


96

私は独自のカスタムカラーテーマを開発しており、カーソルの下のテキストに影響を与えるフォントフェースのリストを取得できれば非常に便利です。

Textmateのshow current scopeコマンドのようなもの。

これにより、Mx Customize-Faceを実行したり、利用可能なオプションを調べたりして、現在使用している単語にどれが影響するかを推測する手間が省けます。

何か案は?


マウスカーソルを使用して同じ機能を探している場合(たとえば、point問題のテキストにアクセスできない場合
Braham Snyder

回答:


42

what-face次のコードで定義できます。

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

その後、

M-x what-face

現在のポイントで見つかった顔を印刷します。

(組み込みではないことを指摘してくれたthedzに感謝しwhat-faceます。)


3
これは、テキストプロパティとして設定された面を無視します。有効にhl-line-modeするとhl-line、顔としてのみ表示され、他の顔は表示されません。gist.github.com/Wilfred/f7d61b7cdf9fdbb1d11cを
Wilfred Hughes

2
カールフォーゲルは、このコードのバグを別の回答で指摘しました。出力メッセージは、posパラメーターで顔を説明していると言いますが、実際の顔の読み取りはで行わ(point)posます。
Rory O'Kane

これは機能しません。代わりに「Mx describe-face」を使用できます。
luochen1990 2018年

1
pos関数ではありません。オーダースニペットを動作させるには、あなたは交換する必要があります(pos)pos3行目と4行目に
cebola

172

what-cursor-position プレフィックス引数を指定すると、他の情報とともに、アンダーフェイスが表示されます。

キーボードショートカットはCu Cx =

出力例(faceプロパティは最後の段落に示されています):

             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
を起動しますwhat-cursor-position
viam0Zah 2009

うーん、時にはwhat-c​​ursor-positionを呼び出したり、バッファーのプロパティ(フォントを含む)のリストを表示したりすることがあります。前者の動作が得られた場合、カーソルを移動して繰り返すと後者が表示されます。
davidA 2010

2
私はこれを見つけてうれしく思います。コマンドとキーストロークのいくつかの未知の組み合わせで、emacs気に入った方法を表示し、次回の再起動でそれを取り戻す方法はありませんでした
Miserable Variable

2
Emacs GUIでフォント名を表示します。端末では、Emacsはフォントの設定に責任を負わないため、そのような情報はC-u C-x =、端末で実行されているEmacsでそうした場合は利用できませんemacs -nw file.txt
フェルナンドバッソ2018年

67

MX記述面


5
これには、カーソルの下の顔をすぐにカスタマイズできるようにする素敵なリンクも含まれています
dolzenko '25

2
ほとんどの場合、これでうまくいきますが、理由がわからない場合があるため、探している顔がわからない場合があります。たとえば、eshellでは、ANSIカラーがある場合、「デフォルト」とだけ表示されます。
Samuel Edwin Ward

2
これにより、何かを入力できるプロンプトが表示されます。カーソルの下のフォントを説明するために、何を入力する必要がありますか?
Zelphir Kaltstahl 2017年

1
これは、org-modeでコードブロックフォントをカスタマイズするのに役立ちました。@Zelphir、少なくとも私の場合、プロンプトの前のテキストは顔を示していました。あなたはちょうどヒットするかもしれませんreturn。たとえば、私の結果は次のとおりDescribe face (default ‘org-block-background’): です。
マロリーエリック

8

トレイの顔は正しい方向に向かっています。それは私にこれを持っているメーリングリストの電子メールに導きました:

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

ええと、Emacsにバンドルされていなかったことを忘れていました。属性付きの回答にソースを入れてもよいですか?:)
トレイジャクソン

2

「what-face」コードにバグがあります。関数は引数として「pos」を受け取りますが、顔を取得するときにそれを使用しません。代わりに「(point)」を使用しますが、メッセージは後でposを要求します「%dに顔がありません」の場合。


2
これは、その回答に対するコメントとして配置するのが適切です。
Adam Spiers

1
それが修正されていればさらに良い...とにかくそれを見つけるための+1
rath
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.