Organiser le contenu de ~ / .emacs.d / init.el et ~ / emacs.d?

28
  1. Lorsque nous ajoutons de plus en plus de lignes ~/.emacs.d/init.elà diverses fins (pour le mode python, pour emacs-eclim, pour ...), le fichier devient long et moins lisible. Existe-t-il un moyen d'aider à organiser son contenu?
  2. Mon courant ~/.emacs.dressemble à ceci

    $ 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.3a été installé manuellement, tandis que a emacs-eclim-20140809.207été installé par elpa, et je ne suis pas sûr à 100% que les autres éléments sous elpa/soient par elpa. Comment puis-je organiser le contenu de ~/.emacs.d/?

Tim
la source

Réponses:

32

Les utilisateurs de petits éditeurs aiment diviser leur code en plusieurs fichiers. Si vous utilisez Emacs, il n'y a aucune raison de le faire: utilisez simplement un seul gros fichier, que vous divisez en sections.

Chaque section doit commencer par

^L
;;; title of the section

où vous insérez le ^Lcaractère en tapant C-q C-l. Vous pouvez ensuite utiliser des commandes telles que C-x ]( forward-page) ou C-x n p( narrow-to-page) pour parcourir le fichier. Voir la section 25.4 (Pages) du manuel Emacs pour plus d'informations.

jch
la source
16
Il n'y a également aucune raison particulière de ne pas diviser le code en plusieurs fichiers. Cela dépend de ce que vous voulez que le regroupement de choses signifie - comment vous voulez qu'il se comporte. Et cela peut dépendre de la taille de LARGE. Et cela peut dépendre du partage de morceaux de votre code avec d'autres, comme des bibliothèques, par exemple.
attiré
2
En se basant sur les commentaires de @ Drew, l'utilisateur peut souhaiter avoir différentes configurations pour différentes versions et environnements emacs et charger l'élisp approprié en conséquence. Cela dit, j'aime la pointe de pagination.
Harvey
3
@Harvey: la pagination et l'utilisation de fichiers séparés sont des moyens indépendants d'organiser le texte. Vous pouvez évidemment utiliser les deux. J'utilise la pagination dans toutes mes bibliothèques, pour séparer les sections. Mais j'ai également des bibliothèques (fichiers) distinctes.
Drew
1
@jch Si vous utilisez ce style, vous souhaiterez peut-être également activer le mode mineur de contour ou une fonction similaire, pour permettre le pliage des sections et des fonctions. Plier toutes les en-têtes de niveau supérieur vous donne un bon aperçu de toutes les sections de votre configuration Emacs.
lunaryorn
@lunaryorn, j'ai essayé, mais je l'ai trouvé gênant - je trouve que les commandes de déplacement de page sont suffisantes la plupart du temps, je n'ai besoin que de restreindre occasionnellement. Peut-être mon .emacset .wlne sont pas assez longs.
2014
20

Une manière classique de procéder consiste à diviser votre .emacsfichier en fichiers séparés. Par exemple, vous pouvez déplacer tous vos contenus Web, ~/.emacs.d/web-config.elpuis les charger à l'intérieur init.el:

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

Si vous souhaitez garder votre ~/.emacs.dun peu plus organisé, vous pouvez également déplacer ces fichiers de configuration dans leur propre répertoire:

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

Maintenant, vous pouvez simplement accéder au fichier approprié lorsque vous apportez des modifications à votre configuration.

Une chose qui manque à cela est les variables définies via le système de personnalisation. Ceux-ci seront toujours tous dans votre init.el principal. Apparemment, il existe un petit utilitaire appelé init split qui vous permet de définir les paramètres de personnalisation, mais je ne l'ai jamais utilisé moi-même. Alternativement, le système «personnaliser» peut être configuré pour utiliser un fichier séparé pour ses modifications de vos paramètres. Définissez la custom-filevariable pour spécifier où les paramètres de «personnalisation» doivent être lus et écrits .

En ce qui concerne le répertoire lui-même, j'ai toujours été satisfait de la disposition par défaut. La principale modification que j'ai apportée a été la création d'un répertoire pour tous mes propres packages et bibliothèques personnalisés qui ne sont pas gérés par package.el. Cela donne une maison unique à mon elisp personnalisé qui n'est pas lié à la configuration.

Tikhon Jelvis
la source
Merci. (1) quel est le répertoire des packages et bibliothèques gérés par package.el? (2) Le contenu du répertoire est-il elpagéré par elpa? Puis-je les déplacer ailleurs?
Tim
2
Vous pouvez spécifier un fichier distinct pour les variables de personnalisation en définissant la custom-filevariable. Source
Kaushal Modi
@Tim: Le répertoire géré par package.el est elpa. Elpa n'est pas un package lisp, c'est un référentiel de packages. Package.el ajoutera toujours tous les packages qu'il installe (que ce soit à partir d'elpa ou d'un autre référentiel --- par exemple dans votre cas, je ne pense pas que eclim et s proviennent d'elpa) dans le répertoire elpa. Et oui, vous ne devriez pas avoir à vous soucier du contenu de ce répertoire.
T. Verron
(Impossible de modifier plus) Ce que j'ai écrit ci-dessus n'est pas rigoureusement vrai: elpa est le format des archives du paquet, package.el est le gestionnaire de paquet. Pour l'utilisateur, il n'y a pas de réelle différence entre les deux. Mon commentaire ci-dessus confond elpa avec GNU elpa, qui est l'un des packages elpa disponibles (et le seul officiel).
T. Verron
16

Si vous aimez le mode Org, vous pouvez l'utiliser pour organiser votre .emacssans le diviser. Dans ma configuration actuelle, mon .emacsfichier démarre simplement un fichier init.org que j'ai sous~/.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")))

En utilisant différents fichiers, vous devez au greplieu de C-srechercher simplement quelque chose, etc. De plus, il est plus facile d'ajouter plusieurs niveaux à votre organisation.

rlazo
la source
1
Je suis actuellement en train de le faire, même si je ne pensais pas l'utiliser org-babel-load-file. Doux! (Exemples: github.com/vermiculus/dotfiles/blob/… , github.com/larstvei/dot-emacs )
Sean Allred
Plus d'informations sur l'utilisation du mode org pour la configuration Emacs sur cette question: Puis-je utiliser le mode org pour structurer mon .emacs ou un autre fichier de configuration .el?
ShreevatsaR
9

Déplacez simplement des morceaux de code init.eldans des fichiers séparés (bibliothèques), que vous avez ensuite require. (À utiliser providedans les bibliothèques pour être required.) Placez ces fichiers où vous le souhaitez et mettez-les à jour en load-pathconséquence.

A dessiné
la source
Merci. (1) par exemple? (2) que proposez-vous pour organiser ~ / .emacs.d /?
Tim
1
Qu'entendez-vous par "organiser le contenu de ~/.emacs.d/? Vous n'offrez aucune spécification de ce que vous voulez. Vous n'êtes pas obligé de tout avoir dans un seul répertoire. Vous pouvez mettre des choses où vous voulez et les modifier en load-pathconséquence. Si un programme / outil ne met que choses dans ~/.emacs.d/( par exemple, si vous ne pouvez pas dire où mettre des choses), puis déplacez - le où vous voulez après ce programme / outil est fait.
Drew
1
Qu'entendez-vous par «par exemple»? De quoi voulez-vous un exemple? (require 'foobar)est un exemple d'utilisation require. (add-to-list 'load-path "/my/lisp/dir")est un exemple de modification load-path. (provide 'foobar)est un exemple d'utilisation provide.
Drew
par "organiser le contenu de ~ / .emacs.d /, moi, en tant qu'humain, je peux mieux le comprendre, pas pour qu'emacs le comprenne. C'est une habitude, tout comme l'organisation de votre armoire, tiroirs, étagères. Par exemple, python -mode.el-6.1.3 a été installé manuellement, tandis qu'emacs-eclim-20140809.207 a été installé par elpa. S'agit-il des deux packages? Si tel est le cas, est-ce une bonne idée de les placer dans un sous-répertoire de ~ / .emacs.d /?
Tim
Vous êtes l'homme qui peut répondre à quelle organisation pourrait vous aider à mieux la comprendre. (Emacs ne comprend rien.) Utilisez la structure de dossiers que vous souhaitez. Appelez-les armoires, tiroirs, étagères ou simplement dossiers. Et encore une fois, vous init.elpouvez charger des bibliothèques situées n'importe où , pas seulement à l'intérieur ~/.emacs.d/.
Drew
7

J'utilise la suggestion de targzeta trouvée dans le répertoire Emacs Wiki: Load .

Fondamentalement, j'ai un ~ / .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)))))))

Ensuite, je mets juste des fichiers séparés dans mon ~ / .emacs.d / config:

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

Et enfin j'ai ceci dans mon ~ / .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
la source
Ils veulent que nous fournissions plus d'informations qu'un simple lien - par exemple, une description sommaire de ce qui se trouve sur ce lien.
Drew
Vous avez raison, j'ai modifié ma réponse.
Boccaperta-IT
Hm. Par courtoisie, au moins, vous devriez probablement dire que le code que vous avez glissé textuellement a été écrit par targzeta . Résumer une page référencée ne signifie pas plagier son contenu. (Bien sûr, si vous êtes targzeta, il n'y a probablement aucun problème.)
Tiré
Vous avez encore raison, édité. Merci.
Boccaperta-IT
Merci. (Je sais que cela prend un peu de temps pour bien faire les choses, mais cela aide tout le monde un peu plus.)
Drew
5

Il y a évidemment plus d'une façon de dépouiller ce chat en particulier. Mon préféré actuel est d'utiliser outline-minor-modeavec outshine . Extrait:

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

Notez que vous devrez sortir de votre référentiel de packages préféré.

Harald Hanche-Olsen
la source
1
J'ai commencé avec le mode contour mineur, mais j'ai trouvé les raccourcis trop douloureux et je n'ai jamais vraiment trouvé le temps de faire quoi que ce soit moi-même. Je suis donc passé en mode orgstruct après avoir découvert le mode org, mais j'ai découvert l'outshine. Félicité! J'utilise actuellement contour + outshine pour toute ma structuration de fichiers elisp, latex et autres avec leur propre mode majeur, et le mode org pour toutes sortes de notes.
Harald Hanche-Olsen
2

J'utilise la structure suivante pour garder une trace des packages et des fichiers

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

J'utilise ensuite use-packagepour gérer quels packages sont chargés et quelles personnalisations sont définies pour chaque package. La plupart du temps uniquement hacket elpanécessitent une mise à jour, les autres dossiers sont souvent destinés à des packages ponctuels que je souhaite tester ou utiliser brièvement mais que je n'ai pas besoin de charger (même inactif).

custom.el est pour les paramètres de personnalisation, que je préfère ne pas utiliser (et ne pas utiliser de version même si j'utilise).

defaults.elest pour la configuration générale (barre de menus, police, encodage, etc.) qui peut ensuite être écrasée dans n'importe quel fichier .el user-config/pour permettre un système qui fonctionnera comme je m'y attendais, mais qui peut être ajusté pour s'adapter à l'environnement.

J'avais déjà essayé de garder functions, macros, advicedans des emballages séparés pour permettre la délimitation entre le contenu, mais dans la définition RAN / require questions ont donc mis de nouveau dans les init.el. Ils peuvent éventuellement être réintégrés ~/.emacs.d/lisp/.

J'essaie de garder en init.elordre, de trier le contenu par fonction et par but afin que le retrouver soit simple. J'ai eu le init.elfichier monolithique et j'ai continué à ajouter du nouveau contenu à la fin (ou à l'endroit où je pensais qu'il pouvait convenir) et je finissais par ne pas savoir ce que j'avais ajouté ou où je l'avais ajouté quand je suis allé le chercher (et parfois, la recherche à l'aide isearchn'a pas aidé car je ne me souvenais pas comment j'avais nommé les choses à l'époque).

Jonathan Leech-Pepin
la source
2

Toutes les réponses existantes traitent des meilleures pratiques pour organiser des fichiers créés manuellement , comme init.elet amis. L'organisation de tous les fichiers créés automatiquement à partir de divers packages est tout aussi importante , et pour cela, le package no-litteringest excellent.

Radon Rosborough
la source
1

J'ai ajouté

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

à emacs-lisp-mode-hook. Ajoutez ensuite au fichier les sections "yasnippet", "packaging", "mode java", etc. Cela fonctionne bien pour mes 1000 lignes de code (commentaires inclus).

EDIT: Enfin, je passe d'une section à l'autre avec helm-imenu. En fait, la barre se connecte automatiquement à la fonction imenu normale, donc tout ce dont j'ai besoin est

       (local-set-key (kbd "C-*") 'imenu)
Matthias
la source
Vous pourriez utiliser une variable locale de fichier au lieu d'un hook.
YoungFrog
1

J'ai divisé mon .emacsfichier relativement petit en trois parties:

  • emacs-custom.el pour les personnalisations, arrachant de nombreuses données volumineuses et inutiles; le fichier est automatiquement réécrit sans toucher au fichier .emacs principal , empêchant les modifications parasites.

    (setq custom-file "~/.emacs-custom.el")
    (load custom-file)
    
  • lg-lib.el pour le code plutôt que pour la configuration: charger mes propres bibliothèques à partir d'emplacements sources non standard plutôt que depuis le répertoire des packages et définir diverses fonctions (principalement copiées et piratées en l'absence d'un package approprié); il s'agit d'une autre réduction importante du nombre de lignes .emacs .

    (load "~/lg-lib")
    
  • Le fichier .emacs principal : sans code volumineux et variables de personnalisation volumineuses, il contient des requireappels de packages, des variables qui ne font pas partie du système Customize et des appels de fonctions assortis pour charger et initialiser des packages. Je "l'organise" en gardant soigneusement toutes les lignes se rapportant au même package ou à la même fonctionnalité, et en séparant davantage le chargement du package et les paramètres liés au package de la fonctionnalité "de base". Un extrait assez représentatif:

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

    Ces sections sont minuscules, mais elles resteraient gérables avec beaucoup plus de lignes de configuration pour chaque package.

Lorenzo Gatti
la source
1

Suivez la configuration d'un maître Emacs, par exemple, https://github.com/purcell/emacs.d

Par exemple, concernant la façon d'organiser les packages installés manuellement et les packages installés à partir d'ELPA, la configuration de Steven Purcell a

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

Pourquoi suivre un maître? Un point majeur de mon "Master emacs en un an" est que les débutants peuvent ainsi éviter efficacement les frais généraux de configuration et les "accrochages".

Je comprends que beaucoup de gens ne sont pas d'accord avec moi, mais voici mon cas (détaillé dans mon article ):

J'ai commencé à utiliser Emacs en utilisant la configuration très respectée de Purcell ( 1403 étoiles GitHub en novembre 2014!), Stable (5 ans de développement). Malgré cela, j'avais encore beaucoup de problèmes . Steve Purcell m'a aidé à résoudre tous ces problèmes. (Je suis en fait devenu son Padawan pendant plus d'un an.) En utilisant sa configuration, en utilisant les problèmes de son référentiel pour signaler des problèmes et en profitant de son expérience, j'ai évité de perdre beaucoup de temps. Même aujourd'hui, j'observe encore de nombreuses personnes utilisant git submodulepour gérer les plugins tiers. Steve et moi avons renoncé à l'utiliser git submodulepour cela car cela peut être un tel PITA .

Mais si vous êtes très confiant dans vos compétences ou si vous préférez de loin l'auto-apprentissage, ce n'est pas la voie qui vous convient.

chen bin
la source
2
" Clonage de la configuration à partir du maître ": Sans égard particulier aux références que vous citez, qui pourraient fournir de merveilleuses fonctionnalités ou des conseils (je n'ai pas vérifié), je ne suis pas d'accord en général sur le fait que les gens devraient commencer par cloner des fichiers init ou d'autres configurations d'autres. Cela a même été une politique explicitement découragée, l'IIRC, car elle peut entraîner des problèmes. Mieux vaut partir de zéro et être conscient (et même comprendre!) De tout ce que vous utilisez comme configuration de base. Bien sûr, il n'y a rien de mal à étudier et à apprendre de ce que les autres ont fait. Mais la copie aveugle des fichiers init n'est pas recommandée. (Juste une opinion.)
Drew
1
en fait, j'écris mon article car il y a encore beaucoup de gens qui pensent qu'ils devraient recommencer à zéro sur la configuration. ce n'est pas le meilleur moyen pour la plupart des gens, comme je l'ai observé, et un moyen inutilement difficile pour les débutants. il suffit de chercher
chen bin
1
Il est « la meilleure façon pour la plupart des gens ». Recherchez simplement des discussions et des conseils pour ne pas commencer en utilisant le fichier init de quelqu'un d'autre. Rechercher [email protected], et www.emacswiki.org, et [email protected], et même debbugs.gnu.org. Cela dit, il n'y a rien de mal à partager son fichier init, à servir aux autres comme matière à réflexion. Le conseil est pour les débutants de ne pas commencer de cette façon; le conseil n'est pas pour les gens de ne pas partager leurs propres approches et astuces de démarrage.
Drew
1
C'est à cause du "biais de survie". Beaucoup de gens abandonnent avant de connaître emacswiki ou liste de diffusion.
chen bin
0

Un moyen innovant et simple de nettoyer votre .emacs.ddossier est d'utiliser org-modeet de décrire tout en utilisant des blocs source. Ensuite, dans votre .emacsfichier, pointez sur votre config.org.

Harry Schwartz est une merveilleuse ressource à ce sujet. Il a une vidéo youtube qui touche et un blog qui explique les détails . J'ai pu le suivre en tant que noob emacs et obtenir toutes les configurations. Fonctionne comme un charme. 1 fichier pour mon entier init.

SeaDude
la source