Organisieren Sie den Inhalt von ~ / .emacs.d / init.el und ~ / emacs.d?

28
  1. Wenn wir ~/.emacs.d/init.elfür verschiedene Zwecke mehr und mehr Zeilen hinzufügen (für den Python-Modus, für emacs-eclim, für ...), wird die Datei lang und weniger lesbar. Gibt es eine Möglichkeit, den Inhalt zu organisieren?
  2. Meine aktuelle ~/.emacs.dsieht so aus

    $ 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.3wurde manuell installiert, während emacs-eclim-20140809.207wurde von installiert elpa, und ich bin nicht 100% sicher, dass die anderen Dinge unter von elpa/waren elpa. Wie kann ich den Inhalt von organisieren ~/.emacs.d/?

Tim
quelle

Antworten:

32

Leute, die kleinere Editoren verwenden, teilen ihren Code gerne in mehrere Dateien auf. Wenn Sie Emacs verwenden, gibt es keinen Grund, dies zu tun: Verwenden Sie einfach eine einzelne große Datei, die Sie in Abschnitte unterteilt haben.

Jeder Abschnitt sollte mit beginnen

^L
;;; title of the section

wo Sie das ^LZeichen durch Eingabe einfügen C-q C-l. Sie können dann Befehle wie C-x ]( forward-page) oder C-x n p( narrow-to-page) verwenden, um durch die Datei zu navigieren. Weitere Informationen finden Sie in Abschnitt 25.4 (Seiten) des Emacs-Handbuchs.

jch
quelle
16
Es gibt auch keine besonderen Grund , nicht zu Split - Code in mehrere Dateien. Es kommt darauf an, was die Gruppierung von Dingen bedeuten soll - wie sie sich verhalten soll. Und es kann davon abhängen, wie groß GROSS ist. Und es kann davon abhängen, ob Teile Ihres Codes für andere freigegeben werden, beispielsweise für Bibliotheken.
Drew
2
Huckepack auf @ Drews Kommentare, der Benutzer möchte möglicherweise verschiedene Konfigurationen für verschiedene Emacs-Versionen und -Umgebungen haben und lädt den entsprechenden Elisp entsprechend. Trotzdem mag ich den Paginierungs-Tipp.
Harvey
3
@ Harvey: Paginierung und Verwendung separater Dateien sind unabhängige Methoden zum Organisieren von Text. Sie können natürlich beide verwenden. Ich benutze die Paginierung in all meinen Bibliotheken, um Abschnitte zu trennen. Ich habe aber auch separate Bibliotheken (Dateien).
Drew
1
@jch Wenn Sie diesen Stil verwenden, möchten Sie möglicherweise auch den Outline Minor-Modus oder eine ähnliche Funktion aktivieren, um das Falten von Abschnitten und Funktionen zu ermöglichen. Wenn Sie alle Überschriften der obersten Ebene zusammenfassen, erhalten Sie einen schönen Überblick über alle Abschnitte in Ihrer Emacs-Konfiguration.
Lunaryorn
@lunaryorn, ich habe es versucht, aber ich fand es ablenkend - Ich finde die Seitenbewegungsbefehle die meiste Zeit ausreichend, ich muss nur gelegentlich eingrenzen. Vielleicht sind meine .emacsund .wlnicht lang genug.
26.
20

Eine klassische Methode hierfür ist das Aufteilen Ihrer .emacsDateien in separate Dateien. Zum Beispiel könnten Sie all Ihre Web-Sachen in ~/.emacs.d/web-config.elund laden Sie es dann in init.el:

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

Wenn Sie ~/.emacs.detwas besser organisiert sein möchten , können Sie diese Konfigurationsdateien auch in ein eigenes Verzeichnis verschieben:

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

Jetzt können Sie einfach zur entsprechenden Datei springen, wenn Sie Änderungen an Ihrer Konfiguration vornehmen.

Eine Sache, die darin fehlt, sind Variablen, die über das Anpassungssystem festgelegt werden. Diese befinden sich weiterhin alle in Ihrer Hauptinitialisierung. Anscheinend gibt es ein kleines Hilfsprogramm namens init split, mit dem Sie Regeln festlegen können, welche Anpassungseinstellungen wohin gehen, aber ich habe es selbst nie verwendet. Alternativ kann das System "Anpassen" so konfiguriert werden, dass eine separate Datei zum Ändern Ihrer Einstellungen verwendet wird. Stellen Sie die custom-fileVariable so ein, dass angegeben wird, woher die Einstellungen zum Anpassen gelesen und in diese geschrieben werden sollen .

Was das Verzeichnis selbst angeht, war ich immer mit dem Standardlayout zufrieden. Die wichtigste Änderung, die ich vorgenommen habe, war das Erstellen eines Verzeichnisses für alle meine eigenen benutzerdefinierten Pakete und Bibliotheken, die nicht von verwaltet werden package.el. Dies gibt meinem benutzerdefinierten elisp ein Zuhause, das nichts mit der Konfiguration zu tun hat.

Tikhon Jelvis
quelle
Vielen Dank. (1) Wie lautet das Verzeichnis für Pakete und Bibliotheken, die von package.el verwaltet werden? (2) Werden die Inhalte des Verzeichnisses von elpaverwaltet elpa? Kann ich sie woanders hinbringen?
Tim
2
Sie können eine separate Datei zum Anpassen von custom-fileVariablen angeben, indem Sie die Variable festlegen . Source
Kaushal Modi
@Tim: Das von package.el verwaltete Verzeichnis ist elpa. Elpa ist kein lisp-Paket, sondern ein Paket-Repository. Package.el fügt weiterhin alle Pakete, die es installiert (sei es von elpa oder aus einem anderen Repository - in Ihrem Fall glaube ich nicht, dass eclim und s von elpa sind), im Verzeichnis elpa hinzu. Und ja, Sie sollten sich keine Gedanken über den Inhalt dieses Verzeichnisses machen müssen.
T. Verron
(Kann nicht mehr bearbeitet werden.) Was ich oben geschrieben habe, ist nicht konsequent wahr: elpa ist das Format der Paketarchive, package.el ist der Paketmanager. Für den Benutzer gibt es keinen wirklichen Unterschied zwischen den beiden. Mein Kommentar über Fehler elpa mit GNU elpa, einem der verfügbaren elpa-Pakete (und dem einzigen offiziellen).
T. Verron
16

Wenn Sie den Org-Modus mögen, können Sie ihn verwenden, um Ihren zu organisieren, .emacsohne ihn zu teilen. In meiner aktuellen Konfiguration .emacsbootet meine Datei einfach eine init.org-Datei, unter der ich mich befinde~/.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")))

Durch die Verwendung unterschiedlicher Dateien müssen Sie grepnicht einfach C-snach etwas suchen, und so weiter. Außerdem ist es einfacher, Ihrer Organisation mehrere Ebenen hinzuzufügen.

Rlazo
quelle
1
Ich bin gerade dabei, dies zu tun, obwohl ich nicht daran gedacht habe, es zu verwenden org-babel-load-file. Süss! (Beispiele: github.com/vermiculus/dotfiles/blob/… , github.com/larstvei/dot-emacs )
Sean Allred
9

Verschieben Sie einfach Code-Teile von init.elin separate Dateien (Bibliotheken), die Sie dann require. (Verwenden Sie providein den Bibliotheken, um required.) Platzieren Sie diese Dateien, wo immer Sie möchten, und aktualisieren Sie sie load-pathentsprechend.

Drew
quelle
Vielen Dank. (1) zum Beispiel? (2) Was schlagen Sie vor, um ~ / .emacs.d / zu organisieren?
Tim
1
Was meinen Sie mit "organisieren des Inhalts von" ~/.emacs.d/? Sie bieten keine Spezifikation dessen an, was Sie wollen. Sie sind nicht darauf beschränkt, alles in einem Verzeichnis zu haben. Sie können Sachen an einer beliebigen Stelle ablegen und entsprechend modifizieren load-path. Wenn einige Programme / Tools nur ablegen Zeug rein ~/.emacs.d/(dh, wenn Sie nicht sagen können, wo es abgelegt werden soll), dann verschieben Sie es, wo Sie es wollen, nachdem das Programm / Tool fertig ist.
Drew
1
Was meinst du mit "zum Beispiel"? Wofür möchten Sie ein Beispiel? (require 'foobar)ist ein Beispiel für die Verwendung von require. (add-to-list 'load-path "/my/lisp/dir")ist ein Beispiel für das Ändern load-path. (provide 'foobar)ist ein Beispiel für die Verwendung von provide.
Drew
Wenn Sie "den Inhalt von ~ / .emacs.d / organisieren", kann ich es als Mensch besser verstehen, als es für Emacs zu verstehen. Es ist eine Gewohnheit, genau wie das Organisieren Ihres Schranks, Ihrer Schubladen und Bücherregale. Zum Beispiel Python -mode.el-6.1.3 wurde manuell installiert, während emacs-eclim-20140809.207 von elpa installiert wurde. Sind beide Pakete? Wenn ja, ist es eine gute Idee, sie in einem Unterverzeichnis von ~ / .emacs.d abzulegen /?
Tim
Sie sind der Mensch, der antworten kann, welche Organisation Ihnen helfen könnte, es besser zu verstehen. (Emacs versteht nichts.) Verwenden Sie eine beliebige Ordnerstruktur. Nennen Sie sie Schränke, Schubladen, Bücherregale oder nur Ordner. Und wieder können Sie init.elBibliotheken laden, die sich an einem beliebigen Ort befinden , nicht nur innerhalb ~/.emacs.d/.
Drew
7

Ich verwende den Vorschlag von targzeta aus dem Emacs Wiki: Load-Verzeichnis .

Grundsätzlich habe ich ein ~ / .emacs.d / load-directory.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)))))))

Dann lege ich einfach separate Dateien in meine ~ / .emacs.d / config:

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

Und zum Schluss habe ich das in meinem ~ / .emacs.d / init.el:

;; Load all ".el" files under ~/.emacs.d/config directory.
(load "~/.emacs.d/load-directory")
(load-directory "~/.emacs.d/config")
Boccaperta-IT
quelle
Sie möchten, dass wir mehr Informationen als nur einen Link bereitstellen - z. B. eine zusammenfassende Beschreibung dessen, was sich auf diesem Link befindet.
Drew
Du hast recht, ich habe meine Antwort bearbeitet.
Boccaperta-IT
Hm. Zumindest aus Höflichkeit sollten Sie wahrscheinlich sagen, dass der Code, den Sie wörtlich geklaut haben, von targzeta geschrieben wurde . Das Zusammenfassen einer Seite, auf die verwiesen wird, bedeutet nicht, ihren Inhalt zu plagiieren. (Natürlich, wenn Sie sind targzeta, dann gibt es vermutlich kein Problem.)
Drew
Du hast wieder Recht, bearbeitet. Vielen Dank.
Boccaperta-IT,
Vielen Dank. (Ich weiß, es braucht ein wenig Zeit, um es richtig zu machen, aber es hilft allen ein bisschen mehr.)
Drew
5

Es gibt offensichtlich mehr als eine Möglichkeit, diese bestimmte Katze zu häuten. Mein aktueller Favorit ist die Verwendung outline-minor-modemit Outshine . Auszug:

;; * 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:

Beachten Sie, dass Sie Outshine von Ihrem bevorzugten Paket-Repository erhalten müssen.

Harald Hanche-Olsen
quelle
1
Ich habe mit dem Nebenmodus "Gliederung" begonnen, fand die Tastenkombinationen jedoch zu schmerzhaft und hatte nie die Zeit, selbst etwas dagegen zu unternehmen. Nachdem ich den Org-Modus entdeckt hatte, bin ich in den Org-Modus übergegangen, aber dann habe ich etwas über Outshine herausgefunden. Glückseligkeit! Derzeit benutze ich outline + outshine für die Strukturierung von Elisp-, Latex- und anderen Dateien mit eigenem Hauptmodus und org-mode für alle Arten von Notizen.
Harald Hanche-Olsen
2

Ich verwende die folgende Struktur, um Pakete und Dateien im Auge zu behalten

~/.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

Ich verwalte dann use-package, welche Pakete geladen und welche Anpassungen für jedes Paket festgelegt werden. Meistens nur hackundelpa müssen aktualisiert werden, die anderen Ordner sind oft für einmalige Pakete, die ich testen oder kurz verwenden möchte, aber nicht laden muss (auch nicht im Leerlauf).

custom.el dient zum Anpassen von Einstellungen, die ich lieber nicht verwende (und auch dann nicht versioniere, wenn ich sie verwende).

defaults.eldient der allgemeinen Konfiguration (Menüleiste, Schriftart, Codierung usw.), die dann in einer beliebigen .el-Datei in überschrieben werden kann user-config/, um ein System zu ermöglichen, das wie erwartet funktioniert, das jedoch an die Umgebung angepasst werden kann.

Ich hatte vorher versucht zu halten functions, macros, advicein separaten Paketen für Abgrenzung zwischen Inhalt zu ermöglichen, sondern läuft in Definition / erfordern Fragen so jene wieder in gesetzt haben init.el. Sie können schließlich wieder eingesetzt werden~/.emacs.d/lisp/ .

Ich versuche init.elaufgeräumt zu bleiben , die Inhalte nach Funktion und Zweck zu sortieren, damit es einfach ist, sie wieder zu finden. Ich hatte die monolithische init.elDatei und fügte am Ende immer wieder neuen Inhalt hinzu (oder wo ich dachte, dass er passen könnte) und wusste dann nicht, was ich hinzugefügt hatte oder wo ich ihn hinzugefügt hatte, als ich danach suchte (und manchmal hat die Suche mit isearchnicht geholfen, da ich mich nicht erinnern konnte, wie ich die Dinge damals benannt hatte).

Jonathan Leech-Pepin
quelle
2

Alle vorhandenen Antworten enthalten bewährte Methoden für die Organisation manuell erstellten Dateien wie init.elund Freunden. Ebenso wichtig ist die Organisation aller automatisch erstellten Dateien aus verschiedenen Paketen, und dafür ist das Paket no-litteringausgezeichnet.

Radon Rosborough
quelle
1

Ich fügte hinzu

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

zu emacs-lisp-mode-hook. Fügen Sie dann zu den Dateibereichen "yasnippet", "packaging", "java mode" usw. hinzu. Dies funktioniert gut für meine 1000 Codezeilen (einschließlich Kommentare).

EDIT: Zum Schluss wechsle ich mit helm-imenu zwischen den Sektionen. Eigentlich hakt sich der Helm automatisch in die normale Menüfunktion ein, also ist alles was ich brauche

       (local-set-key (kbd "C-*") 'imenu)
Matthias
quelle
Sie könnten eine lokale Dateivariable anstelle eines Hooks verwenden.
YoungFrog
1

Ich habe meine relativ kleine .emacsDatei in drei Teile geteilt:

  • emacs-custom.el für Anpassungen, die viele sperrige und nutzlose Daten auslesen ; Die Datei wird automatisch neu geschrieben, ohne die .emacs-Hauptdatei zu berühren , wodurch falsche Änderungen vermieden werden.

    (setq custom-file "~/.emacs-custom.el")
    (load custom-file)
    
  • lg-lib.el für Code statt Konfiguration: Laden meiner eigenen Bibliotheken von nicht standardmäßigen Quellspeicherorten anstatt aus dem Paketverzeichnis und Definieren verschiedener Funktionen (meistens kopiert und gehackt, wenn kein richtiges Paket vorhanden ist); Dies ist eine weitere erhebliche Reduzierung der .emacs- Zeilenanzahl.

    (load "~/lg-lib")
    
  • Die Haupt- .emacs- Datei: Ohne umfangreichen Code und umfangreiche Anpassungsvariablen enthält sie requireAufrufe für Pakete, Variablen, die nicht Teil des Customize-Systems sind, und verschiedene Funktionsaufrufe zum Laden und Initialisieren von Paketen. Ich "organisiere" es, indem ich alle Zeilen, die sich auf dasselbe Paket oder dieselbe Funktion beziehen, sorgfältig zusammenführe und das Laden von Paketen und paketbezogene Einstellungen von der "Kern" -Funktionalität trenne. Ein ziemlich repräsentativer Auszug:

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

    Diese Abschnitte sind winzig, aber mit viel mehr Konfigurationszeilen für jedes Paket würden sie überschaubar bleiben.

Lorenzo Gatti
quelle
1

Folgen Sie dem Setup eines Emacs-Masters, z. https://github.com/purcell/emacs.d

In Bezug auf die Organisation von manuell installierten Paketen und von ELPA installierten Paketen hat Steven Purcell beispielsweise folgende Einstellungen vorgenommen

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

Warum einem Meister folgen? Ein wichtiger Punkt meiner "Master-Emacs in einem Jahr" ist, dass Neulinge auf diese Weise Setup-Overhead und "Fallstricke" effizient vermeiden können.

Ich verstehe, dass viele Leute mir nicht zustimmen, aber hier ist mein Fall (ausführlich in meinem Artikel ):

Ich habe mit Emacs angefangen, indem ich Purcells angesehene ( 1403 GitHub-Sterne ab November 2014!), Stabile (5 Jahre in der Entwicklung) Konfiguration verwendet habe. Trotzdem hatte ich noch viele Probleme . Steve Purcell hat mir geholfen, all diese Probleme zu lösen. ( Tatsächlich wurde ich über ein Jahr lang sein Padawan .) Indem ich sein Setup und die Probleme seines Repos benutzte, um Probleme zu melden, und seine Erfahrung nutzte, vermied ich es, viel Zeit zu verschwenden. Selbst heute beobachte ich immer noch viele Leute git submodule, die Plugins von Drittanbietern verwalten. Sowohl Steve als auch ich haben es aufgegeben, git submoduledies zu tun, weil es so eine PITA sein kann .

Aber wenn Sie sich Ihrer Fähigkeiten sehr sicher sind oder viel lieber selbst lernen, ist dies nicht der richtige Weg für Sie.

chen bin
quelle
2
" Klonen des Setups vom Master ": Ohne Rücksicht auf die von Ihnen zitierten Referenzen, die möglicherweise wunderbare Funktionen oder Ratschläge enthalten (ich habe sie nicht überprüft), bin ich im Allgemeinen nicht der Meinung, dass Leute damit beginnen sollten, Init-Dateien oder andere Setups von anderen zu klonen. Dies war sogar eine Politik, von der ausdrücklich abgeraten wurde, da sie zu Problemen führen kann. Es ist besser, bei Null anzufangen und sich dessen bewusst zu sein (und es sogar zu verstehen!), Was auch immer Sie als Basis-Setup verwenden. Natürlich ist nichts falsch daran, von dem zu lernen, was andere getan haben. Es ist jedoch nicht ratsam, init-Dateien blind zu kopieren. (Nur eine Meinung.)
Drew
1
Eigentlich schreibe ich meinen Artikel, weil es immer noch viele Leute gibt, die glauben, dass sie beim Setup von vorne anfangen sollten. Es ist nicht der beste Weg für die meisten Leute, wie ich bemerkte, und für Neulinge ein unnötig schwerer Weg. nur suchen
chen bin
1
Es ist " der beste Weg für die meisten Menschen ". Suchen Sie einfach nach Diskussionen und Beratung gegen ausgehend von einer anderen Person init - Datei. Suchen Sie [email protected], und www.emacswiki.org, und [email protected], und sogar debbugs.gnu.org. Das heißt, es ist nichts Falsches daran, seine Init-Datei zu teilen, um anderen als Denkanstoß zu dienen. Der Rat ist für Neulinge, nicht so anzufangen; Der Rat ist nicht für Menschen, ihre eigenen Startup-Ansätze und Tipps nicht zu teilen.
Drew
1
Es ist wegen "Survivorship Bias". Viele Leute geben auf, bevor sie Emacswiki oder Mailinglisten kennen.
Chen Bin
0

Eine innovative und einfache Möglichkeit, Ihren .emacs.dOrdner zu bereinigen, besteht darin, org-modealles mithilfe von Quellblöcken zu verwenden und darzustellen . Zeigen Sie dann in Ihrer .emacsDatei auf config.org.

Eine wunderbare Ressource dafür ist Harry Schwartz. Er hat ein YouTube-Video , das berührt, und einen Blog-Beitrag, der die Details erklärt . Ich konnte es als Emacs Noob verfolgen und alles einrichten. Klappt wunderbar. 1 Datei für mein gesamtes init.

SeaDude
quelle