2009-02-10 16 views
31

आप डिफ़ॉल्ट चेहरे को कैसे बदलते हैं जो Emacs प्रति-मोड आधार पर स्टाइल टेक्स्ट में उपयोग करता है?सेट Emacs defaut फ़ॉन्ट फेस प्रति-बफर/मोड

उदाहरण के लिए, कहें कि मैं पहले से ही चेहरे अनुकूलन से खुश हूं, जिसमें एक डिफ़ॉल्ट निश्चित-चौड़ाई फ़ॉन्ट शामिल है। हालांकि, एक विशेष मोड में (markdown-mode.el, कहें), मैं डिफ़ॉल्ट फ़ॉन्ट को चर-चौड़ाई होना चाहता हूं।

मार्कडाउन-मोड के लिए विशिष्ट रूप से स्टाइल हेडर, लिंक इत्यादि के लिए आसान है: बस कर्सर को स्टाइल टेक्स्ट और M-x describe-face पर रखें, फिर इसे अनुकूलित करने के लिए लिंक पर क्लिक करें।

हालांकि, यदि कोई अन्य चेहरा निर्दिष्ट नहीं किया गया है तो डिफ़ॉल्ट चेहरा चेहरा होता है, इसलिए यह मार्कडाउन-मोड के लिए विशिष्ट नहीं है और यदि संशोधित सभी अन्य तरीकों को प्रभावित करेगा।

इस मोड का उपयोग कर बफर के लिए डिफ़ॉल्ट चेहरा सेट करने के लिए markdown-mode-hook में मैं कौन सा जादू डाल सकता हूं?

+0

यदि कोई चर है जो डिफ़ॉल्ट चेहरों को नियंत्रित करता है तो आप इसे वर्तमान बफर के लिए केवल एक हुक में स्थानांतरित कर सकते हैं जिसे फ़ाइल w/markdown खोलते समय बुलाया जा सकता है। – jfs

+0

प्रश्न सामान्य तरीके से पूछा जाता है, फिर एक विशिष्ट उदाहरण बनाया जाता है और उत्तर इस विशिष्ट उदाहरण के आसपास घूमते हैं। यदि आपको वास्तव में "** Emacs defaut फ़ॉन्ट फेस प्रति-मोड ** सेट करने की आवश्यकता है", तो देखें [प्रत्येक प्रमुख मोड के लिए एक अलग फ़ॉन्ट का उपयोग करना - Emacs Stack Exchange] (http://emacs.stackexchange.com/questions/3038/ एक-अलग-फ़ॉन्ट-के-प्रत्येक-प्रमुख-मोड/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 की आवश्यकता है, न तो 'परिवर्तनीय-पिच-मोड' और न ही 'बफर-फेस-मोड' नहीं मिल सकता Emacs 22. – danielpoe

+1

वाह, लोग अभी भी Emacs 22 का उपयोग करते हैं? – jrockway

+0

धन्यवाद, चाल है। हालांकि, जब एक बफर चर-पिच फोंट स्क्रॉलिंग का उपयोग करता है तो इतनी धीमी गति से धीमा हो जाता है कि यह अनुपयोगी है। लेकिन यह शायद सिर्फ एक बग है। –

6

मुझे आंशिक उत्तर देना होगा क्योंकि यह जगह पर पता लगाने के लिए बहुत जटिल है और मैंने अपना समय बजट पहले ही उड़ा दिया है।

चेहरा एक फ्रेम संपत्ति है। एक फ्रेम एक ही समय में एकाधिक बफर प्रदर्शित कर सकता है। मोड एक बफर संपत्ति है। आप पूछते हैं कि प्रति-मोड आधार पर चेहरे को कैसे बदलना है। यह सब जोड़कर, ऐसा लगता है कि प्रश्न में एक पूरी तरह से सही जवाब नहीं हो सकता है।

यदि आप मानते हैं कि दिया गया फ्रेम कभी भी एक से अधिक बफर प्रदर्शित नहीं करेगा, तो आप वांछित उत्तर का अनुमान लगा सकते हैं। आप वास्तव में ऐसा कुछ कर सकते हैं, लेकिन विशेष-प्रदर्शन-रेगेक्सप्स और रेगेक्सप्स का एक सेट जो आपके मार्कडाउन-मोड बफर नाम से मेल खाता है, का उपयोग करने के लिए संशोधित किया गया है।

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

हालांकि, यह शायद आप नहीं चाहते हैं। आपका प्रश्न एक फ्रेम के चेहरे गुणों को बदलने में प्रतीत होता है।

फिर से यह मानते हुए कि एक फ्रेम एक समय में एक से अधिक बफर प्रदर्शित नहीं करेगा, आप स्विच-टू-बफर सलाह देने का प्रयास कर सकते हैं। लेकिन यह पर्याप्त रूप से कम स्तर नहीं हो सकता है और यह बहुत धीमा हो सकता है। (Untested)

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

और अब अपने वास्तविक (अधूरा) जवाब के लिए ...

एक बेहतर, अधिक जटिल हालांकि, दृष्टिकोण सभी क्षेत्रों कि नहीं कर रहे हैं के लिए एक नया चेहरा उपयोग करने के लिए markdown मोड हिदायत होगा पहले से ही अंतर्निर्मित चेहरों में से एक असाइन किया गया है। आप प्रति-चेहरे के साथ एक नया चेहरा बना सकते हैं और इसे सेट-फेस- * के साथ दिलचस्प गुण दे सकते हैं।

डिफ़ॉल्ट फ़ॉन्ट-लॉक-फ़ॉन्टिफ़-क्षेत्र-फ़ंक्शन को ओवरराइड करने के लिए मार्कडाउन-मोड के फ़ॉन्ट-लॉक-डिफॉल्ट को संशोधित करें जैसा कि फ़ॉन्ट-लॉक.एल के लाइन 946 के पास टिप्पणी ब्लॉक में वर्णित है, "फ़ॉन्टिफिकेशन फ़ंक्शंस"।आप शायद एक बहुत थोड़ा संशोधित फ़ॉन्ट-लॉक-default-fontify क्षेत्र उसके बाद यह करता है सिर्फ एक अतिरिक्त कदम तुरंत उपयोग कर सकते हैं:

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

अतिरिक्त कदम क्षेत्र समान पार्स करने के लिए क्या font-लॉक-fontify- वाक्य रचनात्मक रूप से-क्षेत्र करता है, इस क्षेत्र को "रोचक" उप-क्षेत्रों में तोड़ देता है। लेकिन इस बार आपको उप-क्षेत्र मिलते हैं जिनके पास डिफ़ॉल्ट चेहरा होता है और आप उन उप-क्षेत्रों को उस नए-नए क्षेत्र में डालते हैं जो आपने पहले बनाया था।

इन सभी में ऐसा लगता है कि यह आपकी .emacs फ़ाइल में केवल कुछ पंक्तियों की कुरकुरा होनी चाहिए, साथ ही फ़ॉन्ट-लॉक-डिफ़ॉल्ट-फ़ॉन्टिफ़ी-क्षेत्र की एक प्रति बनाएं जिसमें मूल से केवल एक मामूली अंतर है (कॉल करें नया फ़ंक्शन), साथ ही फ़ॉन्ट-लॉक-फ़ॉन्ट-सिंटैक्टिक-क्षेत्र की एक प्रति बनाएं और इसे अपनी बोली-प्रक्रिया (सबसे कठिन हिस्सा) करने के लिए संशोधित करें।

दरअसल, यदि आप "बाद" फ़ॉन्ट-लॉक-फ़ॉन्टिफ़-सिंटैक्टिक-क्षेत्र की सलाह देते हैं तो आपको शायद फ़ॉन्ट-लॉक-डिफ़ॉल्ट या फ़ॉन्ट-लॉक-डिफ़ॉल्ट-फ़ॉन्टिफ़-क्षेत्र को संशोधित करने की आवश्यकता भी नहीं है।

+0

नाम और रेखा संख्या जीएनयू 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 मोड भयानक है। मुझे इस धागे के माध्यम से इसके बारे में पता चला। लेकिन इसे और भी भयानक बनाया जा सकता है:

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