回答:
.dir-locals.el
特に、そのプロジェクトで作業しているすべてのEmacsユーザーに適用されるため、可能であれば、私の推奨する方法です。
Emacsユーザーに敵対的.dir-locals.el
であるか、ファイルを必要としないプロジェクト、または他の人に適用すべきではない個人的な設定(おそらくインデントではない)が必要な場合、分散バージョン管理システムを使用する場合、オプションは常にあなたの個人的なブランチで動作するように.dir-locals.el
。ただし、これを簡単にするDCVSの使用方法はわかりません。
別のオプションは、.dir-locals.el
ファイルをチェックインしないことです。たとえば、gitを使用してに追加し.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や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")
他の言語モードにも同様のマクロがあります。
.dir-locals.elを異なるプロジェクトに配布するのは維持が困難です。
私の方法は非常に簡単で、すべてのコードを1つの〜/ .custom.elに入れます。
基本的に、コードはprog-mode-hook(またはyour-whatever-major-mode-hook)で実行され、次のことを行います。
私はこの方法を1年間正常に使用しています。
コードは次のとおりです(prog-mode-hookでmy-setup-develop-environmentを呼び出します)。
(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)
guess-style.elを使用します。
ファイルの優先インデントスタイルを推測するのに非常に役立ちます。
.dir-locals.el
。同僚がこの考えを好むかもしれませんか?