不同项目的压痕样式不同


29

我从事许多具有独特缩进样式的C项目。如何使Emacs进行每个项目的缩进设置而不污染.dir-locals.el文件的上游项目树?我想使用磁盘上的路径来匹配项目。


2
如何使用EditorConfig而不是.dir-locals.el。可能是同事想要这个主意吗?
welldan97

Answers:


21

.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)

(警告:由于我现在无法访问我的真实代码,因此直接在浏览器中输入了代码。)


2
添加.dir-locals.el.git/info/exclude似乎是一个不错的选择。
shosti 2014年

将其添加到.gitignore项目根目录有什么问题?
2014年

@什么都没有,但是某些项目不希望在其中使用特定于编辑器的文件。
吉尔斯(Gillles)“所以-别再作恶了”

对于git用户,您可以在添加.dir-locals.el到全局gitignore ~/.config/git/ignore
Jeremy Heiler

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中。

基本上,代码将在prog-mode-hook(或您的主要模式-hook)中运行,并执行以下操作:

  • 分析文件的完整路径是否确实包含特定的项目名称
  • 如果为true,则为该项目进行设置(包括调整缩进)。

我已经成功使用这种方法一年了。

这是代码(在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)

2

正常的方法是使用.dir-locals。这就是为什么首先介绍它们的原因。为什么不?据我所知,大多数与项目相关的工具都倾向于将其配置保留在根项目目录中:git,svn,Eclipse等。

只是不要忘记将文件添加到.gitignore或类似文件中。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.