ฉันทำงานในโครงการ C ที่แตกต่างกันด้วยสไตล์การเยื้องที่ไม่ซ้ำใคร ฉันจะให้ Emacs ทำการตั้งค่าการเยื้องต่อโปรเจ็กต์ได้อย่างไรโดยไม่สร้างมลพิษให้กับแผนผังต้นน้ำโครงการด้วย.dir-locals.el
ไฟล์ ฉันต้องการจับคู่โครงการโดยใช้เส้นทางของพวกเขาบนดิสก์
ฉันทำงานในโครงการ C ที่แตกต่างกันด้วยสไตล์การเยื้องที่ไม่ซ้ำใคร ฉันจะให้ Emacs ทำการตั้งค่าการเยื้องต่อโปรเจ็กต์ได้อย่างไรโดยไม่สร้างมลพิษให้กับแผนผังต้นน้ำโครงการด้วย.dir-locals.el
ไฟล์ ฉันต้องการจับคู่โครงการโดยใช้เส้นทางของพวกเขาบนดิสก์
คำตอบ:
.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)
(คำเตือน: พิมพ์รหัสลงในเบราว์เซอร์ของฉันโดยตรงเนื่องจากฉันไม่สามารถเข้าถึงรหัสจริงได้ในขณะนี้)
.dir-locals.el
ไปยัง.git/info/exclude
ดูเหมือนเป็นตัวเลือกที่ดี
.gitignore
ในรูทของโครงการ
.dir-locals.el
การ gitignore ~/.config/git/ignore
ทั่วโลกของคุณที่
คุณไม่สามารถโน้มน้าวให้โครงการต้นน้ำเช่น 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")
ฉันมีมาโครที่คล้ายกันสำหรับโหมดภาษาอื่นเช่นกัน
การกระจาย. 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)
.dir-locals
วิธีปกติที่จะทำคือการใช้ นี่คือเหตุผลที่พวกเขาได้รับการแนะนำในตอนแรก ทำไมไม่ ตามความรู้ของฉันเครื่องมือที่เกี่ยวข้องกับโครงการส่วนใหญ่มักจะเก็บค่าไว้ในไดเรกทอรีโครงการราก: git, svn, Eclipse และอื่น ๆ อีกมากมาย ...
อย่าลืมเพิ่มไฟล์ลงไป.gitignore
หรือคล้ายกัน
ฉันใช้เดา style.el
มันค่อนข้างดีในการคาดเดาสไตล์การเยื้องที่ต้องการของไฟล์
.dir-locals.el
แทน อาจเป็นเพื่อนร่วมงานที่ต้องการความคิดนี้ไหม