Odpowiedzi:
.dir-locals.el
jest moją preferowaną metodą, gdy jest to możliwe, zwłaszcza, że dotyczy wszystkich użytkowników Emacsa pracujących nad tym projektem.
W przypadku projektów, które są wrogie dla użytkowników Emacsa lub w inny sposób nie chcą .dir-locals.el
plików, lub jeśli chcesz mieć osobiste preferencje (prawdopodobnie nie wcięcia), które nie powinny mieć zastosowania do innych osób, jeśli używasz rozproszonego systemu kontroli wersji, opcja jest aby zawsze pracować na osobistych oddziałach, które mają twoje .dir-locals.el
. Jednak nie znam sposobu na użycie DCVS, który sprawia, że jest to bezbolesne.
Inną opcją jest nie rejestrowanie .dir-locals.el
plików. Na przykład za pomocą git dodaj go do .git/info/exclude
. Oczywiście jest to bolesne, gdy masz wiele realizacji projektu.
To, co zrobiłem tam, gdzie .dir-locals.el
nie było opcji, to dodanie haka, który sprawdza buffer-file-name
znane wartości.
(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)
(Ostrzeżenie: kod wpisany bezpośrednio w mojej przeglądarce, ponieważ nie mam teraz dostępu do mojego prawdziwego kodu).
.dir-locals.el
do .git/info/exclude
wydaje się dobrą opcją.
.gitignore
katalogu głównego projektu?
.dir-locals.el
do swojego globalnego gitignore na stronie ~/.config/git/ignore
.
Nie możesz przekonać projektów typu upstream, takich jak llvm i linux, do sprawdzenia w .dir-locals.el
.
Opracowane rozwiązanie problemu:
(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)))))))
Używany w następujący sposób:
(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")
Mam podobne makro dla innych trybów językowych.
rozpowszechnianie .dir-locals.el w różnych projektach jest trudne do utrzymania.
Moja droga jest dość prosta, umieść cały kod w jednym ~ / .custom.el.
Zasadniczo kod będzie uruchamiany w trybie przechwytującym prog-mode (lub w trybie przechwytującym dowolny tryb główny) i wykonuje następujące czynności:
Od roku z powodzeniem stosuję tę metodę.
Oto kod (wywołaj my-setup-develop-environment w prog-mode-hook):
(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)
Normalnym sposobem na to jest użycie .dir-locals
. Właśnie dlatego zostały wprowadzone w pierwszej kolejności. Dlaczego nie? O ile mi wiadomo, większość narzędzi związanych z projektami zazwyczaj utrzymuje swoje konfiguracje w głównym katalogu projektu: git, svn, Eclipse i wiele innych…
Po prostu nie zapomnij dodać pliku .gitignore
lub podobnego.
Używam guess-style.el .
Radzi sobie dobrze z odgadnięciem preferowanego stylu wcięcia pliku.
.dir-locals.el
. Może współpracownicy chcieliby ten pomysł?