2009-02-10 16 views
31

Wie ändern Sie das Standardgesicht, das Emacs verwendet, um Text pro Modus zu stylen?Set Emacs defaut Schriftart Gesicht pro Puffer/Modus

Zum Beispiel sagen, dass ich bereits mit den Gesicht Anpassungen, die ich habe, die eine Standardschriftart mit fester Breite enthalten. In einem bestimmten Modus (z. B. markdown-mode.el) möchte ich jedoch, dass die Standardschriftbreite variabel ist.

Es ist einfach, Header, Links usw. eindeutig für den Markdown-Modus zu gestalten: Setzen Sie den Cursor einfach auf den formatierten Text und M-x describe-face, dann klicken Sie auf den Link, um ihn anzupassen.

Das Standardgesicht ist jedoch das Gesicht, das verwendet wird, wenn kein anderes Gesicht angegeben ist. Es ist also nicht spezifisch für den Markdown-Modus, und wenn es geändert wird, wirkt sich dies auf alle anderen Modi aus.

Welche Magie kann ich in markdown-mode-hook setzen, um die Standardseite für Puffer in diesem Modus zu setzen?

+0

Wenn es eine Variable gibt, die die Standardgesichter steuert, können Sie sie für den aktuellen Puffer nur in einem Hook lokalisieren, der beim Öffnen einer Datei mit Markdown aufgerufen wird. – jfs

+0

Die Frage wird allgemein gestellt, dann wird ein spezifisches Beispiel gemacht und Antworten drehen sich um dieses spezifische Beispiel. Wenn Sie wirklich "** Emacs defaut font face per-mode ** festlegen müssen", siehe [Verwenden einer anderen Schriftart für jeden Hauptmodus - Emacs Stack Exchange] (http://emacs.stackexchange.com/questions/3038/ using-a-different-font-für-jeden-Haupt-Modus/3042 # 3042) –

Antwort

27

Wie wäre es etwa so:

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

Sie können dann passen Sie die variable-pitch Gesicht, und die anderen Gesichter im Puffer wird von dieser an Stelle des Standard Gesicht erben.

Lesen Sie die Dokumentation für buffer-face-mode für weitere Details zur Anpassung. (BufFace wird auch für text-scale-increase und text-scale-decrease verwendet ... sehr nützlich.)

+0

Zu meinem Verständnis erfordert dies Emacs 23, kann weder 'Variable-Pitch-Modus' noch 'Buffer-Face-Modus' in finden Emacs 22. – danielpoe

+1

Wow, Leute benutzen immer noch Emacs 22? – jrockway

+0

Danke, macht den Trick. Wenn ein Puffer jedoch variable Schriftarten verwendet, wird das Scrollen so langsam, dass es unbrauchbar ist. Aber das ist wahrscheinlich nur ein Fehler. –

6

Ich muss eine teilweise Antwort geben, weil dies zu kompliziert ist, um auf der Stelle zu verstehen, und ich schon blies mein Zeitbudget.

Face ist eine Rahmeneigenschaft. Ein Frame kann mehrere Puffer gleichzeitig anzeigen. Mode ist eine Puffereigenschaft. Sie fragen, wie Sie das Gesicht pro Modus variieren können. Kombiniert man all dies, scheint es, dass die Frage nicht eine einzige vollständig korrekte Antwort haben kann.

Sie können die gewünschte Antwort approximieren, wenn Sie annehmen, dass ein bestimmter Rahmen niemals mehr als einen Puffer anzeigen wird. Sie können dies tatsächlich mit etwas wie diesem erreichen, aber modifiziert, um spezielle Anzeige-Regexps und eine Reihe von Regexps zu verwenden, die mit Ihren Markdown-Modus-Puffer-Namen übereinstimmen.

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

Dies ist jedoch wahrscheinlich nicht das, was Sie wollen. Ihre Frage scheint die Gesichtseigenschaften eines einzelnen Frames zu ändern.

Unter der Annahme, dass ein Frame nie mehr als einen Puffer gleichzeitig anzeigt, können Sie versuchen, Switch-to-Buffer zu informieren. Aber das könnte nicht ausreichend niedrig sein und es könnte zu langsam sein. (Ungetestet)

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

Und jetzt meine eigentliche (unvollständige) Antwort ...

Eine bessere, wenn auch komplizierter Ansatz würde Abschlags-Modus anweisen, für alle Regionen ein neues Gesicht zu verwenden, die nicht bereits eine der integrierten Flächen zugewiesen. Sie können ein neues Gesicht mit copy-face erstellen und ihm interessante Eigenschaften mit set-face- * geben.

Ändern Sie die font-lock-defaults von markdown-mode so, dass die standardmäßige font-lock-fontify-regio-Funktion überschrieben wird, wie im Kommentarblock in Zeile 946 von font-lock.el beschrieben, der mit "Fontification functions" beginnt.Sie können sich wahrscheinlich eine sehr leicht modifizierte font-lock-default-fontify-Region verwenden, die unmittelbar nur einen zusätzlichen Schritt tut, nachdem es tut:

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

Der zusätzliche Schritt analysiert die Region ähnlich dem, was font-lock-fontify- Die syntaktische Region macht die Region in "interessante" Subregionen auf. Aber dieses Mal finden Sie Subregionen mit der Standardfläche und die Put-Text-Eigenschaft diese Subregionen für die neue Fläche, die Sie zuvor erstellt haben.

In diesem Sinne fühlt es sich an, als sollte es nur ein paar Zeilen elisp in Ihrer .emacs-Datei sein, plus eine Kopie von font-lock-default-fontify-region, die nur ein kleines diff vom Original hat (call one neue Funktion), plus eine Kopie von font-lock-fartify-syntactic-region und modifiziere sie, um deine Gebote zu erfüllen (der schwierigste Teil).

Eigentlich, wenn Sie "nach" font-lock-fartify-syntactic-Region beraten dann müssen Sie wahrscheinlich nicht einmal font-lock-defaults oder font-lock-default-fontify-region ändern.

+0

Namen und Zeilennummern sprechen mit GNU Emacs 22.3.1. – JeffJ

+0

Oder besorgen Sie sich eine aktuelle Version von emacs und verwenden Sie den buffer-face-mode. – jrockway

+0

Kühl. Aber ich werde wahrscheinlich warten, bis Emacs 23 tatsächlich versendet wird, bevor ich darauf updaten kann. – JeffJ

2

Es ist eigentlich einfach, auch für Emacs Version 22.3.1 ...

versuchen Sie einfach die folgenden Schritte aus:

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

Sie könnten auch eine Definition einer Funktion finden, die leicht die Schriftart eines Puffers bei http://junis.orgfree.com/SetBufferFont.el ändert –

+0

Overlays sind nicht gut, weil sie langsam sind. Sie sind nur dann gut, wenn Sie nicht zu viele gleichzeitig haben ... – alinsoar

5

Die variable-pitch -Mode ist genial. Ich habe es durch diesen Thread herausgefunden. Aber es kann sogar noch mehr genial gemacht werden:

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

Fügen Sie einfach den Modus, den Sie Sans-Serif-Schriften in der Liste wollen.

+0

Der oben genannte Code aktiviert den 'Variable-Pitch-Modus' für alle Modi, die in allen Zeilen mit Ausnahme der letzten aufgezählt sind. –

0

Es gibt einen Block von Code, den ich sehr bequem finde, von EmacsWiki. Der Vorteil hierbei ist, dass Sie nicht nur Schriftart einstellen können, aber bequem konfigurieren :height, :width usw. sowie

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

In Kombination mit load-theme-buffer-local Paket, können Sie auch das Farbthema für den Puffer leicht angeben:

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