2009-02-10 15 views
31

Comment modifier le visage par défaut qu'Emacs utilise pour styliser le texte par mode? Par exemple, disons que je suis déjà satisfait des personnalisations de visage que j'ai, qui incluent une police à largeur fixe par défaut. Cependant, dans un mode particulier (markdown-mode.el, par exemple), je veux que la police par défaut soit de largeur variable.Définir la police de caractères par défaut d'Emacs par tampon/mode

Il est facile de styliser les en-têtes, les liens, etc. uniquement pour le mode markdown: placez simplement le curseur sur le texte stylé et M-x describe-face, puis cliquez sur le lien pour le personnaliser. Cependant, la face par défaut est la face utilisée si aucune autre face n'est spécifiée. Elle n'est donc pas spécifique au mode markdown et, si elle est modifiée, affectera tous les autres modes.

Quelle magie puis-je mettre dans le markdown-mode-hook pour définir la face par défaut pour les tampons utilisant ce mode?

+0

S'il existe une variable qui contrôle les faces par défaut, vous pouvez la localiser pour le tampon courant uniquement dans un crochet qui est appelé lors de l'ouverture d'un fichier w/démarque. – jfs

+0

La question est posée de manière générale, puis un exemple spécifique est fait et les réponses tournent autour de cet exemple spécifique. Si vous avez vraiment besoin de "** Définir la police de caractères par défaut d'Emacs **", voir [Utiliser une police différente pour chaque mode majeur - Emacs Stack Exchange] (http://emacs.stackexchange.com/questions/3038/ en utilisant-a-different-font-pour-chaque-majeur-mode/3042 # 3042) –

Répondre

27

Que diriez-vous quelque chose comme ceci:

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

Vous pouvez alors personnaliser le visage variable-pitch, et les autres faces du tampon hériterez de ce lieu du visage par défaut.

Lisez les documents pour buffer-face-mode pour plus de détails de personnalisation. (BufFace est également utilisé pour text-scale-increase et text-scale-decrease ... très utile.)

+0

Pour ma compréhension ceci exige Emacs 23, ne peut pas trouver ni 'variable-pitch-mode' ni' buffer-face-mode' dans Emacs 22. – danielpoe

+1

Wow, les gens utilisent encore Emacs 22? – jrockway

+0

Merci, fait l'affaire. Cependant, lorsqu'un tampon utilise des polices à pas variable, le défilement devient tellement lent qu'il est inutilisable. Mais c'est probablement juste un bug. –

6

Je dois donner une réponse partielle parce que c'est trop compliqué à comprendre sur place et j'ai déjà perdu mon budget temps.

Face est une propriété de cadre. Un cadre peut afficher plusieurs tampons en même temps. Mode est une propriété de tampon. Vous demandez comment faire varier le visage sur une base par mode. En combinant tout cela, il semble que la question ne peut pas avoir une seule réponse entièrement correcte.

Vous pouvez approximer la réponse souhaitée si vous supposez qu'une trame donnée n'affichera jamais plus d'un tampon. Vous pouvez réellement accomplir cela avec quelque chose comme ceci, mais modifié pour utiliser special-display-regexps et un ensemble de regexps qui correspondent à vos noms de tampons en mode markdown.

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

Cependant, ce n'est probablement pas ce que vous voulez. Votre question semble impliquer de changer les propriétés du visage d'une seule image.

Encore une fois en supposant qu'une trame ne montrera jamais plus d'un tampon à la fois, vous pouvez essayer de conseiller le passage à la mémoire tampon. Mais cela pourrait ne pas être suffisamment bas et cela pourrait être trop lent. (Non testé)

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

Et maintenant ma réelle (incomplète) réponse ...

Une meilleure, bien plus complexe, approche des instructions démarquage mode d'utiliser un nouveau visage pour toutes les régions qui ne sont pas déjà attribué l'un des visages intégrés. Vous pouvez créer un nouveau visage avec copier-face et lui donner des propriétés intéressantes avec set-face- *.

Modifier les paramètres par défaut de la fonction markdown-lock pour remplacer la fonction par défaut font-lock-fontify-region comme décrit dans le bloc de commentaire près de la ligne 946 de font-lock.el qui commence par "Fonctions de fontification".Vous pouvez probablement utiliser une police-lock-default-fontifier région très légèrement modifiée qui fait juste une étape supplémentaire immédiatement après le fait:

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

L'étape supplémentaire parse la région similaire à ce que font-lock-fontify- de façon syntaxique, en divisant la région en sous-régions "intéressantes". Mais cette fois, vous trouvez des sous-régions qui ont la face par défaut et vous mettez la propriété text-text de ces sous-régions sur la nouvelle face que vous avez précédemment créée. Dans tout cela, il semble qu'il ne devrait y avoir que quelques lignes d'elisp dans votre fichier .emacs, plus faire une copie de font-lock-default-fontify-region qui n'a qu'une différence mineure par rapport à l'original (appelez un nouvelle fonction), plus faire une copie de font-lock-fontify-syntaxiquement-region et le modifier pour faire votre enchère (la partie la plus difficile). En fait, si vous "après" conseille font-lock-fontify-syntaxiquement-region alors vous n'avez probablement même pas besoin de modifier font-lock-defaults ou font-lock-default-fontify-region.

+0

Les noms et les numéros de ligne parlent à GNU Emacs 22.3.1. – JeffJ

+0

Ou juste obtenir une version récente d'emacs et utiliser le mode de face-à-face. – jrockway

+0

Cool. Mais j'attendrai probablement qu'emacs 23 soit effectivement expédié avant d'être mis à jour. – JeffJ

2

Il est en fait simple même pour la version 22.3.1 emacs ...

juste les opérations suivantes:

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

vous pouvez également trouver une définition d'une fonction qui change facilement la police d'un tampon à http://junis.orgfree.com/SetBufferFont.el –

+0

les superpositions ne sont pas bonnes, car elles sont lentes. ils ne sont bons que si vous n'en avez pas trop en même temps ... – alinsoar

5

Le variable-pitch -mode est impressionnant. Je l'ai découvert à travers ce fil. Mais il peut être encore plus impressionnant:

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

ajouter juste ce mode vous voulez polices sans empattement dans la liste.

+0

Ce que fait le code ci-dessus est d'activer 'variable-pitch-mode' pour tous les modes énumérés dans toutes les lignes sauf la dernière. –

0

Il y a un bloc de code que je trouve très pratique, d'EmacsWiki. L'avantage est que vous pouvez définir non seulement font face, mais facilement configurer :height, :width etc ainsi

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

Combiné avec load-theme-buffer-local package, vous pouvez même spécifier le thème de la couleur pour le tampon facilement:

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