2009-02-10 1 views
31

Как вы измените грань по умолчанию, которую Emacs использует для стилизации текста в режиме в режиме?Установить Emacs defaut font face per-buffer/mode

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

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

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

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

+0

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

+0

Вопрос задается в общем виде, затем приводится конкретный пример, и ответы повторяются вокруг этого конкретного примера. Если вам действительно нужно «** Установить шрифт Emacs defaut font per-mode **», см. [Использование другого шрифта для каждого основного режима - Emacs Stack Exchange] (http://emacs.stackexchange.com/questions/3038/ using-a-different-font-for-each-major-mode/3042 # 3042) –

ответ

27

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

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

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

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

+0

Насколько я понимаю, для этого требуется Emacs 23, не может найти ни режим переменной-pitch-mode, ни 'buffer-face-mode' в Emacs 22. – danielpoe

+1

Ничего себе, люди все еще используют Emacs 22? – jrockway

+0

Спасибо, трюк. Однако, когда буфер использует шрифты с изменяемым шагом, прокрутка становится настолько медленной, что она непригодна для использования. Но это, наверное, просто ошибка. – 2009-02-18 20:51:01

6

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

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

Вы можете приблизить желаемый ответ, если предположите, что данный кадр никогда не отображает более одного буфера. Вы можете на самом деле выполнить это с помощью чего-то подобного, но модифицировать, чтобы использовать специальные-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's default face after switch-to-buffer" 
    (doSomethingToChangePropertiesOfDefaultFace)) 

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

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

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

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

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

В целом это похоже на то, что в вашем файле .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.

+0

Имена и номера строк соответствуют GNU emacs 22.3.1. – JeffJ

+0

Или просто получите последнюю версию emacs и используйте буфер-граничный режим. – jrockway

+0

Прохладный. Но я, вероятно, доживу до того, как emacs 23 отправится перед обновлением. – JeffJ

2

Это на самом деле просто даже для Emacs версии 22.3.1 ...

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

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

вы также можете найти определение функции, которая легко изменяет шрифт буфера на http://junis.orgfree.com/SetBufferFont.el –

+0

Наложения не очень хорошие, потому что они медленные. они хороши только в том случае, если у вас слишком много в одно и то же время ... – alinsoar

5

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

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

+0

Что делает вышеприведенный код, так это включить 'переменный шаг-режим' для всех режимов, перечисленных во всех строках, кроме последнего. –

0

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