สไตล์การเยื้องที่แตกต่างกันสำหรับโครงการที่แตกต่างกัน


29

ฉันทำงานในโครงการ C ที่แตกต่างกันด้วยสไตล์การเยื้องที่ไม่ซ้ำใคร ฉันจะให้ Emacs ทำการตั้งค่าการเยื้องต่อโปรเจ็กต์ได้อย่างไรโดยไม่สร้างมลพิษให้กับแผนผังต้นน้ำโครงการด้วย.dir-locals.elไฟล์ ฉันต้องการจับคู่โครงการโดยใช้เส้นทางของพวกเขาบนดิสก์


2
วิธีการเกี่ยวกับการใช้EditorConfig.dir-locals.elแทน อาจเป็นเพื่อนร่วมงานที่ต้องการความคิดนี้ไหม
welldan97

คำตอบ:


21

.dir-locals.el เป็นวิธีที่ฉันชอบเมื่อเป็นไปได้โดยเฉพาะอย่างยิ่งมันใช้ได้กับผู้ใช้ Emacs ทุกคนที่ทำงานในโครงการนั้น

สำหรับโครงการที่ไม่เป็นมิตรกับผู้ใช้ Emacs หรือไม่ต้องการ.dir-locals.elไฟล์หรือถ้าคุณต้องการมีการตั้งค่าส่วนตัว (สมมุติว่าไม่เยื้อง) ที่ไม่ควรใช้กับคนอื่น ๆ ถ้าคุณใช้ระบบควบคุมเวอร์ชันแบบกระจายตัวเลือกคือ .dir-locals.elที่มักจะทำงานในสาขาส่วนบุคคลที่มีคุณ ฉันไม่รู้วิธีการใช้ DCVS ที่ทำให้ไม่เจ็บปวดอย่างไรก็ตาม

ตัวเลือกอื่นคือไม่เช็คอิน.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ดูเหมือนเป็นตัวเลือกที่ดี
shosti

เกิดอะไรขึ้นกับการเพิ่มลง.gitignoreในรูทของโครงการ
Squidly

@ ไม่มี แต่บางโครงการไม่ต้องการให้มีไฟล์เฉพาะโปรแกรมแก้ไข
Gilles 'หยุดชั่วร้าย'

สำหรับผู้ใช้คอมไพล์คุณสามารถเพิ่ม.dir-locals.elการ gitignore ~/.config/git/ignoreทั่วโลกของคุณที่
Jeremy Heiler

7

คุณไม่สามารถโน้มน้าวให้โครงการต้นน้ำเช่น LLVM .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

โดยพื้นฐานแล้วโค้ดจะถูกรันใน prog-mode-hook (หรืออะไรก็ตามที่คุณอยู่ในโหมดหลักของ hook) และทำสิ่งต่อไปนี้:

  • วิเคราะห์ว่าเส้นทางแบบเต็มของไฟล์มีชื่อโครงการเฉพาะ
  • ถ้าเป็นจริงให้ทำการตั้งค่าสำหรับโครงการนั้น (รวมถึงการเยื้องการเยื้อง)

ฉันใช้วิธีนี้สำเร็จเป็นเวลาหนึ่งปีแล้ว

นี่คือรหัส (เรียก my-setup-development-environment ใน prog-mode-hook):

(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หรือคล้ายกัน


2

ฉันใช้เดา style.el

มันค่อนข้างดีในการคาดเดาสไตล์การเยื้องที่ต้องการของไฟล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.