Tôi có thể sử dụng chế độ org để cấu trúc tệp .emacs hoặc tệp cấu hình .el khác không?


48

.emacsTệp cấu hình của tôi ngày càng lớn hơn và tôi muốn có một cái nhìn tổng quan và cấu trúc tốt hơn bằng cách thêm các tiêu đề, tiêu đề phụ và có thể ẩn hoặc hiển thị chúng như tôi có thể làm với Emacs org-mode.

Tôi nhận thấy rằng tôi cũng có thể kích hoạt org-modetrong .emacsbộ đệm và có thể thêm các tiêu đề và thu gọn chúng. Nhưng Emacs / Aquamacs vẫn có thể tải mã Elisp từ tài liệu nếu tôi thêm org-modecác tiêu đề (nghĩa là các dòng bắt đầu bằng một hoặc nhiều dấu sao)?

Tôi có thể có tất cả những thứ đó trong một tệp không hoặc tôi phải có một .*orgtệp và sau đó thường xuyên xuất mã Elisp sang tệp khác?

Câu trả lời:


46

Vâng, bạn chắc chắn có thể, bạn có thể sử dụng org-babel-load-fileđể làm điều này.

Trong của bạn init.el, đặt như sau:

(require 'org)
(org-babel-load-file
 (expand-file-name "settings.org"
                   user-emacs-directory))

(Tôi đang sử dụng ~ / .emacs.d / settings.org nhưng đó là sở thích cá nhân). Trong settings.orgtệp bạn có thể sắp xếp nó theo cách bạn muốn, gói elisp vào:

* Turn off menu bar
#+BEGIN_SRC emacs-lisp
(menu-bar-mode -1)
#+END_SRC

Khi bạn khởi động Emacs, nó sẽ tự động xác định xem tệp settings.org có thay đổi hay không và nếu cần, hãy làm rối nó để tạo ra một settings.eltệp sẽ được tải.


1
Làm thế nào bạn sẽ thay đổi điều này để tải mới nhất orgtừ elpa, thay vì orgcái có sẵn trong một emacs sạch? Có vẻ như packagemã khởi tạo sẽ cần phải được rút ra settings.orgvà đưa vào init.el?
mankoff

3
@mankoff Đúng vậy, đây là của tôi init.el: (require 'package) (package-initialize) (setq custom-file "~/.emacs.d/custom.el") (when (file-exists-p custom-file) (load custom-file)) (require 'org) (org-babel-load-file (expand-file-name "settings.org" user-emacs-directory))
Lee H

2
@mankoff Xin lỗi vì định dạng kém, tôi có phiên bản dễ đọc hơn ở gần đầu của writequito.org/org/sinstall.html
Lee H

2
Có nhiều hơn một vài ví dụ về cấu hình Emacs biết chữ. Có lẽ đã đến lúc bắt đầu một chỉ số. Đây là ví dụ của tôi github.com/grettke/home
grettke

1
nhớ không định cấu hình nội dung liên quan đến org bên trong tệp org nếu bạn muốn sử dụng phiên bản mới nhất của org (9) có sẵn trên Melpa. Tôi đang làm điều này github.com/cescoferraro/dotfiles/blob/master/src/emacs.d/
Cedom

23

Nếu tất cả những gì bạn muốn là hiển thị có chọn lọc các phần và điều hướng giữa các tiêu đề, bạn không cần chế độ Org. Tất cả bạn cần là chế độ Outline . Chế độ phác thảo về cơ bản là mức tiêu đề và quản lý hiển thị phần của chế độ Org. Trên thực tế, chế độ Org ban đầu là các phần mở rộng của tác giả cho chế độ Phác thảo, đã phát triển, và phát triển và phát triển ngay cả ngày nay, org-modecó nguồn gốc từ outline-mode.

Chế độ phác thảo tồn tại cả dưới dạng chế độ chính và chế độ phụ. Chế độ nhỏ có thể được sử dụng trong bất kỳ chế độ chính. Bạn có thể định cấu hình nó để sử dụng định dạng tiêu đề tương thích với cú pháp chương trình của bạn và nhiều chế độ chính làm như vậy, bằng cách đặt outline-regexpbiến thành một biểu thức chính quy phù hợp với phần đầu của tiêu đề. Ví dụ: đây là giá trị mặc định trong chế độ Emacs Lisp:

";;;\\(;* [^ \t\n]\\|###autoload\\)\\|("

tức là các tiêu đề phần bắt đầu bằng ba hoặc nhiều dấu chấm phẩy và một khoảng trắng hoặc dấu ngoặc đơn mở ở lề trái. Biến outline-levelchứa tên của hàm để xác định độ sâu của tiêu đề; giá trị mặc định là độ dài của chuỗi khớp với outline-regexpvà chế độ Emacs Lisp ghi đè lên nó để gán độ sâu lớn hơn cho (;;;###autoload.

Nếu bạn không thích định dạng tiêu đề mặc định, hãy đặt biến outline-regexptrong khai báo biến cục bộ của tệp . Đây là những gì tôi sử dụng - tất cả các tiêu đề phần của tôi bao gồm ;;;theo sau là chuỗi các ngôi sao cổ điển:

;;; Local Variables:
;;; outline-regexp: ";;;\\*+\\|\\`"
;;; End:

Nếu bạn muốn chế độ phụ Outline tự động được bật khi bạn tải tệp, hãy thêm dòng sau vào phần Biến cục bộ - lưu ý rằng điều này sẽ cảnh báo bạn về mã không an toàn trong Emacs ≤23.x.

;;; eval: (outline-minor-mode 1)

Các lệnh cho phác thảo chế độ nhỏ sử dụng C-c @tiền tố khá bất tiện theo mặc định. Tôi chuyển nó sang M-o(Tôi không bao giờ sử dụng các ràng buộc facemenu), bạn có thể thích một khóa khác hoặc để sao chép các ràng buộc của chế độ Org (đã chuyển hướng khá nhiều từ chế độ Outline).


4
Tôi thứ hai này. Org là tuyệt vời, nhưng đối với điều này, tất cả những gì bạn cần là chế độ phác thảo. Và nó thậm chí còn tốt hơn nếu bạn kết hợp nó với chế độ outhine, outorg và navi-mode. Với outhine và outorg, bạn không cần phải sử dụng org-babel và rối vào các tệp riêng biệt để có được nhận xét kiểu org-mode đẹp. Đây là một ý chính của mã elisp mà tôi sử dụng để làm cho Python, elisp và mã shell hoạt động và gấp lại độc đáo trong phác thảo / outhine.
blujay 22/03/2015

14

Lập trình biết chữ sẽ đưa bạn đến gần nhất, chế độ org hỗ trợ nó thông qua org-babel . Hai giải pháp khả thi được giải thích trên blog của @malabarba :

Cách đơn giản nhất là tải chế độ org, sau đó sử dụng tính năng gỡ rối của nó để tải cấu hình Emacs biết chữ:

(require 'org)
(org-babel-load-file
 (expand-file-name "emacs-init.org"
                   user-emacs-directory))

Ngoài ra (để tránh tải org hoàn toàn), việc gỡ rối có thể được thực hiện với các nguyên hàm Emacs Lisp:

(defvar endless/init.org-message-depth 3
  "What depth of init.org headers to message at startup.")

(with-temp-buffer
  (insert-file "~/.emacs.d/init.org")
  (goto-char (point-min))
  (search-forward "\n* init.el")
  (while (not (eobp))
    (forward-line 1)
    (cond
     ;; Report Headers
     ((looking-at
       (format "\\*\\{2,%s\\} +.*$"
               endless/init.org-message-depth))
      (message "%s" (match-string 0)))
     ;; Evaluate Code Blocks
     ((looking-at "^#\\+BEGIN_SRC +emacs-lisp.*$")
      (let ((l (match-end 0)))
        (search-forward "\n#+END_SRC")
        (eval-region l (match-beginning 0))))
     ;; Finish on the next level-1 header
     ((looking-at "^\\* ")
      (goto-char (point-max))))))

6

Thêm một phiếu bầu cho chế độ phác thảo. Ví dụ để tổ chức, .emacstôi sử dụng cú pháp sau:

;;; HEADING:

những phần quan trọng là ;;;:\n

(add-hook 'emacs-lisp-mode-hook 
          (lambda ()
            (make-local-variable 'outline-regexp)
            (setq outline-regexp "^;;; ")
            (make-local-variable 'outline-heading-end-regexp)
            (setq outline-heading-end-regexp ":\n")
            (outline-minor-mode 1)
            ))

Đây là một mẫu .emacs:

;;; preliminaries:
;; load-path:
;; This little monster adds all non-dot dirs to Your load path recursively
(let* ((my-lisp-dir "~/.emacs.d/site-lisp/")
       (default-directory my-lisp-dir)
       (orig-load-path load-path))
  (setq load-path (cons my-lisp-dir nil))
  (normal-top-level-add-subdirs-to-load-path)
  (nconc load-path orig-load-path))

;; ...

;;; modes:

;; python-mode:
(setq py-install-directory "~/.emacs.d/site-lisp/python-mode")
(add-to-list 'load-path py-install-directory)
(require 'python-mode)

;; ...

;;; customizations:
(custom-set-variables
 '(blink-cursor-mode nil)
)

;; ...

Một nên kích hoạt outline-minor-modevà sau đó hai nét chính cần thiết là:

  • C-c @ C-t - hiển thị cấu trúc cấp cao nhất

    ở trên trở thành

    ;;; preliminaries:
    ;;; modes:
    ;;; customizations:
    
  • C-c @ C-a - hiển thị lại

Một cách sử dụng thông thường là hiển thị cấu trúc cấp cao nhất, chuyển sang tiêu đề quan tâm và hiển thị lại tất cả.


1
chúng ta có thể sử dụng chỉ thị như thế nào trong org-mode: ví dụ #+STARTUP: overviewhoặc show allhoặc contentstùy chọn.
tiến sĩ

@doctorate: Hỗ trợ chế độ org cho việc gấp cũng được xây dựng dựa trên chế độ phác thảo. Chúng ta không thể chỉ sử dụng các chỉ thị: vì trái ngược với chế độ org - trong elisp #không phải là dấu hiệu nhận xét, do đó, trình thông dịch elisp tích hợp của emacs sẽ bị nhầm lẫn khi nó chạm vào #+STARTUPhoặc một cái gì đó như thế này. (hoặc tôi đã hiểu nhầm ý kiến ​​của bạn?)
Adobe

Ý tôi là có một cách để thực hiện STARTUPchỉ thị bên trong orgstruct-mode, ví dụ đây là bộ đệm R nhưng cùng một ý tưởng: emacs.stackexchange.com/a/8065/2443
tiến sĩ

3

Trong câu trả lời SO sau đây, bạn sẽ thấy cách thực hiện, ví dụ các dự án sử dụng một tệp org hoặc nhiều tệp, lợi ích của việc sử dụng Cask và liên kết đến tài liệu.

https://stackoverflow.com/questions/25430029/whats-the-best-way-to-package-my-emacs-installation-packages-and-config-so-tha/25430745#25430745

Tôi đã chuyển cấu hình của mình sang org vài tháng trước và tôi không hoàn toàn hài lòng với nó. Nó đòi hỏi một số cấu hình và đọc hướng dẫn sử dụng org để có một tệp org hữu ích giúp dễ dàng chỉnh sửa mã elisp. Người ta phải kích hoạt phông chữ src (tắt theo mặc định -> sử dụng biến trên mỗi tệp), kiểm tra xem các chế độ khác không xung đột để chỉnh sửa khối src (chế độ tự động điền), v.v. Người ta không muốn sử dụng Cc (backtick) (org-edit-src-block`) để chỉnh sửa khối src. Và nó có một chút trong cách gỡ lỗi.

Lời khuyên của tôi sẽ là: bắt đầu bằng cách chia tập tin init của bạn thành các phần nhỏ, thử một số gói thu hẹp ngoài kia, sử dụng helm-swoopđể điều hướng nhanh và sau đó xem xét sử dụng org-mode.


1

Gần đây tôi đã đầu tư một số thời gian để làm chính xác điều đó. Tôi đã kết thúc với một cấu hình - được duy trì ở chế độ org - sử dụng 'gói sử dụng' để tự động cài đặt các gói bị thiếu - là một repo github loại cài đặt tự động (plugin không biết xấu hổ: https://github.com / pascalfleury / emacs-config )

Tôi đã 'bootstrapping' một vài máy (Linux và Mac) bằng cách nhân bản repo và thêm một dòng trong ~ / .emacs et voila. Tôi đang thiết lập như tôi muốn.

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.