プロジェクトごとに異なるインデントスタイル


29

独自のインデントスタイルを持つさまざまなCプロジェクトに取り組んでいます。上流のプロジェクトツリーを.dir-locals.elファイルで汚染することなく、Emacsでプロジェクトごとのインデント設定を行うにはどうすればよいですか?ディスク上のパスを使用してプロジェクトを一致させたい。


2
ではなくEditorConfigを使用してください.dir-locals.el。同僚がこの考えを好むかもしれませんか?
welldan97 14

回答:


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 14

.gitignoreプロジェクトのルートに追加すると何が問題になりますか?
イカ14年

@Nothing。ただし、一部のプロジェクトでは、エディター固有のファイルを必要としません。
ジル 'SO-悪であるのをやめる'

gitユーザーの場合.dir-locals.el、でグローバルgitignoreに追加できます~/.config/git/ignore
ジェレミーハイラー

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を異なるプロジェクトに配布するのは維持が困難です。

私の方法は非常に簡単で、すべてのコードを1つの〜/ .custom.elに入れます。

基本的に、コードはprog-mode-hook(またはyour-whatever-major-mode-hook)で実行され、次のことを行います。

  • ファイルのフルパスに特定のプロジェクト名が含まれているかどうかを分析します
  • trueの場合、そのプロジェクトの設定を行います(インデントの調整を含む)。

私はこの方法を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)

2

それを行う通常の方法はを使用することです.dir-locals。これが最初に導入された理由です。何故なの?私の知る限り、プロジェクト関連のツールのほとんどは、ルートプロジェクトディレクトリに設定を保持する傾向があります:git、svn、Eclipseなど

ファイルを追加することを忘れないでください.gitignore


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.