Sắp xếp nội dung của ~ / .emacs.d / init.el và ~ / emacs.d?


28
  1. Khi chúng tôi thêm ngày càng nhiều dòng vào ~/.emacs.d/init.elcác mục đích khác nhau (cho chế độ python, cho emacs-eclim, cho ...), tệp sẽ trở nên dài và ít đọc hơn. Có cách nào để giúp tổ chức nội dung của nó?
  2. Hiện tại của tôi ~/.emacs.dtrông như thế này

    $ ls *
    init.el
    
    auto-save-list:
    
    elisp:
    python-mode.el-6.1.3
    
    elpa:
    archives        auctex-readme.txt         s-20140910.334
    auctex-11.87.7  emacs-eclim-20140809.207
    
    eshell:
    history
    

    python-mode.el-6.1.3đã được cài đặt thủ công, trong khi emacs-eclim-20140809.207được cài đặt bởi elpavà tôi không chắc chắn 100% rằng những thứ khác ở dưới elpa/elpa. Làm thế nào tôi có thể tổ chức nội dung của ~/.emacs.d/?

Câu trả lời:


32

Những người sử dụng các trình soạn thảo ít hơn muốn chia mã của họ thành nhiều tệp. Nếu bạn đang sử dụng Emacs, không có lý do gì để làm điều đó: chỉ cần sử dụng một tệp lớn duy nhất mà bạn chia thành các phần.

Mỗi phần nên bắt đầu bằng

^L
;;; title of the section

nơi bạn chèn ^Lký tự bằng cách gõ C-q C-l. Sau đó, bạn có thể sử dụng các lệnh như C-x ]( forward-page) hoặc C-x n p( narrow-to-page) để điều hướng qua tệp. Xem Phần 25.4 (Trang) của hướng dẫn sử dụng Emacs để biết thêm.


16
Cũng không có lý do đặc biệt nào để không chia mã thành nhiều tệp. Nó phụ thuộc vào những gì bạn muốn nhóm các công cụ lại với nhau có nghĩa là - bạn muốn nó hành xử như thế nào. Và nó có thể phụ thuộc vào mức độ LỚN lớn như thế nào. Và nó có thể phụ thuộc vào việc các phần mã của bạn có được chia sẻ với người khác hay không, ví dụ như các thư viện.
vẽ

2
Cõng trên nhận xét của @ Drew, người dùng có thể muốn có các cấu hình khác nhau cho các phiên bản và môi trường emacs khác nhau và tải elisp có liên quan tương ứng. Điều đó nói rằng, tôi thích mẹo phân trang.
Harvey

3
@Harvey: Phân trang và sử dụng các tệp riêng biệt là những cách độc lập để tổ chức văn bản. Bạn có thể sử dụng cả hai, rõ ràng. Tôi sử dụng phân trang trong tất cả các thư viện của mình, để tách các phần. Nhưng tôi cũng có thư viện riêng (file).
vẽ

1
@jch Nếu bạn đang sử dụng kiểu này, bạn cũng có thể muốn bật Chế độ nhỏ ngoài đường viền hoặc một tính năng tương tự, để cho phép gấp các phần và chức năng. Gấp tất cả các tiêu đề cấp cao nhất cung cấp cho bạn một cái nhìn tổng quan đẹp về tất cả các phần trong cấu hình Emacs của bạn.
lunaryorn

@lunaryorn, tôi đã thử, nhưng tôi thấy nó gây mất tập trung - Tôi đang tìm thấy các lệnh di chuyển trang đủ thời gian, tôi chỉ thỉnh thoảng cần thu hẹp. Có lẽ tôi .emacs.wlkhông đủ dài.
JCH

20

Một cách cổ điển để làm điều này là chia nhỏ bạn .emacsthành các tệp riêng biệt. Ví dụ: bạn có thể di chuyển tất cả nội dung web của mình vào ~/.emacs.d/web-config.elvà sau đó tải nó vào bên trong init.el:

(load "~/.emacs.d/web-config.el")

Nếu bạn muốn giữ cho mình ngăn ~/.emacs.dnắp hơn một chút, bạn cũng có thể chuyển các tệp cấu hình này vào thư mục riêng của chúng:

(load "~/.emacs.d/config/web.el")

Bây giờ bạn chỉ có thể chuyển đến tệp thích hợp khi thực hiện thay đổi cấu hình của mình.

Một điều còn thiếu ở đây là các biến được đặt thông qua hệ thống tùy chỉnh. Đây sẽ vẫn là tất cả trong init.el. Rõ ràng, có một tiện ích nhỏ gọi là init split cho phép bạn đưa ra các quy tắc về cài đặt tùy chỉnh đi đâu, nhưng tôi chưa bao giờ sử dụng nó. Ngoài ra, hệ thống tùy chỉnh của Wap có thể được cấu hình để sử dụng một tệp riêng cho các sửa đổi của nó đối với cài đặt của bạn. Đặt custom-filebiến để chỉ định vị trí cài đặt và tùy chỉnh cài đặt của các ứng dụng trên mạng .

Theo như thư mục, tôi luôn hài lòng với bố cục mặc định. Thay đổi chính tôi đã thực hiện là tạo một thư mục cho tất cả các gói và thư viện tùy chỉnh của riêng tôi không được quản lý package.el. Điều này mang đến một ngôi nhà duy nhất cho elisp tùy chỉnh của tôi không liên quan đến cấu hình.


Cảm ơn. (1) thư mục cho các gói và thư viện được quản lý bởi pack.el là gì? (2) Nội dung của thư mục elpađược quản lý bởi elpa? Tôi có thể di chuyển chúng đi nơi khác không?
Tim

2
Bạn có thể chỉ định một tệp riêng cho Tùy chỉnh biến bằng cách đặt custom-filebiến. Nguồn
Kaushal Modi

@Tim: Thư mục được quản lý bởi pack.el là elpa. Elpa không phải là một gói lisp, nó là một kho lưu trữ gói. Gói.el vẫn sẽ thêm tất cả các gói mà nó cài đặt (có thể từ elpa hoặc từ kho lưu trữ khác --- ví dụ trong trường hợp của bạn, tôi không nghĩ eclim và s là từ elpa) trong thư mục elpa. Và vâng, bạn không cần phải lo lắng về nội dung của thư mục này.
T. Verron

(Không thể chỉnh sửa nữa) Những gì tôi viết ở trên không hoàn toàn đúng: elpa là định dạng của kho lưu trữ gói, gói.el là trình quản lý gói. Đối với người dùng, không có sự khác biệt thực sự giữa hai. Nhận xét của tôi ở trên lỗi elpa với GNU elpa, đây là một trong những gói elpa có sẵn (và là gói chính thức duy nhất).
T. Verron

16

Nếu bạn thích chế độ Org, bạn có thể sử dụng nó để tổ chức .emacsmà không cần tách nó. Theo cấu hình hiện tại của tôi, .emacstệp của tôi chỉ cần bootstraps một tệp init.org tôi có~/.emacs.d/init/init.org

(require 'org)

;; Load the actual configuration file
(org-babel-load-file
  (expand-file-name (concat user-emacs-directory "init/init.org")))

Bằng cách sử dụng các tệp khác nhau, bạn cần grepthay vì đơn giản C-sđể tìm kiếm một cái gì đó, v.v. Ngoài ra, việc thêm một số cấp độ vào tổ chức của bạn sẽ dễ dàng hơn.


1
Tôi hiện đang trong quá trình thực hiện việc này, mặc dù tôi không nghĩ sẽ sử dụng org-babel-load-file. Ngọt! (Ví dụ: github.com/vermiculus/dotfiles/blob/... , github.com/larstvei/dot-emacs )
Sean Allred

Tìm hiểu thêm về cách sử dụng chế độ org cho cấu hình Emacs cho câu hỏi này: Tôi có thể sử dụng chế độ org để cấu trúc .emacs hoặc tệp cấu hình .el khác không?
ShreevatsaR

9

Chỉ cần di chuyển các đoạn mã từ init.elcác tệp riêng biệt (thư viện), sau đó bạn require. (Sử dụng providetrong các thư viện để được required.) Đặt các tệp đó bất cứ nơi nào bạn muốn và cập nhật load-pathtương ứng.


Cảm ơn. (1) chẳng hạn? (2) bạn đề nghị tổ chức gì ~ / .emacs.d /?
Tim

1
Bạn có ý nghĩa gì khi "tổ chức nội dung ~/.emacs.d/? Bạn không cung cấp thông số kỹ thuật nào về những gì bạn muốn. Bạn không bị gò bó trong mọi thư mục. Bạn có thể đặt nội dung ở bất cứ đâu bạn thích và sửa đổi cho load-pathphù hợp. Nếu một số chương trình / công cụ chỉ đặt nội dung trong ~/.emacs.d/(nghĩa là, nếu bạn không thể nói nó ở đâu để đặt công cụ), sau đó di chuyển nó đến nơi bạn muốn sau khi chương trình / công cụ đó được thực hiện.
vẽ

1
Bạn có ý nghĩa gì bởi "ví dụ"? Bạn muốn một ví dụ về cái gì? (require 'foobar)là một ví dụ về việc sử dụng require. (add-to-list 'load-path "/my/lisp/dir")là một ví dụ về sửa đổi load-path. (provide 'foobar)là một ví dụ về việc sử dụng provide.
vẽ

bằng cách "tổ chức nội dung của ~ / .emacs.d /, tôi, với tư cách là một con người, có thể hiểu nó tốt hơn, không phải để emacs hiểu. Đó là một thói quen, giống như tổ chức tủ, ngăn kéo, giá sách của bạn. Ví dụ, trăn -mode.el-6.1.3 đã được cài đặt thủ công, trong khi emacs-eclim-20140809.207 đã được cài đặt bởi elpa. Cả hai đều là gói? Nếu chúng là, nên đặt chúng dưới một thư mục con của ~ / .emacs.d /?
Tim

Bạn là người có thể trả lời tổ chức nào có thể giúp bạn hiểu rõ hơn về tổ chức đó. (Emacs không hiểu gì cả.) Sử dụng bất kỳ cấu trúc thư mục nào bạn thích. Gọi chúng là tủ, ngăn kéo, giá sách, hoặc chỉ thư mục. Và một lần nữa, bạn init.elcó thể tải các thư viện ở bất cứ đâu , không chỉ trong ~/.emacs.d/.
vẽ

7

Tôi sử dụng đề xuất của targzeta được tìm thấy trên thư mục Emacs Wiki: Load .

Về cơ bản tôi có một ~ / .emacs.d / load-library.el:

;;;; ~/.emacs.d/load-directory.el

;; Handy function to load recursively all '.el' files in a given directory
(defun load-directory (directory)
  "Load recursively all '.el' files in DIRECTORY."
  (dolist (element (directory-files-and-attributes directory nil nil nil))
    (let* ((path (car element))
           (fullpath (concat directory "/" path))
           (isdir (car (cdr element)))
           (ignore-dir (or (string= path ".") (string= path ".."))))
      (cond
       ((and (eq isdir t) (not ignore-dir))
        (load-directory fullpath))
       ((and (eq isdir nil) (string= (substring path -3) ".el"))
        (load (file-name-sans-extension fullpath)))))))

Sau đó, tôi chỉ cần đặt các tệp riêng biệt trong ~ / .emacs.d / config:

~/.emacs.d/config ls
01-packages.el  02-style.el  03-modes.el  04-keybindings.el  05-functions.el

Và cuối cùng tôi có cái này trong ~ / .emacs.d / init.el:

;; Load all ".el" files under ~/.emacs.d/config directory.
(load "~/.emacs.d/load-directory")
(load-directory "~/.emacs.d/config")

Chúng tôi muốn chúng tôi cung cấp nhiều thông tin hơn chỉ là một liên kết - ví dụ: mô tả tóm tắt về những gì ở liên kết đó.
vẽ

Bạn nói đúng, tôi đã chỉnh sửa câu trả lời của mình.
Boccaperta-IT

Hừm. Như một phép lịch sự, ít nhất, có lẽ bạn nên nói rằng đoạn mã bạn đã vuốt nguyên văn được viết bởi targzeta . Tóm tắt một trang tham chiếu chéo không có nghĩa là đạo văn nội dung của nó. (Tất nhiên, nếu bạn targzeta, sau đó có lẽ là không có vấn đề.)
Drew

Bạn lại đúng, đã chỉnh sửa. Cảm ơn.
Boccaperta-IT

Cảm ơn. (Tôi biết rằng phải mất một ít thời gian để làm điều đó đúng, nhưng nó giúp mọi người nhiều hơn một chút.)
Drew

5

Rõ ràng có nhiều hơn một cách để da con mèo đặc biệt này. Yêu thích hiện tại của tôi là sử dụng outline-minor-modevới outshine . Trích đoạn:

;; * This here is my emacs init file
;; ** Many subsections with headlines like this one omitted
;; ** Customising modes
;; […] more lines omitted
;; *** Org and outline modes
(autoload 'outshine-hook-function "outshine")
(add-hook 'outline-minor-mode-hook 'outshine-hook-function)
;; […] and more
;; * Emacs Magic
;;; Local Variables:
;;; mode: emacs-lisp
;;; coding: utf-8
;;; mode: outline-minor
;;; fill-column: 79
;;; End:

Lưu ý rằng bạn sẽ cần phải nhận được từ bên ngoài từ kho lưu trữ gói yêu thích của bạn.


1
Tôi bắt đầu với phác thảo-chế độ nhỏ, nhưng thấy các phím bấm quá đau đớn và không bao giờ tìm thấy thời gian để tự mình làm bất cứ điều gì. Vì vậy, tôi đã chuyển sang chế độ orgitectt sau khi khám phá chế độ org, nhưng sau đó tôi phát hiện ra về việc thuê ngoài. Phúc lạc! Tôi hiện đang sử dụng phác thảo + thuê ngoài cho tất cả các cấu trúc elisp, latex và các tệp khác với chế độ chính của riêng chúng và chế độ org cho tất cả các loại ghi chú.
Harald Hanche-Olsen

2

Tôi sử dụng cấu trúc sau để theo dõi các gói và tệp

~/.emacs.d
|-- elpa            ;; Package.el packages
|-- hack            ;; Development versions of packages (e.g. org, personal packages)
|-- single-lisp     ;; Individual lisp files from outside sources (e.g. EmacsWiki)
|-- site-lisp       ;; Lisp packages not managed by package.el (directories)
|-- user-config     ;; Machine/situation specific customization (work vs home)
|   `-- custom.el   ;; Customization settings
|-- lisp            ;; Individual .el files to keep init.el clean
|   `-- defaults.el ;; Default configuration settings
`-- init.el

Sau đó tôi sử dụng use-packageđể quản lý các gói được tải và các tùy chỉnh nào được đặt cho từng gói. Hầu hết thời gian chỉ hackelpayêu cầu cập nhật, các thư mục khác thường dành cho các gói một lần mà tôi muốn kiểm tra hoặc sử dụng nhanh chóng nhưng không cần tải (thậm chí là không sử dụng).

custom.el dành cho Cài đặt tùy chỉnh mà tôi không muốn sử dụng (và không có phiên bản ngay cả khi tôi sử dụng).

defaults.eldành cho cấu hình chung (thanh menu, phông chữ, mã hóa, v.v.) sau đó có thể được ghi đè trong bất kỳ tệp .el nào user-config/để cho phép một hệ thống hoạt động như tôi mong đợi, nhưng có thể được điều chỉnh để phù hợp với môi trường.

Tôi đã từng cố gắng giữ functions, macros, advicetrong các gói riêng biệt để cho phép phân định giữa nội dung, nhưng ran vào định nghĩa / đòi hỏi vấn đề như vậy đã đưa những người trở lại vào init.el. Cuối cùng họ có thể được đưa trở lại vào ~/.emacs.d/lisp/.

Tôi cố gắng giữ init.elgọn gàng, sắp xếp nội dung theo chức năng và mục đích để việc tìm lại nội dung sẽ trở nên đơn giản. Tôi đã có init.eltệp nguyên khối và tiếp tục thêm nội dung mới vào cuối (hoặc nơi tôi nghĩ nó có thể phù hợp) và sau đó sẽ không biết tôi đã thêm gì hoặc tôi đã thêm nó vào đâu khi tôi tìm nó (và đôi khi tìm kiếm bằng cách sử dụng isearchkhông giúp ích gì vì tôi không thể nhớ cách tôi đặt tên mọi thứ vào thời điểm đó).


2

Tất cả các câu trả lời hiện có đều giải quyết các thực tiễn tốt nhất để tổ chức các tệp được tạo thủ công , thích init.elvà bạn bè. Điều quan trọng không kém là tổ chức của tất cả các tệp được tạo tự động từ các gói khác nhau và đối với gói no-litteringnày là tuyệt vời.


1

Tôi đã thêm

  (when (string= (buffer-name) "init.el")
    (setq imenu-generic-expression
      '((nil "^;; \\[ \\(.*\\)" 1))))

để emacs-lisp-mode-hook. Sau đó thêm vào các phần tệp "yasnippet", "bao bì", "chế độ java", v.v ... Điều này hoạt động tốt với 1000 dòng mã của tôi (bao gồm các bình luận).

EDIT: Cuối cùng tôi chuyển đổi giữa các phần với helm-imothy. Trên thực tế, helm móc vào chức năng imothy bình thường tự động vì vậy tất cả những gì tôi cần là

       (local-set-key (kbd "C-*") 'imenu)

Bạn có thể sử dụng biến cục bộ của tệp thay vì hook.
YoungFrog

1

Tôi chia .emacstập tin tương đối nhỏ của tôi thành ba phần:

  • emacs-custom.el để tùy chỉnh, trích xuất nhiều dữ liệu cồng kềnh và vô dụng; tệp được tự động viết lại mà không cần chạm vào tệp .emacs chính , ngăn chặn các thay đổi giả.

    (setq custom-file "~/.emacs-custom.el")
    (load custom-file)
    
  • lg-lib.el cho mã chứ không phải cấu hình: tải thư viện của riêng tôi từ các vị trí nguồn không chuẩn thay vì từ thư mục gói và xác định các chức năng khác nhau (chủ yếu được sao chép và hack khi không có gói thích hợp); đó là một sự giảm lớn khác của số lượng dòng .emacs .

    (load "~/lg-lib")
    
  • Tệp .emacs chính : không có mã cồng kềnh và các biến tùy chỉnh cồng kềnh, nó chứa requirecác lệnh gọi cho các gói, các biến không phải là một phần của hệ thống Tùy chỉnh và các lệnh gọi hàm để tải và khởi tạo các gói. Tôi "tổ chức" nó bằng cách cẩn thận giữ tất cả các dòng liên quan đến cùng một gói hoặc tính năng cùng nhau, và tách riêng các cài đặt tải gói và liên quan đến gói khỏi chức năng "cốt lõi". Một đoạn trích khá tiêu biểu:

    (require 'ido)
    (ido-mode t)
    
    (require 'auto-complete)
    (add-to-list 'ac-dictionary-directories "~/.emacs.d/ac-dict")
    
    (require 'auto-complete-config)
    (ac-config-default)
    (global-auto-complete-mode t)
    

    Các phần này rất nhỏ, nhưng chúng sẽ vẫn có thể quản lý được với nhiều dòng cấu hình hơn cho mỗi gói.


1

Thực hiện theo thiết lập của chủ Emacs, ví dụ: https://github.com/purcell/emacs.d

Ví dụ: liên quan đến cách tổ chức các gói và gói được cài đặt thủ công được cài đặt từ ELPA, thiết lập của Steven Purcell có

a place for 3rd party code which isn't available in MELPA or other
package repositories. This directory and its immediate
subdirectories will be added to load-path at start-up time.

Notably, in Emacs 23.x, a backported package.el is automatically
downloaded and installed here

Tại sao phải theo một bậc thầy? Một điểm chính của "Master emacs trong một năm" của tôi là người mới có thể tránh được việc thiết lập và "gotchas" một cách hiệu quả.

Tôi hiểu rằng nhiều người không đồng ý với tôi, nhưng đây là trường hợp của tôi (chi tiết trong bài viết của tôi ):

Tôi bắt đầu sử dụng Emacs bằng cách sử dụng cấu hình được tôn trọng tốt của Purcell ( 1403 sao GitHub kể từ tháng 11 năm 2014!), Cấu hình ổn định (5 năm phát triển). Mặc dù bắt đầu từ đó, tôi vẫn gặp nhiều vấn đề . Steve Purcell đã giúp tôi giải quyết tất cả những vấn đề đó. (Tôi thực sự đã trở thành Padawan của anh ấy trong hơn một năm.) Bằng cách sử dụng thiết lập của anh ấy và sử dụng các vấn đề của anh ấy để báo cáo vấn đề và tận dụng kinh nghiệm của anh ấy, tôi đã tránh lãng phí nhiều thời gian. Ngay cả ngày nay, tôi vẫn quan sát nhiều người sử dụng git submoduleđể quản lý các plugin của bên thứ ba. Cả Steve và tôi đều từ bỏ việc git submodulenày vì nó có thể là một PITA như vậy .

Nhưng nếu bạn rất tự tin về các kỹ năng của mình hoặc thích tự học hơn, thì đây không phải là con đường dành cho bạn.


2
" Nhân bản thiết lập từ chủ ": Không liên quan cụ thể đến các tài liệu tham khảo mà bạn trích dẫn, có thể cung cấp các tính năng hoặc lời khuyên tuyệt vời (tôi chưa kiểm tra), nói chung tôi không đồng ý rằng mọi người nên bắt đầu bằng cách sao chép các tệp init hoặc các thiết lập khác từ người khác. Điều đó thậm chí còn là một chính sách không được khuyến khích rõ ràng, IIRC, vì nó có thể dẫn đến các vấn đề. Tốt hơn là bắt đầu từ đầu và nhận thức được (và thậm chí hiểu!), Bất cứ điều gì bạn sử dụng làm thiết lập cơ bản. Tất nhiên không có gì sai khi học và học từ những gì người khác đã làm. Nhưng sao chép một cách mù quáng các tập tin init là không nên. (Chỉ một ý kiến.)
vẽ

1
Trên thực tế, tôi viết bài viết của mình vì vẫn còn nhiều người tin rằng họ nên bắt đầu lại từ đầu khi thiết lập. Đó không phải là cách tốt nhất cho hầu hết mọi người, như tôi đã quan sát, và là cách khó khăn không cần thiết cho người mới. chỉ cần tìm kiếm
chen bin

1
Đó " cách tốt nhất cho hầu hết mọi người ". Chỉ cần tìm kiếm các cuộc thảo luận và lời khuyên chống lại việc bắt đầu bằng cách sử dụng tệp init của người khác. Tìm kiếm help-gnu-emacs@gnu.org, và www.emacswiki.org, và emacs-devel@gnu.org, và thậm chí debbugs.gnu.org. Điều đó nói rằng, không có gì sai khi chia sẻ tập tin init của một người, để phục vụ người khác như thức ăn cho suy nghĩ. Lời khuyên dành cho những người mới không nên bắt đầu theo cách đó; Lời khuyên không dành cho mọi người là không chia sẻ các phương pháp và mẹo khởi nghiệp của riêng họ.
vẽ

1
Đó là vì "sự thiên vị sống sót". Nhiều người bỏ cuộc trước khi họ biết emacswiki hoặc danh sách gửi thư.
chen bin

0

Một cách sáng tạo và đơn giản để dọn dẹp .emacs.dthư mục của bạn là sử dụng org-modevà phác thảo mọi thứ bằng cách sử dụng các khối nguồn. Sau đó, trong .emacstập tin của bạn , chỉ vào của bạn config.org.

Một nguồn tuyệt vời về điều này là Harry Schwartz. Anh ấy có một video youtube chạm và một bài đăng blog giải thích chi tiết . Tôi đã có thể theo dõi nó như một emacs noob và nhận được tất cả các thiết lập. Hoạt động như một lá bùa. 1 tập tin cho toàn bộ của tôi init.

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.