web-dev-qa-db-fra.com

Comment accélérer le démarrage d'Emacs?

J'utilise Emacs v. 22 (la version console, soit à distance avec PuTTY ou localement avec Konsole ) comme éditeur de texte principal sous Linux. Il faut un certain temps pour charger chaque fois que je le démarre, probablement presque une seconde, même si je ne l'ai jamais chronométré. J'ai tendance à ouvrir et fermer beaucoup Emacs, car je suis plus à l'aise avec la ligne de commande Bash pour la manipulation et la compilation de fichiers/répertoires.

Comment puis-je accélérer le temps de démarrage?

67
Colin

En plus de la solution d'Adam Rosenfield , je recommande d'utiliser Emacs en mode serveur . Vous pouvez ajouter (server-start) à vos dotemacs et exécutez emacsclient au lieu de emacs chaque fois que vous souhaitez ouvrir un fichier dans Emacs. De cette façon, vous ne devez payer le coût de chargement d'Emacs qu'une seule fois, après quoi les clients apparaissent immédiatement.

Modifier

Vous avez raison, la v22 ne crée pas de nouveau cadre. Créez un script Shell qui fera l'affaire:

#!/bin/bash
# Argument: filename to open in new Emacs frame
/usr/bin/emacsclient -e '(let ((default-directory "`pwd`/")) (select-frame (make-frame)) (find-file "'$1'"))'
37
Török Gábor

D'autres ont couvert l'utilisation de gnuserve et emacsclient, et je suggérerais de compiler dans emacs (pouvoir passer aux erreurs de compilation est une victoire).

Mais, en accélérant spécifiquement le .emacs, vous pouvez:

  1. Octet compilant le fichier .emacs, ce que vous pouvez faire automatiquement en utilisant cet extrait de code

  2. Remplacement d'autant de (require 'package) instructions avec fonction autoload ed. Cela retardera le chargement de LISP jusqu'à ce qu'il soit réellement requis. L'utilisation de cette technique m'a permis d'accélérer mon démarrage de> 6 secondes à <1. Cela demande un peu de travail car toutes les bibliothèques ne sont pas correctement marquées autoload.

  3. Suppression du code/des fonctionnalités que vous n'utilisez plus.

  4. Essayez d'exécuter emacs avec l'option --no-site-file pour éviter de charger des packages inutiles dans l'installation du site site-start.el.

  5. Si vous êtes vraiment sérieux, vous pouvez rouler vos propres emacs avec votre fonctionnalité préférée déjà chargée. Cela signifie, bien sûr, qu'il est plus compliqué d'apporter des modifications à ce que vous avez dans votre .emacs car il fait partie du binaire. Suivez le lien pour savoir comment utiliser dump-emacs .

  6. Achetez un ordinateur et/ou un disque plus rapide.

Comment déterminer ce que votre .emacs charge

Maintenant, comment savoir ce que charge votre .emacs? Dans le but de supprimer la fonctionnalité ou de la retarder? Vérifiez votre *Messages* tampon, qui contient des lignes comme:

 Chargement de /home/tjackson/.emacs.tjackson.el (source) ... 
 Chargement de /home/tjackson/installed/emacs/LISP/loaddefs.el (source) ... terminé 
 Chargement /user/tjackson/.elisp/source/loaddefs.el (source) ... terminé 
 Chargement auto-inversé ... terminé 
 Chargement /home/tjackson/.emacs .tjackson.el (source) ... fait 

Si vous remarquez, les instructions Loading peuvent s'imbriquer: la première .emacs.tjackson.el se termine par ... et la dernière ligne affiche le .emacs.tjackson.el la charge est ...done. Tous ces autres fichiers sont chargés depuis mon .emacs.tjackson.el fichier. Toutes les autres charges sont atomiques.

Remarque: Si vous avez un grand .emacs, il est possible que le *Messages* le tampon perdra certains messages car il ne conserve qu'une quantité fixe d'informations. Vous pouvez ajouter ce paramètre très tôt à votre .emacs pour conserver tous les messages:

(setq message-log-max t)

Remarque: C'est le 'load La commande supprimera les messages si son quatrième argument nomessage est non nul, donc supprimez toutes ces invocations (ou, conseillez 'load et forcez le quatrième argument à être nil).

58
Trey Jackson

Ne fermez pas Emacs chaque fois que vous souhaitez utiliser le shell. Utilisez Ctrl-Z pour déplacer Emacs en arrière-plan et la commande fg dans Bash pour le ramener au premier plan.

28
hiena

Quelques conseils:

  1. Utiliser les chargements automatiques

    L'utilisation du chargement automatique vous évite de charger des bibliothèques jusqu'à ce que vous les utilisiez. Par exemple:

    (if (locate-library "ediff-trees")
        (autoload 'ediff-trees "ediff-trees" "Start an tree ediff" t))
    
  2. Compilez vos .emacs

    Vous donne une légère augmentation de vitesse bien qu'il y ait des pièges si vous travaillez avec le contrôle de version et que votre .emacs est plus récent que .emacs.elc. Une astuce courante est:

    (defun autocompile nil
      "compile itself if ~/.emacs"
      (interactive)
      (require 'bytecomp)
      (let ((dotemacs (file-truename user-init-file)))
        (if (string= (buffer-file-name) (file-chase-links dotemacs))
          (byte-compile-file dotemacs))))
    
    (add-hook 'after-save-hook 'autocompile)
    
  3. Apprenez à aimer le serveur emacs.

    Exécuter emacs en tant que serveur signifie ne jamais avoir à le fermer. Cependant, je note que vous utilisez toujours emacs22. emacs23 prend en charge multi-tty, ce qui facilite grandement l'exécution d'emacs dans une session d'écran, puis l'affichage de nouvelles fenêtres dans un autre terminal. J'utilise emacs pour modifier le courrier de mon client de messagerie (mutt) et emacsclient est fantastique pour ce genre de modifications rapides.

21
stsquad

Un des

M-x Shell
M-x eshell
M-x term
M-x ansi-term

devrait répondre à vos besoins en ligne de commande depuis Emacs.

Vous pouvez aussi utiliser M-! (alias M-x Shell-command) pour exécuter un one-liner sans passer au Shell.

19
Chris Conway

Vérifier votre .emacs fichier pour voir si vous chargez des paquets inutiles. Le chargement des packages peut prendre un temps considérable. Par exemple, vous souhaiterez peut-être uniquement charger le php-mode package si vous éditez un fichier PHP. Vous pouvez le faire en installant une procédure de hook, bien que je ne sois pas certain des détails.

Assurez-vous également que tous les packages que vous chargez sont compilés (.elc des dossiers). Vous pouvez compiler un fichier elisp en exécutant

emacs -batch -f batch-byte-compile thefile.el

Les packages compilés se chargent beaucoup plus rapidement que les packages non compilés.

14
Adam Rosenfield

"J'ai tendance à beaucoup ouvrir et fermer emacs, car je suis plus à l'aise avec la ligne de commande bash pour la manipulation et la compilation de fichiers/répertoires."

Vous décrivez la façon dont un éditeur comme vim est utilisé. Tirez dedans et dehors. Emacs est généralement maintenu ouvert, et la plupart du temps, tout est fait "à l'intérieur". Hiena a déjà répondu quelle serait la bonne approche ici.

13
Rook

Le moyen le plus rapide est de profiler votre .emacs . J'ai réduit mon temps de chargement de> 3s à 1s en 5 minutes après avoir constaté que 4 lignes particulières dans mes .emac prenaient plus de 80% du temps de chargement.

11
Vicky Chijwani

Une chose qui m'a aidé à réduire le temps de chargement de mon .emacs, en plus de autoload (comme d'autres l'ont suggéré), est eval-after-load . Dans l'exemple suivant, retarder l'appel à sql-set-product vous évite d'avoir à charger sql dans votre .emacs, ce qui rend les chargements automatiques sql existants plus efficaces.

 (eval-after-load "sql" 
 '(progn 
 (sql-set-product' mysql) 
 (setq sql-mysql-options '( "-C" "-t" "-f" "-n")) 
 (Setq sql-sqlite-program "sqlite3") 
)) 

Bien sûr, pour certains paquets, il y aura un hook disponible que vous pouvez faire la même chose, mais parfois il n'y en a pas, ou bien cette façon s'avère simplement plus facile à penser.

9
Jacob Gabrielson

Emacs est conçu pour fonctionner "tout le temps" (ou au moins pendant de longues périodes), il n'est donc pas recommandé de démarrer et d'arrêter Emacs plusieurs fois par jour.

Je suggère d'utiliser l'écran. Screen est un multiplexeur de terminaux, vous offrant un nombre illimité de terminaux virtuels dans un seul terminal.

Après l'installation, écrivez simplement "screen emacs" dans votre terminal. Emacs démarrera comme d'habitude, mais en appuyant sur "c-a c" (c'est-à-dire appuyez sur ctrl-a puis sur c) ouvrira un nouveau terminal virtuel. Vous pouvez revenir à emacs en appuyant sur "c-a c-a" (c'est deux fois ctrl-a).

Vous pouvez même vous détacher de la session d'écran en cours, la séquence de touches est "c-a d".

Re-attachez-vous à la session en émettant "screen -R" et vous serez de retour là où vous êtes parti. Cela vous permet de démarrer une session emacs au travail, de vous détacher, de rentrer chez vous et de vous reconnecter de chez vous.

J'ai utilisé Emacs comme ça pendant des mois d'affilée.

Voici le site web officiel: http://www.gnu.org/software/screen/ mais essayez de googler pour les tutoriels d'écran et les howtos

8
slu

Vous pouvez utiliser benchmark-init pour profiler votre démarrage Emacs. Il gardera une trace de quels modules sont chargés et combien de temps est passé sur chacun. Les résultats peuvent être présentés sous forme de tableau ou sous forme d'arbre. L'arborescence facilite le suivi de qui charge quoi, ce qui peut être utile lorsque vous chargez un package avec beaucoup de dépendances, et le formulaire tabulé vous aide à trouver rapidement où la plupart du temps est passé.

Une fois ces résultats obtenus, essayez de déterminer si tous les modules doivent être chargés en permanence ou si vous pouvez peut-être en charger certains à la demande. Par exemple, dans ma configuration, je charge uniquement les extensions Emacs qui sont spécifiques à certains modes lorsque ce mode est réellement activé, car la plupart du temps, j'en utilise uniquement un petit sous-ensemble dans une session. eval-after-load et les hooks de mode seront vos amis ici.

En appliquant cette méthode mon Emacs démarre en 3-4 secondes et j'ai près de 200 extensions installé. La plupart du temps est consacré au chargement de Helm, que je charge toujours car il remplace find-file et d'autres fonctions de base qui sont toujours nécessaires, et CEDET, car j'utilise la dernière version et il doit être chargé avant qu'Emacs essaie de charger l'ancienne. version intégrée.

5
David Holm

J'ai eu environ 120 secondes de départ. J'ai pu trouver le correctif en installant ceci:

https://github.com/dholm/benchmark-init-el placé au-dessus de votre init.el

(let ((benchmark-init.el "~/.emacs.d/el-get/benchmark-init/benchmark-init.el"))
  (when (file-exists-p benchmark-init.el)
    (load benchmark-init.el)))

puis une fois vos emacs démarrés, lancez:

M-x benchmark-init/show-durations-tree

De mon côté, le problème était de 127 secondes dans tramp-loaddefs

Je l'ai corrigé en ajoutant

127.0.0.1  Host.does.not.exist

à /etc/hosts et cela a rendu mon démarrage rapide

voir plus ici: https://github.com/emacs-helm/helm/issues/1045

une autre chose qui peut vous être utile: https://www.emacswiki.org/emacs/ProfileDotEmacs

4
DmitrySemenov

Une chose que d'autres n'ont pas mentionnée est d'inclure les bibliothèques elisp que vous utilisez dans le cadre de dumped Emacs pour déplacer le temps de chargement de la bibliothèque du démarrage d'Emacs à la construction d'Emacs. Ce n'est pas pour les timides, mais si vous chargez plusieurs bibliothèques dans .emacs cela pourrait vous faire gagner quelques secondes de temps de démarrage.

4
Jouni K. Seppänen

Cela ne répond pas à la question, mais est plutôt pertinent

Je ne sais pas comment accélérer le démarrage, mais il y a quelques choses que je pourrais suggérer:

  • pour la plupart des choses que vous faites sur la ligne de commande, vous pouvez les faire dans emacs:

    • compiler: compiler M-x, puis taper la commande que vous utilisez
    • mon expérience est uniquement avec C++, mais avec g ++, vous pouvez appuyer sur C-x `pour accéder aux lignes dont le compilateur se plaint
    • exécuter les commandes Shell: M- !, décharge la sortie dans un tampon
    • shell interactif: Shell M-x
  • vous pouvez également exécuter emacs comme ceci:

    • emacs file.ext &
    • qui ouvre emacs en arrière-plan pour que vous puissiez toujours utiliser le shell (cela fonctionne mieux avec PuTTY et le transfert X avec quelque chose comme Xming)
3
clawr

Essayez d'utiliser la macro https://github.com/jwiegley/use-package pour définir les charges et les personnalisations de votre package. Il gère le chargement différé des packages pour vous, ce qui facilite l'obtention de bons temps de démarrage même en présence d'un grand nombre de packages configurés. J'ai près de 100 packages référencés dans mes .emacs, mais mon temps de démarrage est inférieur à 2 secondes sous Linux et 2.2s sur Mac.

3
John Wiegley

J'essayais de résoudre le même problème, quand je suis tombé sur cette question ici. Je voulais juste ajouter que le problème pour moi n'était pas dû au temps de chargement des paquets emacs LISP, mais au fait que l'hôte n'avait pas de nom d'hôte entièrement résolu

Pour vérifier le temps de chargement de votre colis, faites

M-x emacs-init-time

Pour moi, c'était 0,3 seconde, et pourtant le temps de chargement était extrêmement élevé. Après avoir changé mon nom d'hôte correctement, cela a résolu le problème.

Pour configurer votre nom d'hôte entièrement résolu, éditez/etc/hostname et/etc/hostsfile avec:

127.0.0.1       localhost localhost.localdomain
192.168.0.2   hostname hostname.domain
2
tsar2512

Je devrais vérifier ma personnalisation, mais il existe un paquet appelé gnuserve ou emacsclient. Il migre beaucoup, vous devrez donc le rechercher sur Google.

Il exécute une session emacs en arrière-plan. Toutes les autres sessions d'emacs ne sont essentiellement que de nouvelles images de cette session. Un avantage est le temps de démarrage rapide pour vos sessions ultérieures.

1
BubbaT