विभिन्न परियोजनाओं के लिए अलग-अलग इंडेंटेशन शैलियों


29

मैं अद्वितीय इंडेंटेशन शैलियों के साथ कई अलग-अलग सी परियोजनाओं पर काम करता हूं। .dir-locals.elफ़ाइलों के साथ अपस्ट्रीम प्रोजेक्ट ट्री को प्रदूषित किए बिना मुझे प्रति प्रोजेक्ट इंडेंटेशन सेटिंग्स करने के लिए Emacs कैसे मिलते हैं ? मैं डिस्क पर अपने रास्तों का उपयोग करके परियोजनाओं का मिलान करना चाहता हूं।


2
इसके बजाय EditorConfig का उपयोग कैसे करें .dir-locals.el। क्या सहकर्मी इस विचार को पसंद कर सकते हैं?
वेल्लडेन 97

जवाबों:


21

.dir-locals.el यह संभव होने पर मेरा पसंदीदा तरीका है, विशेष रूप से यह उस परियोजना पर काम करने वाले सभी Emacs उपयोगकर्ताओं पर लागू होता है।

उन परियोजनाओं के लिए जो Emacs उपयोगकर्ताओं के लिए शत्रुतापूर्ण हैं या अन्यथा .dir-locals.elफाइलें नहीं चाहते हैं , या यदि आप व्यक्तिगत प्राथमिकताएं (संभवतः इंडेंटेशन नहीं) चाहते हैं, जो अन्य लोगों पर लागू नहीं होनी चाहिए, यदि आप एक वितरित संस्करण नियंत्रण प्रणाली का उपयोग करते हैं, तो एक विकल्प है हमेशा उन व्यक्तिगत शाखाओं पर काम करने के लिए जो आपके पास हैं .dir-locals.el। मैं एक डीसीवीएस का उपयोग करने का तरीका नहीं जानता, जो इस दर्द रहित बनाता है।

एक अन्य विकल्प .dir-locals.elफाइलों में जांच नहीं करना है। उदाहरण के लिए, गिट के साथ, इसे जोड़ें .git/info/exclude। यह दर्दनाक है जब आपके पास किसी परियोजना के कई चेकआउट होते हैं, निश्चित रूप से।

मैंने जो किया है .dir-locals.elवह एक विकल्प नहीं था एक हुक जोड़ने के लिए जो buffer-file-nameज्ञात मूल्यों के खिलाफ दिखता है ।

(defvar guessed-project nil)
(make-variable-buffer-local 'guessed-project)
(defun guess-project-from-file-name ()
  (save-match-data
    (setq guessed-project
          (cond
           ((string-match "/linux-kernel/" buffer-file-name)
            'linux-kernel)
           ((string-match "/gnu/" buffer-file-name)
            'gnu)
           ; etc.
          ))))
(defun c-my-project-hook ()
  (guess-project-from-file-name)
  (case guessed-project
    ((gnu) (c-sty-style 'gnu))
    ((linux-kernel) (c-sty-style 'linux))
  ))
(add-hook 'c-mode-hook 'c-my-project-hook)

(चेतावनी: कोड मेरे ब्राउज़र में सीधे टाइप किया जाता है क्योंकि मेरे पास अभी अपने वास्तविक कोड तक पहुंच नहीं है।)


2
एक अच्छा विकल्प की तरह जोड़ने के .dir-locals.elलिए .git/info/exclude
21

.gitignoreकिसी प्रोजेक्ट की जड़ में इसे जोड़ने में क्या गलत है ?
स्क्वीली

@ सुखद, लेकिन कुछ परियोजनाएं वहां संपादक-विशिष्ट फ़ाइलें नहीं चाहती हैं।
गाइल्स का SO- दुष्ट होना बंद हो '

Git उपयोगकर्ताओं के लिए, आप .dir-locals.elअपने वैश्विक gitignore में जोड़ सकते हैं ~/.config/git/ignore
जेरेमी हेइलर

7

आप एक में जाँच करने के लिए llvm और linux जैसी अपस्ट्रीम परियोजनाओं को नहीं मना सकते .dir-locals.el

समस्या का विस्तृत समाधान:

(defmacro define-new-c-style (name derived-from style-alist match-path)
  `(progn
     (c-add-style ,name
                  '(,derived-from ,@style-alist))
     (add-hook 'c-mode-hook
               (lambda ()
                 (let ((filename (buffer-file-name)))
                   (when (and filename
                              (string-match (expand-file-name ,match-path) filename))
                     (c-set-style ,name)))))))

निम्नानुसार उपयोग किया जाता है:

(define-new-c-style "llvm" "gnu" ((fill-column . 80)
                                  (c++-indent-level . 2)
                                  (c-offsets-alist . ((innamespace 0))))
  "~/src/llvm")

(define-new-c-style "emacs" "gnu" nil "~/src/emacs")

मेरे पास अन्य भाषा मोड के लिए भी समान मैक्रो है।


6

विभिन्न परियोजनाओं में .dir-locals.el को वितरित करना मुश्किल है।

मेरा तरीका बहुत सरल है, सभी कोड एक ~ / .custom.el में डालें।

मूल रूप से, कोड को प्रोग-मोड-हुक (या आपके जो भी-प्रमुख-मोड-हुक) में चलाया जाएगा और निम्नलिखित कार्य करेंगे:

  • विश्लेषण करें कि क्या फ़ाइल के पूर्ण पथ में विशिष्ट परियोजना का नाम है
  • अगर सही है तो उस प्रोजेक्ट के लिए सेटअप करें (इंडेंट को ट्वीक करने सहित)।

मैं एक वर्ष से इस पद्धति का सफलतापूर्वक उपयोग कर रहा हूं।

यहाँ कोड है (कॉल-माई-सेटअप-डेवलप-एनवायर्नमेंट इन प्रोग-मोड-हुक):

(defun my-project-name-contains-substring (REGEX)
  (let ((dir (if (buffer-file-name)
                 (file-name-directory (buffer-file-name))
               "")))
    (string-match-p REGEX dir)))

(defun my-office-code-style ()
  (interactive)
  (message "Office code style!")
  ;; web development
  (setq coffee-tab-width 4)
  (setq javascript-indent-level 4)
  (setq js-indent-level 4)
  (setq js2-basic-offset 4)
  (setq web-mode-indent-style 4)
  (setq web-mode-markup-indent-offset 4)
  (setq web-mode-css-indent-offset 4)
  (setq web-mode-code-indent-offset 4)
  )

(defun my-personal-code-style ()
  (interactive)
  (message "My personal code style!")
  (setq coffee-tab-width 4)
  (setq javascript-indent-level 2)
  (setq js-indent-level 2)
  (setq js2-basic-offset 2)
  (setq web-mode-indent-style 2)
  (setq web-mode-markup-indent-offset 2)
  (setq web-mode-css-indent-offset 2)
  (setq web-mode-code-indent-offset 2)
  )

(defun my-setup-develop-environment ()
  (interactive)
  (cond
   ;; company's project for ttag
   ((my-project-name-contains-substring "commerical-proj1")
    (my-office-code-style))
   ((my-project-name-contains-substring "hobby-proj1")
    (my-personal-code-style))
  )
)
(add-hook 'prog-mode-hook 'my-setup-develop-environment)

2

इसे करने का सामान्य तरीका है .dir-locals। यही कारण है कि उन्हें पहली जगह में पेश किया गया था। क्यों नहीं? मेरी जानकारी के लिए, परियोजना से जुड़े अधिकांश उपकरण रूट प्रोजेक्ट निर्देशिका में अपने कॉन्फिग को बनाए रखने के लिए हैं: git, svn, Eclipse और कई अन्य ...

बस फ़ाइल को .gitignoreया इसी तरह जोड़ना न भूलें ।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.