Установить Emacs по умолчанию для шрифта для каждого буфера / режима - PullRequest
33 голосов
/ 11 февраля 2009

Как вы изменяете грань по умолчанию, которую Emacs использует для стилизации текста для каждого режима?

Например, скажем, что я уже доволен моими настройками лица, которые включают в себя шрифт фиксированной ширины по умолчанию. Однако в одном конкретном режиме (скажем, markdown-mode.el) я хочу, чтобы шрифт по умолчанию был переменной ширины.

Простые стили заголовков, ссылок и т. Д. Уникальны для режима уценки: просто поместите курсор на стилизованный текст и M-x describe-face, затем щелкните ссылку, чтобы настроить его.

Тем не менее, гранью по умолчанию является грань, используемая, если не указано другое лицо, поэтому она не относится к режиму уценки и при изменении повлияет на все остальные режимы.

Какую магию можно вставить в markdown-mode-hook, чтобы установить грань по умолчанию для буферов, использующих этот режим?

Ответы [ 5 ]

30 голосов
/ 11 февраля 2009

Как насчет этого:

(add-hook 'markdown-mode-hook (lambda () (variable-pitch-mode t))

Затем вы можете настроить грань variable-pitch, и другие грани в буфере будут наследоваться от нее вместо грани по умолчанию.

Прочтите документы для buffer-face-mode для получения более подробной информации. (BufFace также используется для text-scale-increase и text-scale-decrease ... очень полезно.)

6 голосов
/ 11 февраля 2009

Я должен дать частичный ответ, потому что это слишком сложно, чтобы разобраться на месте, и я уже испортил свой бюджет времени.

Face - это свойство кадра. Кадр может отображать несколько буферов одновременно. Режим является буферным свойством. Вы спрашиваете, как изменить лицо в зависимости от режима. Объединяя все это, кажется, что вопрос не может иметь ни одного полностью правильного ответа.

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

(append special-display-buffer-names
        '("*VC-log*"
          "*Help*"
          ("*Completions*" 
           (height . 25)
           (font . "8x13"))))

Однако, это, вероятно, не то, что вы хотите. Похоже, ваш вопрос подразумевает изменение свойств лица одного кадра.

Опять же, предполагая, что кадр никогда не будет отображать более одного буфера за раз, вы можете попробовать рекомендовать переключение в буфер. Но это может быть не достаточно низкий уровень и он может быть слишком медленным. (Непроверенные)

(defadvice switch-to-buffer (after switch-to-buffer activate compile)
  "change the frame's default face after switch-to-buffer"
  (doSomethingToChangePropertiesOfDefaultFace))

А теперь мой фактический (неполный) ответ ...

Более лучший, хотя и более сложный, подход дал бы указание режиму уценки использовать новое лицо для всех регионов, которым еще не назначена одна из встроенных поверхностей. Вы можете создать новое лицо с помощью copy-face и придать ему интересные свойства с помощью set-face- *.

Измените font-lock-defaults в markdown-mode, чтобы переопределить функцию font-lock-fontify-region-default по умолчанию, как описано в блоке комментариев рядом со строкой 946 файла font-lock.el, который начинается "Функции Fontification". Вы, вероятно, можете использовать очень немного измененный font-lock-default-fontify-region, который сразу после этого делает только один дополнительный шаг:

  (unless font-lock-keywords-only
    (font-lock-fontify-syntactically-region beg end loudly))

Дополнительный шаг анализирует регион, аналогичный тому, что делает font-lock-fontify-syntaxically-region, разбивая область на «интересные» подрегионы. Но на этот раз вы найдете субрегионы с гранью по умолчанию и поместите свойство text для этих субрегионов на новую грань, которую вы ранее создали.

Во всем этом создается впечатление, что в вашем файле .emacs должна быть всего пара строк elisp, плюс сделайте копию font-lock-default-fontify-region, которая имеет только незначительный diff из оригинала (вызовите один новый функция), а также сделайте копию font-lock-fontify-syntaxically-region и измените ее для выполнения ваших ставок (самая сложная часть).

На самом деле, если вы «после» посоветуете font-lock-fontify-syntaxically-region, то вам, вероятно, даже не нужно изменять font-lock-defaults или font-lock-default-fontify-region.

5 голосов
/ 21 сентября 2010

Режим variable-pitch потрясающий. Я узнал об этом через эту ветку. Но это можно сделать еще более удивительным:

(dolist (hook '(erc-mode-hook
        LaTeX-mode-hook
        org-mode-hook
        edit-server-start-hook
        markdown-mode-hook))
  (add-hook hook (lambda () (variable-pitch-mode t))))

Просто добавьте в список любой режим, в котором вы хотите использовать шрифты без засечек.

2 голосов
/ 14 января 2010

Это на самом деле просто, даже для emacs версии 22.3.1…

Просто попробуйте следующее:

(progn 
  (set-buffer "your buffer name here")
  (overlay-put (make-overlay 0 (buffer-size)) 'face 'your-face))
0 голосов
/ 24 мая 2015

Есть блок кода, который я считаю очень удобным, из EmacsWiki. Преимущество этого заключается в том, что вы можете установить не только шрифт, но и удобно настроить :height, :width и т. Д.

;; Use variable width font faces in current buffer
(defun my-buffer-face-mode-variable ()
  "Set font to a variable width (proportional) fonts in current buffer"
  (interactive)
  (setq buffer-face-mode-face '(:family "DejaVu Sans" :height 100 :width semi-condensed))
  (buffer-face-mode))
;; Use monospaced font faces in current buffer
(defun my-buffer-face-mode-fixed ()
  "Sets a fixed width (monospace) font in current buffer"
  (interactive)
  (setq buffer-face-mode-face '(:family "Consolas" :height 100))
  (buffer-face-mode))
;; Set default font faces for Info and ERC modes
(add-hook 'erc-mode-hook 'my-buffer-face-mode-variable)
(add-hook 'Info-mode-hook 'my-buffer-face-mode-variable)

В сочетании с пакетом load-theme-buffer-local вы даже можете легко указать цветовую тему для буфера:

(defun my-buffer-face-mode-variable ()
  "Set font to a variable width (proportional) fonts in current buffer"
  (interactive)
  (setq buffer-face-mode-face '(:family "DejaVu Sans" :height 100 :width semi-condensed))
  (buffer-face-mode)
  (load-theme-buffer-local 'leuven (current-buffer)))
...