Получить начертание шрифта под курсором в Emacs

96

Я разрабатываю свою собственную цветовую тему, и было бы очень полезно, если бы я мог получить список начертаний шрифтов, влияющих на текст под курсором.

Что-то вроде команды Textmate show current scope.

Это избавило бы меня от необходимости выполнять Mx customize-face и просматривать доступные параметры, угадывая, какой из них влияет на текущее слово, которое я использую.

Любые идеи?

Thedz
источник
Если вы ищете ту же функциональность с помощью курсора мыши (если, например, вы не можете перейти pointк рассматриваемому тексту), см .: emacs.stackexchange.com/a/35449/13444
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
Уилфред Хьюз,
2
Карл Фогель указал на ошибку в этом коде в отдельном ответе : в выходном сообщении говорится, что оно описывает лицо в posпараметре, но считывание лица фактически выполняется в, (point)а не в pos.
Рори О'Кейн
1
Это не работает, вместо этого вы можете использовать "Mx description-face".
luochen1990
2
posне функция; в целях сделать сниппет работы, вы должны заменить (pos)с posна линии 3 и 4
cebola
173

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]
jlf
источник
11
Что вызывает what-cursor-position.
viam0Zah
хммм, иногда он вызывает what-cursor-position, иногда отображает список свойств буфера (включая шрифт). Если я получаю первое поведение, перемещение курсора и повторение вызывает второе.
davidA 02
2
Я так счастлив, что нашел это, с некоторыми неизвестными комбинациями команд и нажатий клавиш, которые я должен emacsбыл показать, как мне это понравилось, и не знал, как вернуть его при следующем перезапуске
Miserable Variable
2
Он показывает имя шрифта в графическом интерфейсе пользователя Emacs. На терминале Emacs не отвечает за установку шрифта, и поэтому такая информация недоступна, когда это делается C-u C-x =в Emacs, запущенном на терминале, например emacs -nw file.txt.
Фернандо Бассо
68

Mx description-face

Ю
источник
5
Это также включает в себя красивую ссылку, позволяющую сразу же настроить лицо под курсором
dolzenko
2
В большинстве случаев это работает хорошо, но иногда по причинам, которые я не могу понять, иногда это не указывает на лицо, которое я ищу. Например, в eshell, когда есть цвет ansi, он просто говорит «по умолчанию».
Сэмюэл Эдвин Уорд
2
Это показывает мне подсказку, где я могу что-то ввести. Что мне нужно ввести, чтобы описать шрифт под курсором?
Zelphir Kaltstahl 02
1
Это сработало для меня, чтобы настроить шрифты блока кода в орг-режиме. @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))))
Thedz
источник
Да, забыл, что он не был в комплекте с Emacs. Могу ли я указать источник в своем ответе с указанием авторства? :)
Trey Jackson
2

Там есть ошибка в ` , что-слойный код»: функция принимает „Pos“ в качестве аргумента , но тогда не использовать его при получении лица - вместо этого он использует „(точку)“, даже если сообщение позже утверждает , позы в случае "Нет лица на% d".

Карл Фогель
источник
2
Это было бы лучше поместить в качестве комментария к этому ответу.
Адам Спирс
1
Даже лучше, если бы у него было исправление ... +1 за то, что его все равно заметили
rath