프로젝트마다 다른 들여 쓰기 스타일


29

나는 독특한 들여 쓰기 스타일로 많은 다른 C 프로젝트를 작업합니다. Emacs가 .dir-locals.el파일로 업스트림 프로젝트 트리를 오염시키지 않고 프로젝트 별 들여 쓰기 설정을 수행하도록하려면 어떻게해야 합니까? 디스크에서 경로를 사용하여 프로젝트를 일치시키고 싶습니다.


2
대신 EditorConfig 를 사용하는 방법은 무엇입니까 .dir-locals.el? 동료가이 아이디어를 원할 수 있습니까?
welldan97

답변:


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

.gitignore프로젝트 루트에 추가하면 무엇이 문제입니까 ?
Squidly

@Nothing, 그러나 일부 프로젝트는 편집기 특정 파일을 원하지 않습니다.
Gilles 'SO- 악의를 멈춰라

git 사용자의 경우 .dir-locals.el전역 gitignore에 추가 할 수 있습니다 ~/.config/git/ignore.
Jeremy Heiler 2016 년

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 (또는 your-every-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.