Farklı projeler için farklı girinti stilleri


29

Benzersiz girinti stilleri ile birçok C projesinde çalışıyorum. Emacs'ın proje akışındaki proje ağaçlarını .dir-locals.eldosyalarla kirletmeden proje başına girme ayarları yapmalarını nasıl sağlayabilirim ? Projeleri diskteki yollarını kullanarak eşleştirmek istiyorum.


2
EditorConfig yerine nasıl kullanılır .dir-locals.el? İş arkadaşları bu fikri ister mi?
welldan97

Yanıtlar:


21

.dir-locals.el Mümkün olduğunda, özellikle o projede çalışan tüm Emac kullanıcıları için geçerli olduğu için tercih ettiğim yöntem.

Emacs kullanıcılarına düşman olan veya başka şekilde .dir-locals.eldosya istemeyen projeler için veya dağıtılmış bir sürüm kontrol sistemi kullanıyorsanız, başkalarına uygulamaması gereken kişisel tercihler (muhtemelen girinti değil) için her zaman sizin sahip olduğunuz kişisel branşlarda çalışın .dir-locals.el. Ancak bu acısız yapan bir DCVS kullanmanın bir yolunu bilmiyorum.

Diğer bir seçenek de .dir-locals.eldosyaları kontrol etmemek . Örneğin, git ile ekleyin .git/info/exclude. Tabii ki, bir projeden birçok ödeme yaptığınız zaman acı verici olur.

.dir-locals.elBir seçeneğin olmadığı yerlerde yaptığım , buffer-file-namebilinen değerlere benzeyen bir kanca eklemek .

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

(Uyarı: şu anda gerçek koduma erişemediğim için doğrudan tarayıcımın içine yazılan kod.)


2
Eklemek .dir-locals.eliçin .git/info/excludeiyi bir seçenek gibi görünüyor.
shosti

.gitignoreBir projenin kök dizinine eklemenin nesi yanlış ?
Squidly

@ Hiçbir şey, ancak bazı projeler orada editöre özel dosyalar istemiyor.
Gilles 'SO- kötülük'

Git kullanıcıları .dir-locals.eliçin adresindeki global gitignore adresinize ekleyebilirsiniz ~/.config/git/ignore.
Jeremy Heiler

7

Llvm ve linux gibi yukarı yöndeki projeleri kontrol etmek için ikna edemezsiniz .dir-locals.el.

Soruna ayrıntılı bir çözüm:

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

Aşağıdaki gibi kullanılır:

(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")

Diğer dil modları için de benzer bir makroya sahibim.


6

.dir-locals.el 'in farklı projelere dağıtılması çok zordur.

Benim yöntemim oldukça basittir, tüm kodu bir ~ / .custom.el dosyasına koyun.

Temel olarak, kod prog-mode-hook'da (ya da her neyse-major-mode-hook'unda) çalıştırılacak ve aşağıdakileri yapacaktır:

  • tam dosya yolunun belirli proje adını içerip içermediğini analiz etme
  • true ise o projenin kurulumunu yapın (girintiyi düzeltmek dahil).

Bu yöntemi bir yıldır başarıyla kullanıyorum.

İşte kod (prog-mode-hook-kurulum-geliştirme-ortamını çağır):

(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

Bunu yapmanın normal yolu kullanıyor .dir-locals. Bu yüzden ilk etapta tanıtıldılar. Neden olmasın? Bildiğim kadarıyla, projeyle ilgili araçların çoğu yapılandırmalarını kök proje dizininde tutma eğilimindedir: git, svn, Eclipse ve diğerleri ...

Sadece dosyayı .gitignoreveya benzeri eklemeyi unutmayın .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.