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

StackOverflow https://stackoverflow.com/questions/534307

Вопрос

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

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

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

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

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

Это было полезно?

Решение

Как насчет чего-то вроде этого:

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

Измените font-lock-defaults в markdown-mode, чтобы переопределить функцию font-lock-fontify-region-function по умолчанию, как описано в блоке комментариев рядом со строкой 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-syntactically-region, разбивая регион на "интересные" субрегионы.Но на этот раз вы находите субрегионы, у которых есть грань по умолчанию, и вы добавляете-text-property эти субрегионы к новой грани, которую вы ранее создали.

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

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

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

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

На самом деле это просто даже для emacs версии 22.3.1…

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

(progn 
  (set-buffer "your buffer name here")
  (overlay-put (make-overlay 0 (buffer-size)) 'face 'your-face))

Есть блок кода, который я нахожу очень удобным, из 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)))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top