Answers:
.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很难维护。
我的方法很简单,将所有代码放在一个〜/ .custom.el中。
基本上,代码将在prog-mode-hook(或您的主要模式-hook)中运行,并执行以下操作:
我已经成功使用这种方法一年了。
这是代码(在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
。可能是同事想要这个主意吗?