एक्सटेंशन के बिना फ़ाइलों के लिए मोड याद रखें


10

मैंने बहुत सारी फ़ाइलों का संपादन शुरू कर दिया है जिनका कोई विस्तार नहीं है, लेकिन अभी भी एक प्रमुख मोड प्रारूप में हैं।

मैं टीम का एकमात्र Emacs उपयोगकर्ता हूं, और मैं इसे स्पष्ट रूप से स्पष्ट नहीं करना चाहता कि मेरे संपादक को विशेष सामग्री की आवश्यकता है। मैं कोडबेस को बदलने से बचना चाहूंगा।

  • मैं फ़ाइल नाम नहीं बदल सकता
  • मैं विशेष Emacs टिप्पणियों का उपयोग नहीं कर सकता

मैं Emacs को याद रखना चाहूँगा कि मैंने जो भी मोड फ़ाइल को मैन्युअल रूप से अंतिम (साथ, कहते हैं M-x conf-mode) में डाल दिया है और जब मैं इसे फिर से देखता हूं तो स्वचालित रूप से उस मोड को सक्रिय कर दूंगा।

मैं savehist-modeदृढ़ता को संभालने के लिए उपयोग करता हूं ।

क्या मैं यह दर्द रहित तरीके से कर सकता हूं?


1
यदि वह फ़ाइल जिसे आप संपादित कर सकते हैं, आम तौर पर आप एक टिप्पणी के साथ पहली पंक्ति जोड़ सकते हैं: # -*- mode: conf -*-और वह Emacs को उपयोग करने के लिए बंद कर देगा conf-mode। यदि उनमें से कुछ हैं, और आप नियमित अभिव्यक्ति के माध्यम से उनका मिलान कर सकते हैं, तो आप regexp को जोड़ सकते हैं automode-alist
wvxvw

2
@wvxvw मेरी सीमाओं में से एक है कि " मैं विशेष Emacs टिप्पणियों का उपयोग नहीं कर सकता "।
पायथनटन

2
आउच, सॉरी, मुझे समझ नहीं आ रहा है कि मैंने कैसे मिस किया है। इसके अलावा, यह auto-mode-alistमेरा बुरा है।
wvxvw

स्पष्ट रूप से सही उत्तर यहाँ Emacs का उपयोग करने के लिए अपनी टीम के बाकी सदस्यों को प्राप्त करना है। कोई अन्य उत्तर सिर्फ एक समाधान है।
मालाबार

जवाबों:


13

फ़ाइल के लिए प्रमुख मोड की पहचान करने के कई तरीके हैं जो किसी एक्सटेंशन पर भरोसा नहीं करते हैं, मैनुअल में फ़ाइल मोड चुनना चुनना देखें ।

आप जिस प्रकार की फ़ाइलों के साथ काम कर रहे हैं, उसके आधार पर, शायद आप इसका उपयोग कर सकते हैं magic-mode-alist। यह भी ध्यान दें कि auto-mode-alistमिलान एक्सटेंशन तक सीमित नहीं है: आप फ़ाइल नाम या पथ के किसी भी भाग से मेल खा सकते हैं।

यदि आप जिन फ़ाइलों के साथ काम कर रहे हैं, वे उन तंत्रों के लिए पर्याप्त रूप से संगत नहीं हैं, तो एक विकल्प auto-mode-alistप्रविष्टियों को जोड़ना है जो पूरे फ़ाइल नाम से मेल खाते हैं, या कुछ प्रोजेक्ट के रूट पथ से मेल खाते हैं और नामों के साथ मोड के लिए एक कस्टम फ़ंक्शन को कॉल करते हैं।

यदि दी गई डायरेक्टरी की सभी फाइलें एक ही प्रकार की हैं तो आप मोड को सेट करने के लिए डायरेक्टरी-लोकल वैरिएबल का भी उपयोग कर सकते हैं। निर्देशिका चर को एक .dir- स्थानीय फ़ाइल के बजाय आपकी init फ़ाइल में सेट किया जा सकता है - विवरण के लिए निर्देशिका चर देखें।

अपडेट करें

यहां निरपेक्ष फ़ाइल नामों और प्रमुख-मोडों के अपने स्वयं के मुट्ठी को प्रबंधित करने का एक त्वरित प्रयास है।

(defvar my-custom-mode-alist '())
(defvar my-custom-mode-alist-file (expand-file-name "custom-file-assoc" user-emacs-directory))

;; command to save the file->mode association of the current buffer
(defun save-file-mode-association ()
  (interactive)
  (when buffer-file-name
    (add-to-list 'my-custom-mode-alist (cons buffer-file-name major-mode))
    (write-custom-mode-alist my-custom-mode-alist-file)))

(defun write-custom-mode-alist (file)
  (with-current-buffer (get-buffer-create " *Custom File Assocations*")
    (goto-char (point-min))
    (delete-region (point-min) (point-max))
    (pp my-custom-mode-alist (current-buffer))
    (condition-case nil
        (write-region (point-min) (point-max) file)
      (file-error (message "Can't write %s" file)))
    (kill-buffer (current-buffer))
    (message "Wrote custom file associations to file %s" file)))

(defun load-custom-mode-alist (file)
  (when (file-exists-p file)
    (with-current-buffer
        (let ((enable-local-variables nil))
          (find-file-noselect file))
      (goto-char (point-min))
      (setq my-custom-mode-alist (read (current-buffer)))
      (setq auto-mode-alist (append auto-mode-alist my-custom-mode-alist))
      (kill-buffer (current-buffer)))))

;; Load any custom file associations and add them to auto-mode-alist
(load-custom-mode-alist my-custom-mode-alist-file)

दुर्भाग्य से, फाइलें बहुत कम स्वरूपित हैं, और उनके पास बहुत सामान्य फ़ाइल नाम हैं। auto-mode-alistयद्यपि की बारीकियों को इंगित करने के लिए धन्यवाद । मैं शायद magic-mode-alistभविष्य में किसी चीज़ के लिए अपने दिमाग को पीछे रखूँगा ।
पायथनटन

4

ग्लूकोस की सलाह के आधार पर निम्नलिखित पूरी तरह से काम करता है।

(defvar file-name-mode-alist '())
;; other stuff here, of course
(setq savehist-additional-variables '(file-name-mode-alist))
(savehist-mode +1)
(setq auto-mode-alist (append auto-mode-alist file-name-mode-alist))

(add-hook 'after-change-major-mode-hook
  (lambda ()
    (when (and
            buffer-file-name
            (not
              (file-name-extension
                buffer-file-name)))
       (setq file-name-mode-alist
        (cons
          (cons buffer-file-name major-mode)
          file-name-mode-alist))
      (setq auto-mode-alist
        (append auto-mode-alist
          (list (cons buffer-file-name major-mode)))))))

1
अच्छा लगा। मेरे द्वारा हैक किए गए एक से अधिक सुरुचिपूर्ण समाधान। :-)
ग्लूकास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.