Подтвердить что ты не робот

Установите Emacs defaut font face per-buffer/mode

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

(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 default face after switch-to-buffer"
  (doSomethingToChangePropertiesOfDefaultFace))

И теперь для моего фактического (неполного) ответа...

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

Это действительно просто даже для версии emacs версии 22.3.1...

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

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

Ответ 5

Существует блок кода, который мне очень удобен, из 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)))