Phong cách thụt đầu dòng khác nhau cho các dự án khác nhau


29

Tôi làm việc trên nhiều dự án C khác nhau với các kiểu thụt độc đáo. Làm cách nào để có được Emacs thực hiện cài đặt thụt đầu dòng cho mỗi dự án mà không làm ô nhiễm các cây dự án ngược dòng với .dir-locals.elcác tệp? Tôi muốn khớp các dự án bằng cách sử dụng đường dẫn của chúng trên đĩa.


2
Làm thế nào về việc sử dụng EditorConfig thay vì .dir-locals.el. Có thể là đồng nghiệp muốn ý tưởng này?
welldan97

Câu trả lời:


21

.dir-locals.el là phương pháp ưa thích của tôi khi có thể, đặc biệt là khi áp dụng cho tất cả người dùng Emacs làm việc trong dự án đó.

Đối với các dự án thù địch với người dùng Emacs hoặc nếu không muốn có .dir-locals.eltệp hoặc nếu bạn muốn có sở thích cá nhân (có lẽ không phải là thụt lề) không nên áp dụng cho người khác, nếu bạn sử dụng hệ thống kiểm soát phiên bản phân tán, tùy chọn là để luôn luôn làm việc trên các chi nhánh cá nhân có của bạn .dir-locals.el. Tuy nhiên, tôi không biết cách sử dụng DCVS khiến điều này không gây đau đớn.

Một lựa chọn khác là không kiểm tra trong các .dir-locals.eltập tin. Ví dụ, với git, thêm nó vào .git/info/exclude. Điều đó thật đau đớn khi bạn có nhiều kiểm tra của một dự án, tất nhiên.

Những gì tôi đã làm khi .dir-locals.elkhông phải là một tùy chọn là thêm một cái móc tìm kiếm buffer-file-namecác giá trị đã biết.

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

(Cảnh báo: mã được nhập trực tiếp vào trình duyệt của tôi vì tôi không có quyền truy cập vào mã thực của mình ngay bây giờ.)


2
Thêm .dir-locals.elvào .git/info/excludecó vẻ như là một lựa chọn tốt.
shosti

Có gì sai khi thêm nó .gitignorevào thư mục gốc của một dự án?
Mực

@Nellow, nhưng một số dự án không muốn các tệp dành riêng cho biên tập viên ở đó.
Gilles 'SO- ngừng trở nên xấu xa'

Đối với người dùng git, bạn có thể thêm .dir-locals.elvào gitignore toàn cầu của mình tại ~/.config/git/ignore.
Jeremy Heiler

7

Bạn không thể thuyết phục các dự án ngược dòng như llvm và linux để kiểm tra .dir-locals.el.

Một giải pháp phức tạp cho vấn đề:

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

Được sử dụng như sau:

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

Tôi cũng có một macro tương tự cho các chế độ ngôn ngữ khác.


6

phân phối .dir-locals.el trong các dự án khác nhau rất khó để duy trì.

Cách của tôi khá đơn giản, hãy đặt tất cả mã vào một ~ / .custom.el.

Về cơ bản, mã sẽ được chạy trong prog-mode-hook (hoặc your-anything-Major-mode-hook) và thực hiện các thao tác sau:

  • phân tích xem đường dẫn đầy đủ của tệp có chứa tên dự án cụ thể không
  • nếu đúng thì thực hiện thiết lập cho dự án đó (bao gồm cả điều chỉnh thụt lề).

Tôi đã sử dụng thành công phương pháp này trong một năm.

Đây là mã (gọi my-setup-Develop-môi trường trong 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)

2

Cách thông thường để làm điều đó là sử dụng .dir-locals. Đây là lý do tại sao họ đã được giới thiệu ở nơi đầu tiên. Tại sao không? Theo hiểu biết của tôi, hầu hết các công cụ liên quan đến dự án có xu hướng giữ các cấu hình của chúng trong thư mục dự án gốc: git, svn, Eclipse và nhiều công cụ khác

Chỉ cần đừng quên thêm tập tin vào .gitignorehoặc tương tự.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.