ऑटो-मोड-एलिस्ट का सम्मान करने के लिए बफ़र्स (केवल फाइलें नहीं) कैसे प्राप्त करें?


13

प्रश्न: मैं मानचित्रण का सम्मान करने के लिए नए बफ़र्स कैसे प्राप्त कर सकता हूं auto-mode-alist?

फ़ाइल ढूंढते समय , Emacs फ़ाइल एक्सटेंशन की तुलना यह auto-mode-alistनिर्धारित करने के लिए करता है कि फ़ाइल के बफर के लिए किस प्रमुख मोड का उपयोग किया जाए। क्या auto-mode-alistएक बफर के लिए मोड का निर्धारण करने के लिए जानकारी का उपयोग करने का एक तरीका है जो (अभी तक) इसके साथ जुड़ी हुई फ़ाइल नहीं है?

वह यह है: यदि मैं एक नया बफर खोलता हूं, जिसका नाम कुछ ऐसा है जो फ़ाइल एक्सटेंशन की तरह दिखता है, तो क्या मैं इसे अपेक्षित मोड में स्वचालित रूप से खोलने के लिए प्राप्त कर सकता हूं? उदाहरण के लिए, अगर मुझे एक नया बफर खोलना था जो a-new-buffer.elअभी तक किसी फ़ाइल से जुड़ा नहीं है, तो मैं चाहता हूं कि यह emacs-lisp-modeडिफ़ॉल्ट मोड के बजाय खुल जाए ।


2
बस जिज्ञासु: क्या उपयोग मामला है? IOW, क्यों / कब / किस-किस संदर्भ में आप ऐसा करना चाहते हैं? आमतौर पर, अगर आप चाहते हैं एक बफर एक फ़ाइल से संबद्ध करने के लिए किया जा और इतने से अपने मोड लेने auto-mode-alist, आप बफर बनाने के " यात्रा " फ़ाइल (और है कि सब कुछ का ख्याल रखता है)।
आकर्षित किया

5
मेरे लिए विशिष्ट उपयोग के मामलों के उदाहरण हैं: ए) orgमैं उपयोग करने के लिए लिख रहा हूं नए कार्यों का परीक्षण करने के लिए एक अस्थायी बफर org-mode; बी) Rकुछ त्वरित, फेंक-दूर सांख्यिकीय जोड़तोड़ करने के लिए एक अस्थायी बफर; ग) एक ईमेल लिखने के लिए एक अस्थायी पाठ बफर। प्रत्येक मामले में, मैं यात्रा करने के लिए एक फ़ाइल नहीं बनाना चाहता, मैं बस एक फेंक-दूर बफर चाहता हूं जो फिर भी उपयुक्त मोड में खुलता है।
दान

2
जैसे फ़ाइल का दौरा आदेशों C-x C-fकरते नहीं " यात्रा करने के लिए एक फ़ाइल बनाने के "। यह एक बुनियादी गलतफहमी है। वे बस वही करते हैं जो आप खोज रहे हैं। यह तभी होता है जब आप बफर को सहेजने की कोशिश करते हैं जो एक फ़ाइल बन जाती है। यदि आप बफ़र को सहेजने का प्रयास नहीं करते हैं, तो कोई फ़ाइल नहीं बनाई गई है। आप जो चाहते हैं, जो मैं अब तक समझता हूं, वह है "एक फ़ाइल पर जाएं" (जिसका वास्तव में उचित मोड में एक बफर खोलने का मतलब है)।
आकर्षित किया

8
डैन की तरह, मैं हर समय अस्थायी बफ़र्स बनाता हूं जो मुझे एक वास्तविक फ़ाइल पथ से संबद्ध नहीं चाहिए। एक फर्जी फ़ाइल पथ पर जाने से काम चल जाएगा, लेकिन एक निर्देशिका चुनने (या वर्तमान को स्वीकार करने) में कम से कम घर्षण होता है। आपके अन्य कॉन्फ़िगरेशन के आधार पर अन्य दुष्प्रभाव हो सकते हैं: ऑटो-सेव व्यवहार? इबफ़र समूह या पथ द्वारा निर्धारित प्रोजेक्टाइल प्रोजेक्ट? पक्षियों की पुष्टि का संकेत? चूँकि बफ़र्स को वैसे भी एक नाम रखना होता है, इसलिए अस्थायी बफर के लिए मोड को स्वचालित रूप से सेट करने के लिए नाम का उपयोग करना मेरे लिए समझ में आता है।
ग्लूकोज

@ आकर्षित, हाँ, इससे समझ में आता है और इस सवाल का सबसे सरल जवाब होगा - क्या आप इसे उत्तर के रूप में पोस्ट कर सकते हैं, कृपया? यह एक उन्नयन के योग्य है।
दान

जवाबों:


8

फाइल विजिटिंग कमांड जैसे कि विजिट करने के लिए C-x C-f फाइल न बनाएं । वे वही करते हैं जो आप ढूंढ रहे हैं।

यह तभी होता है जब आप बफर को सहेजने की कोशिश करते हैं जो एक फ़ाइल बन जाती है

यदि आप बफ़र को सहेजने का प्रयास नहीं करते हैं, तो कोई फ़ाइल नहीं बनाई गई है। आप जो चाहते हैं, जो मैं अब तक समझता हूं, वह है " एक फ़ाइल पर जाएं " (जिसका वास्तव में उचित मोड में एक बफर खोलने का मतलब है)।


4
क्या होगा अगर आपके पास एक हाइपरएक्टिव उंगली है जो लगातार फ़ाइल को हर 3 सेकंड में बचाता है चाहे आप क्या चाहते हैं?
मालाबार

1
@ मलबारबा: दरअसल, मेरे पास वह उंगली है! ;-) शायद हम में से ज्यादातर पुराने मौसा करते हैं - एक आदत वापस ले ली जब चीजें हर समय दुर्घटनाग्रस्त हो जाती हैं। लेकिन फिर भी, मैं सिर्फ वही करता हूं जो मैंने सुझाया था: फेंक-दूर की गई विज़िट-फ़ाइल बफर में संपादित करें। अगर मेरी ओवरएक्टिव मांसपेशी मेमोरी रास्ते में मिल जाती है और बचाने की कोशिश की जाती है, तो ऐसा ही हो: या तो मैं nबचाने के लिए नहीं मारा या (अक्सर) मैं बस बफर को बचाता हूं। और बाद में मैं बनाई गई फ़ाइल को टॉस करता हूं ... या नहीं।)
ड्रू

1
@ मलबार्बा यह बिल्कुल अस्थायी फ़ाइलों की अव्यवस्था को रोकने के लिए है, कि मैंने प्रमुख-मोड विशिष्ट खरोंच बफ़र्स का उपयोग करना शुरू कर दिया है। यदि स्क्रैच एक फाइल के योग्य है, तो आप हमेशा उसे बाद में सहेज सकते हैं।
कौशल मोदी

1
@kaushalmodi: अपने मोड विशेष बफ़र्स के खिलाफ कुछ भी नहीं है, लेकिन एक " अस्थायी फ़ाइलों की अव्यवस्था " के रूप में आसानी से एक के रूप में साफ किया जाता है बफ़र्स की अव्यवस्था । ;-) और एक मोड-विशिष्ट स्क्रैच बफर में हाइपरएक्टिव उंगली एक ही समस्या प्रस्तुत करती है, संभवतः - जैसा कि यह उसी में होता है *scratch*: आपको उस उंगली को स्वचालित रूप से हिट होने पर बचाने के लिए संकेत दिया जाता है C-x C-s
आकर्षित किया

9

अगर वर्षों से जूरी लिंकोव के समाधान का उपयोग कर रहे हैं।

मैं कुछ के साथ अस्थायी बफ़र्स बनाएँ C-x b test.org C-j। के major-modeमाध्यम से फ़ाइल एक्सटेंशन द्वारा निर्धारित किया जाता है auto-mode-alist

;; http://thread.gmane.org/gmane.emacs.devel/115520/focus=115794
(setq-default major-mode
              (lambda () (if buffer-file-name
                          (fundamental-mode)
                            (let ((buffer-file-name (buffer-name)))
                          (set-auto-mode)))))

प्रभाव का परीक्षण करने के लिए आप कोशिश कर सकते हैं (prog1 (and (switch-to-buffer "my-new.org") major-mode) (kill-buffer "my-new.org")) => org-mode। एक साफ emacs -qमें परीक्षण वापस आ जाएगी fundamental-mode


1
यह बहुत चालाक है! यह adviceमेरे द्वारा उपयोग किए जा रहे विकल्प की तुलना में अधिक स्पष्ट है । यकीन नहीं है कि मैं (prog1...)भाग के लिए क्या कर रहा हूं , लेकिन यह (setq-default major-mode ...)हिस्सा काफी अच्छा है।
दान

1
Juri की Emacs साइट देखने के लिए स्वतंत्र महसूस करें । prog1टेस्ट सिर्फ शो है कि आप पाने की उम्मीद major-modeहै जब एक बफर का उपयोग करने जा। setq-defaultभाग का मूल्यांकन करें और परीक्षण चलाएं। यह org-mode बिना setq-defaultलौटे वापस आ जाएगी fundamental-mode
रासमस

यह मेरे बफर-लिस्ट-अपडेट-हुक की तुलना में अधिक सुरुचिपूर्ण है। धन्यवाद!
ग्लूकास

यह स्वीकृत उत्तर होना चाहिए, क्योंकि यह वास्तव में हमें यह बताने के बजाय सवाल का जवाब देता है कि हम इसे पूछने के लिए गलत क्यों हैं :)
श्लोमी

6

@ ड्रू की टिप्पणियों और @ ग्लूकास के उत्तर से आए विचारों का उपयोग करके एक सलाह-आधारित तरीका पता लगाया, जो मैं यहां रिकॉर्ड करूंगा कि वे किसी के लिए उपयोगी हैं।

संक्षिप्त संस्करण: afterक्वेरी के लिए सलाह का उपयोग करें कि क्या बफर में एक संबद्ध फ़ाइल नाम है, एक अस्थायी रूप से सेट करें यदि यह नहीं है, और फिर बाकी set-auto-modeमशीनरी विवरणों का ध्यान रखें। थोड़ा परीक्षण (व्यापक नहीं) के बाद, यह ठीक काम करने लगता है।

के लिए ido-switch-bufferऔर वेनिला switch-to-buffer, सलाह के दो टुकड़े हो जाएगा:

(defadvice ido-switch-buffer (after set-mode activate)
  (unless buffer-file-name
    (let ((buffer-file-name (buffer-name)))
      (set-auto-mode t))))

(defadvice switch-to-buffer (after set-mode activate)
  (unless buffer-file-name
    (let ((buffer-file-name (buffer-name)))
      (set-auto-mode t))))

मुझे यह विकल्प उस find-fileबिंदु के ऊपर मददगार लगता है, जो @ ने उठाया क्योंकि मेरी उंगलियां मेरे मस्तिष्क से आगे निकल सकती हैं: मांसपेशियों की स्मृति अक्सर मुझे स्विच-टू-बफर क्षेत्र में मिल जाएगी, इससे पहले कि यह पूरी तरह से मेरे find-fileपास हो जाए जो मुझे चाहिए। अब, दोनों विकल्प उपलब्ध हैं।

अद्यतन: उपरोक्त कोड में छोटी लेकिन संभावित रूप से परेशान बग: यह हर बार जब आप इसे स्विच करते हैं तो मोड हुक को बफर पर फिर से चलाएगा। निम्नलिखित इसे /tmpनिर्देशिका का वास्तविक फ़ाइल नाम देता है और उस समस्या से बचा जाता है:

(defadvice ido-switch-buffer (after set-mode activate)
  (unless buffer-file-name
    (setq buffer-file-name (concat "/tmp/" (buffer-name)))
    (set-auto-mode t)))

अच्छा लग रहा है, और cruft को साफ करता है मेरा जवाब एक जोड़ी पुनरावृत्तियों पर जमा हुआ था। :-) मैं यहां सिर्फ यह दोहराऊंगा कि यदि आप किसी कारण से वास्तविक फ़ाइल पथ सेट नहीं करना चाहते हैं तो आप कई बार मोड सेट करने से बचने के लिए बफर-लोकल वैरिएबल का उपयोग कर सकते हैं।
ग्लूकोज

5

set-auto-modeसमारोह एक बफर के साथ जुड़े फ़ाइल पर आधारित मोड सेट। यहाँ एक फ़ंक्शन है जो buffer-file-nameमोड सेट करने के लिए बफर नाम से अस्थायी रूप से सेट होता है:

(defun my/set-buffer-mode (buffer &optional again)
  "Set the mode for BUFFER from the name.  
When called repeatedly for the same buffer only set the mode the first
time, unless the optional argument AGAIN is specified.
Does nothing if the buffer is associated with a file."

  (with-current-buffer buffer
    (when again (kill-local-variable 'my/buffer-mode-set))
    (unless (or buffer-file-name 
            (local-variable-p 'my/buffer-mode-set))
      (let ((buffer-file-name (buffer-name)))
        (set-auto-mode t)
        (setq-local my/buffer-mode-set t)))))

आप इसे तब चला सकते हैं जब सलाह का उपयोग करके एक बफर का नाम बदला जाता है:

(defadvice rename-buffer (after my/rename-update-mode activate)
  (my/set-buffer-mode (current-buffer) 'again))

मैं नए बफ़र्स को प्रभावित करने के लिए इसे हुक करने के लिए सबसे अच्छी जगह के बारे में निश्चित नहीं हूं। यहाँ मैं उपयोग कर रहा हूँ buffer-list-update-hook, लेकिन जो हमें जरूरत से ज्यादा मामलों में बुलाया जाता है।

(add-hook 'buffer-list-update-hook
      '(lambda ()
         (my/set-buffer-mode (car (buffer-list)))))

उपरोक्त मुद्दों को कुछ मुद्दों से निपटने के लिए संशोधित किया गया है। विशेष रूप से, मैं उपयोग करने के लिए वापस चला गया हूं buffer-list-update-hookक्योंकि change-major-mode-hookअपेक्षित वर्तमान बफर के साथ नहीं बुलाया जा रहा था। रिकॉर्ड के लिए यह संभवत: आपके स्विच-बफर फ़ंक्शन को सलाह देने के लिए अधिक समझ में आता है जैसा कि @Dan अपने जवाब में करता है।
ग्लूकास

3

आप अस्थायी बफ़र्स बनाने के उद्देश्य से * स्क्रैच * बफ़र्स का उपयोग कर सकते हैं, जिसमें फ़ाइल के समान ही प्रमुख मोड है जिस पर आप काम कर रहे होंगे।

यहाँ एक emacs SE उत्तर है जो आपकी समस्या को हल कर सकता है:

मैं एक ही प्रमुख मोड वाली फाइल और * स्क्रैच * बफर के बीच जल्दी से कैसे टॉगल कर सकता हूं?

संदर्भित प्रश्न और उत्तर दोनों मेरे द्वारा पोस्ट किए गए थे। समारोह में उत्तर निम्नलिखित है:

  • यदि आप किसी फ़ाइल में X प्रमुख मोड में काम कर रहे हैं, तो इस फ़ंक्शन को कॉल करना एक नया स्क्रैच बफर बनाता है, *scratch-X-mode*अगर कोई पहले से मौजूद नहीं है, और इस नए बनाए गए बफर पर स्विच करता है।
  • यदि *scratch-X-mode*पहले से मौजूद है, तो यह बस उस बफर पर स्विच करता है।
  • इस फ़ंक्शन को फिर से कॉल करते समय उस खरोंच बफ़र में आपको उस फ़ाइल बफ़र पर वापस लाया जाएगा जिस पर आप मूल रूप से काम कर रहे थे।

0

यहाँ कुछ अच्छे उत्तर हैं लेकिन मैं एक और बात जोड़ना चाहता था। Emacs में एक टन की विशेषताएं हैं और अक्सर कुछ करने के कई तरीके हैं। आप किसी भी फ़ाइल के शीर्ष पर टैग जोड़ सकते हैं जो emacs को बताती है कि इसका प्रकार क्या है, विस्तार की परवाह किए बिना। उदाहरण के लिए इसे जोड़ना:

# -*-Python-*-

एक फ़ाइल के शीर्ष पर emacs को बताएंगे कि यह .pyएक्सटेंशन के साथ भी पायथन फ़ाइल है । ध्यान दें कि #लाइन की शुरुआत में पायथन शैली की टिप्पणी है। विभिन्न फ़ाइल प्रकारों के लिए आप विभिन्न टिप्पणियों का उपयोग कर सकते हैं। उदाहरण के लिए एक लिस्प फ़ाइल को निर्दिष्ट करने के लिए जिसका उपयोग आप ;एक टिप्पणी लाइन शुरू करने के लिए करते हैं और इस तरह से emacs में मोड सेट करते हैं:

; -*- mode: Lisp;-*-

देखें फ़ाइल चर निर्दिष्ट करना और फ़ाइल मोड का चयन


हां, लेकिन यहां प्रश्न विशेष रूप से एक नया अस्थायी बफर बनाने (उदाहरण के साथ switch-buffer) और मोड को स्वचालित रूप से इसके अलावा किसी अन्य चीज़ पर सेट करने के बारे में है fundamental-mode
ग्लूकास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.