Получить шрифт под курсором в Emacs
Я разрабатывал свою собственную цветовую тему, и было бы очень полезно, если бы я мог получить список граней шрифтов, влияющих на текст под курсором.
Что-то вроде команды show current в Textmate.
Это избавило бы меня от необходимости делать Mx customize-face и просматривать доступные варианты, угадывая, какой из них влияет на текущее слово, на котором я нахожусь.
Есть идеи?
7 ответов
Вы можете определить 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
не был встроен.)
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]
Трей, какое лицо на правильном пути. Это привело меня к электронному письму в списке рассылки, в котором было это:
(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))))
В коде "what-face" есть ошибка: функция принимает "pos" в качестве аргумента, но затем не использует его при получении лица - вместо этого она использует "(point)", даже если в сообщении позже указано pos в случае "Нет лица на%d".
В emacs-lisp
(face-at-point t)
который является то, чтоM-x describe-face
использует.
Я попробовал функцию @tray, но она не сработала, определение @thedz работает:
(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))))
После некоторого исследования я выяснил, почему:
- - функция, возвращающая значение точки в виде целого числа.
-
pos
получает значение, возвращаемое(interactive "d")
который будет положением точки в виде целого числа. -
get-char-property
ожидает позицию, в данном случае заданную функцией(point)
.