Czy mogę użyć trybu org do uporządkowania pliku .emacs lub innego pliku konfiguracyjnego .el?


48

Mój .emacsplik konfiguracyjny staje się coraz większy i chciałbym uzyskać lepszy przegląd i strukturę, dodając nagłówki, podtytuły i mogąc je ukryć lub pokazać, tak jak mogę to zrobić w Emacsie org-mode.

Zauważyłem, że mogę aktywować org-moderównież w .emacsbuforze i że można dodawać nagłówki i zwijać je. Ale czy Emacs / Aquamacs nadal będą mogły załadować kod Elisp z dokumentu, jeśli dodam org-modenagłówki (tj. Wiersze zaczynające się od jednej lub więcej gwiazdek)?

Czy mogę mieć to wszystko w jednym pliku, czy też muszę mieć jeden .*orgplik, a następnie regularnie eksportować kod Elisp do innego pliku?

Odpowiedzi:


46

Tak, z pewnością możesz, możesz org-babel-load-fileto zrobić.

W swoim init.elwpisz następujące:

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

(Używam ~ / .emacs.d / settings.org, ale taka jest preferencja osobista). W settings.orgpliku możesz ustawić go tak, jak chcesz, owijając elisp:

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

Kiedy uruchomisz Emacsa, automatycznie określi, czy plik settings.org zmienił się, a jeśli to konieczne, zaplątaj go, aby utworzyć settings.elplik, który zostanie załadowany.


1
Jak byś to zmienił, aby załadować najnowszą orgwersję Elpy zamiast orgtej dostępnej w czystym emacsie? Wygląda na to, że packagekod inicjalizacyjny musiałby zostać wyciągnięty settings.orgi wprowadzony init.el?
mankoff,

3
@mankoff Zgadza się, to moje 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 Przepraszam za słabe formatowanie, mam bardziej czytelną wersję u góry writequit.org/org/settings.html
Lee H

2
Istnieje więcej niż kilka przykładowych konfiguracji Emacsa. Być może nadszedł czas, aby rozpocząć indeks. Oto moje, na przykład github.com/grettke/home
grettke

1
pamiętaj, aby nie konfigurować rzeczy związanych z org w pliku org, jeśli chcesz używać najnowszej wersji org (9) dostępnej na Melpie. Robię to github.com/cescoferraro/dotfiles/blob/master/src/emacs.d/…
CESCO

23

Jeśli wszystko, czego chcesz, to selektywne pokazywanie sekcji i nawigacja między nagłówkami, nie potrzebujesz trybu Org. Wszystko czego potrzebujesz to tryb konspektu . Tryb konspektu to zasadniczo poziom nagłówka i zarządzanie widocznością sekcji w trybie organizacji. W rzeczywistości tryb Org był pierwotnie rozszerzeniami autora do trybu konspektu, a także rósł, rósł i rósł ... Nawet dzisiaj org-modewywodzi się z niego outline-mode.

Tryb konspektu istnieje zarówno jako tryb główny, jak i tryb pomocniczy. Tryb podrzędny może być używany w dowolnym trybie głównym. Można go skonfigurować tak, aby używał formatu nagłówka zgodnego ze składnią programu, a robi to wiele głównych trybów, ustawiając outline-regexpzmienną na wyrażenie regularne pasujące do początku nagłówka. Na przykład jest to wartość domyślna w trybie Emacs Lisp:

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

tzn. nagłówki sekcji zaczynają się od trzech lub więcej średników i pojedynczej spacji lub nawiasu otwierającego na lewym marginesie. Zmienna outline-levelzawiera nazwę funkcji określającej głębokość nagłówka; wartością domyślną jest długość pasującego łańcucha outline-regexp, a tryb Emacs Lisp zastępuje go, aby przypisać większą głębokość do (i ;;;###autoload.

Jeśli nie podoba ci się domyślny format nagłówka, ustaw zmienną outline-regexpw deklaracji zmiennej lokalnej pliku . Właśnie tego używam - wszystkie moje nagłówki sekcji składają się z ;;;klasycznej sekwencji gwiazd:

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

Jeśli chcesz, aby tryb pomocniczy Zarys był włączany automatycznie podczas ładowania pliku, dodaj następujący wiersz w sekcji Zmienne lokalne - pamiętaj, że ostrzeże Cię przed niebezpiecznym kodem w Emacsie ≤23.x.

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

Polecenia dla trybu pomocniczego konspektu C-c @domyślnie używają raczej niewygodnego prefiksu. Przenoszę go do M-o(nigdy nie używam powiązań facemenu), możesz preferować inny klucz lub replikować powiązania w trybie Org (które nieco odbiegają od trybu konspektu).


4
Popieram to. Org jest świetny, ale do tego wszystko, czego potrzebujesz, to tryb konspektu. I staje się jeszcze lepszy, jeśli połączysz go z trybem Outshine-Mode, Outorg i Navi-Mode. W przypadku outshine i outorg nie musisz używać org-babel i jego splątania w osobne pliki, aby uzyskać ładne komentarze w stylu org. Oto lista kodu elisp, którego używam, aby Python, elisp i kod powłoki działały i ładnie składały się w zarysie / przyćmieniu.
blujay

14

Program do czytania i pisania zabiera Cię najbardziej, tryb org obsługuje go poprzez org-babel . Dwa możliwe rozwiązania zostały wyjaśnione na blogu @malabarba :

Najprostszym sposobem jest załadowanie trybu org, a następnie użycie jego funkcji rozplątywania, aby załadować skomplikowaną konfigurację Emacsa:

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

Alternatywnie (aby całkowicie uniknąć ładowania org), rozplątywanie można wykonać za pomocą operacji podstawowych 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

Jeszcze jeden głos na tryb konspektu. Na przykład do organizacji .emacsużywam następującej składni:

;;; HEADING:

ważnymi częściami są ;;;i:\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)
            ))

Oto próbka .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)
)

;; ...

Należy włączyć, outline-minor-modea następnie dwa wymagane naciśnięcia klawiszy to:

  • C-c @ C-t - pokaż strukturę najwyższego poziomu

    powyższe staje się

    ;;; preliminaries:
    ;;; modes:
    ;;; customizations:
    
  • C-c @ C-a - pokaż wszystko ponownie

Typowym zastosowaniem jest pokazanie struktury najwyższego poziomu, przejście do nagłówka zainteresowania i pokazanie wszystkiego od nowa.


1
czy możemy używać dyrektyw jak w trybie org: np. #+STARTUP: overviewlub show alllub contentsoptions.
doktorat

@doctorate: obsługa składania w trybie org jest również wbudowana w tryb konspektu. Nie możemy używać tylko dyrektyw: ponieważ w przeciwieństwie do trybu org - w elisp #nie jest znakiem komentarza, więc wbudowany interpreter elisp emacsa byłby zdezorientowany, gdy uderzyłby w #+STARTUPcoś lub coś takiego. (czy też źle zrozumiałem, że skomentowałeś?)
Adobe,

Mam na myśli, czy istnieje sposób na wdrożenie STARTUPdyrektywy w środku orgstruct-mode, na przykład był to bufor R, ale ten sam pomysł: emacs.stackexchange.com/a/8065/2443
doktorat

3

W poniższej odpowiedzi SO zobaczysz, jak to zrobić, przykładowe projekty korzystające z jednego pliku organizacji lub wielu, co jest zaletą korzystania z Cask i łączy do dokumentacji.

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

Kilka miesięcy temu zmieniłem konfigurację na org i nie jestem z tego całkowicie zadowolony. Wymaga to trochę konfiguracji i przeczytania instrukcji org, aby mieć przydatny plik org, który ułatwia edycję kodu elisp. Należy włączyć font font bloku src (domyślnie wyłączone -> użyć zmiennej dla pliku), sprawdzić, czy inne tryby nie kolidują z edycją bloków src (tryb autouzupełniania) itp. Nie chce używać Cc (backtick) (org-edit-src-block`), aby edytować blok src. I to trochę przeszkadza w debugowaniu.

Moja rada byłaby następująca: zacznij od rozbicia pliku init na małe elementy elisp, wypróbuj jakiś zwężający się pakiet, użyj helm-swoopdo szybkiej nawigacji, a następnie rozważ użycie org-mode.


1

Ostatnio zainwestowałem trochę czasu, aby to dokładnie zrobić. Skończyłem z konfiguracją, która - utrzymywana w trybie org - używa „use-package” do automatycznej instalacji brakujących pakietów - jest repozytorium github tego rodzaju automatycznych instalacji (bezwstydna wtyczka: https://github.com / pascalfleury / emacs-config )

„Załadowałem” kilka komputerów (Linux i Mac), klonując repo i dodając pojedynczy wiersz w ~ / .emacs et voila. Jestem skonfigurowany tak, jak lubię.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.