Kann ich im org-Modus meine .emacs oder andere .el-Konfigurationsdateien strukturieren?


48

Meine .emacsKonfigurationsdatei wird immer größer und ich möchte eine bessere Übersicht und Strukturierung erhalten, indem ich Überschriften und Unterüberschriften hinzufüge und sie ausblenden oder anzeigen kann, wie ich es mit Emacs tun kann org-mode.

Mir ist aufgefallen, dass ich org-modeauch im .emacsPuffer aktivieren kann und dass es möglich ist, Überschriften hinzuzufügen und zu reduzieren. Kann Emacs / Aquamacs den Elisp-Code trotzdem aus dem Dokument laden, wenn ich org-modeÜberschriften hinzufüge (dh Zeilen, die mit einem oder mehreren Sternchen beginnen)?

Kann ich das alles in einer Datei haben oder muss ich eine .*orgDatei haben und dann regelmäßig den Elisp-Code in eine andere Datei exportieren?

Antworten:


46

Ja, das können Sie sicherlich, Sie können org-babel-load-filedies tun.

Geben Sie in Ihr init.elFolgendes ein:

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

(Ich benutze ~ / .emacs.d / settings.org, aber das ist meine persönliche Präferenz). In der settings.orgDatei können Sie es so anordnen, wie Sie möchten.

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

Wenn Sie Emacs starten, wird automatisch festgestellt, ob sich die settings.org-Datei geändert hat. Falls erforderlich, können Sie sie verwirren, um eine settings.elDatei zu erstellen , die geladen wird.


1
Wie würden Sie dies ändern, um das Neueste orgvon elpa zu laden , anstatt das org, was in einem sauberen Emacs verfügbar ist? Es scheint, als packagemüsste der Initialisierungscode herausgezogen settings.orgund eingegeben werden init.el.
mankoff

3
@mankoff Das ist richtig, das ist meine 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 Entschuldigung für die schlechte Formatierung, ich habe eine besser lesbare Version am Anfang von writequit.org/org/settings.html
Lee H

2
Es gibt mehr als ein paar Beispiele für gebildete Emacs-Konfigurationen. Vielleicht ist es an der Zeit, einen Index zu erstellen. Hier ist meine zum Beispiel github.com/grettke/home
grettke

1
Denken Sie daran, keine org-bezogenen Elemente in der org-Datei zu konfigurieren, wenn Sie die neueste Version von org (9) verwenden möchten, die auf Melpa verfügbar ist. Ich mache das github.com/cescoferraro/dotfiles/blob/master/src/emacs.d/…
CESCO

23

Wenn Sie nur Abschnitte selektiv anzeigen und zwischen den Überschriften navigieren möchten, benötigen Sie den Org-Modus nicht. Alles was Sie brauchen, ist der Gliederungsmodus . Der Gliederungsmodus ist im Grunde genommen die Verwaltung der Kopfzeilenebene und der Abschnittssichtbarkeit des Org-Modus. Tatsächlich war der Org-Modus ursprünglich die Erweiterung des Umriss-Modus durch den Autor und wuchs und wuchs und wuchs… Auch heute org-modenoch leitet er sich ab von outline-mode.

Der Gliederungsmodus ist sowohl als Hauptmodus als auch als Nebenmodus verfügbar. Der Nebenmodus kann in jedem Hauptmodus verwendet werden. Sie können es so konfigurieren, dass es ein Header-Format verwendet, das mit Ihrer Programmsyntax kompatibel ist, und dies tun viele Hauptmodi, indem Sie die outline-regexpVariable auf einen regulären Ausdruck setzen, der dem Anfang eines Headers entspricht. Dies ist beispielsweise der Standardwert im Emacs Lisp-Modus:

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

dh Abschnittsüberschriften beginnen mit drei oder mehr Semikolons und einem einzelnen Leerzeichen oder einer öffnenden Klammer am linken Rand. Die Variable outline-levelenthält den Namen einer Funktion, um die Tiefe eines Headers zu bestimmen. Der Standardwert ist die Länge der Zeichenfolge durch angepaßt outline-regexpund Emacs Lisp - Modus überschreibt er eine größere Tiefe zuzuweisen (und ;;;###autoload.

Wenn Ihnen das Standard-Header-Format nicht gefällt, legen Sie die Variable outline-regexpin einer lokalen Variablendeklaration fest . Dies ist, was ich benutze - meine Abschnittsüberschriften bestehen alle aus ;;;gefolgt von der klassischen Abfolge von Sternen:

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

Wenn der Nebenmodus "Gliederung" beim Laden der Datei automatisch aktiviert werden soll, fügen Sie im Abschnitt "Lokale Variablen" die folgende Zeile hinzu. Beachten Sie, dass Sie dadurch vor unsicherem Code in Emacs ≤23.x gewarnt werden.

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

Die Befehle für den Nebenmodus "Gliederung" verwenden C-c @standardmäßig das recht unpraktische Präfix. Ich verschiebe es nach M-o(ich verwende niemals die Facemenü-Bindungen), vielleicht bevorzugen Sie einen anderen Schlüssel oder replizieren die Bindungen des Org-Modus (die sich ziemlich stark vom Outline-Modus unterscheiden).


4
Ich unterstütze das. Org ist toll, aber dafür brauchen Sie nur den Gliederungsmodus. Und es wird noch besser, wenn Sie es mit dem Outshine-Modus, dem Outorg-Modus und dem Navi-Modus kombinieren. Mit outshine und outorg müssen Sie org-babel und seine Verwicklung in separate Dateien nicht verwenden, um nette Kommentare im org-mode-Stil zu erhalten. Hier ist der Kern des Elisp-Codes, den ich verwende, um Python-, Elisp- und Shell-Code zum Laufen zu bringen und in Outline / Outshine zu falten.
blujay

14

Literate Programming bringt Sie am besten dahin, org-mode unterstützt es via org-babel . Zwei mögliche Lösungen werden im Blog von @malabarba erläutert :

Der einfachste Weg ist, den org-mode zu laden und dann seine Unangling-Funktion zu verwenden, um eine geschulte Emacs-Konfiguration zu laden:

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

Alternativ (um zu vermeiden, dass org vollständig geladen wird) kann das Entwirren mit den Emacs Lisp-Primitiven durchgeführt werden:

(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

Noch eine Stimme für den Outline-Modus. Zum Beispiel verwende .emacsich zum Organisieren die folgende Syntax:

;;; HEADING:

die wichtigen teile sind ;;;und:\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)
            ))

Hier ist ein Beispiel .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)
)

;; ...

Man sollte aktivieren outline-minor-modeund dann sind die zwei erforderlichen Tastenanschläge:

  • C-c @ C-t - Zeige oberste Struktur

    das obige wird

    ;;; preliminaries:
    ;;; modes:
    ;;; customizations:
    
  • C-c @ C-a - zeige alles nochmal

Eine typische Verwendung besteht darin, die Struktur der obersten Ebene anzuzeigen, zur gewünschten Überschrift zu wechseln und alle wieder anzuzeigen.


1
können wir Direktiven wie im org-Modus verwenden: zB #+STARTUP: overviewoder show alloder contentsoptions.
Promotion am

@doctorate: Die Unterstützung des Org-Modus für das Falzen basiert ebenfalls auf dem Gliederungsmodus. Wir können nicht nur die Direktiven verwenden: weil im Gegensatz zum org-mode - in elisp #kein Kommentarzeichen ist, wäre der eingebaute Elisp-Interpreter von Emacs verwirrt, wenn er auf das #+STARTUPoder etwas Ähnliches stößt . (Oder habe ich Sie falsch verstanden?)
Adobe

Ich meine, gibt es eine Möglichkeit, die STARTUPDirektive innerhalb zu implementieren orgstruct-mode, zum Beispiel war dies ein R-Puffer, aber die gleiche Idee: emacs.stackexchange.com/a/8065/2443
Doktor am

3

In der folgenden SO-Antwort sehen Sie, wie es gemacht wird, Beispielprojekte mit einer einzelnen Organisationsdatei oder vielen, welche Vorteile die Verwendung von Cask und Links zur Dokumentation bietet.

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

Ich habe meine Konfiguration vor ein paar Monaten auf org umgestellt und bin damit nicht ganz zufrieden. Es sind einige Konfigurations- und Lesevorgänge des Organisationshandbuchs erforderlich, um eine nützliche Organisationsdatei zu haben, mit der sich Elisp-Code einfach bearbeiten lässt. Man muss src block fontifying aktivieren (standardmäßig deaktiviert -> eine Variable pro Datei verwenden), sicherstellen, dass andere Modi nicht zu Konflikten beim Bearbeiten von src-Blöcken führen (Auto-Fill-Modus) usw. Man möchte Cc nicht verwenden (backtick) (org-edit-src-block`), um einen src-block zu bearbeiten. Und es steht dem Debuggen ein wenig im Wege.

Mein Rat wäre: Zerlegen Sie Ihre Init-Datei zunächst in kleine Teile, versuchen Sie es mit einem Einschränkungspaket, verwenden Sie es helm-swoopfür eine schnelle Navigation und ziehen Sie dann die Verwendung in Betracht org-mode.


1

Ich habe kürzlich einige Zeit investiert, um genau das zu tun. Ich habe eine Konfiguration gefunden, die - im Organisationsmodus verwaltet - 'use-package' verwendet, um fehlende Pakete automatisch zu installieren. Dies ist ein Github-Repo, das sich automatisch installiert (schamloser Plug: https://github.com) / pascalfleury / emacs-config )

Ich habe einige Computer (Linux und Mac) durch Klonen des Repos und Hinzufügen einer einzelnen Zeile in ~ / .emacs et voila "gebootet". Ich richte mich so ein, wie ich möchte.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.