J’utilise Emacs v. 22 (la version console, à distance avec PuTTY ou localement avec Konsole ) en tant qu’éditeur de texte principal sous Linux. Cela prend un certain temps à charger à chaque fois que je le lance, 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?
En plus de la solution d’Adam Rosenfield , je recommande d’utiliser Emacs en mode serveur . Vous pouvez append (server-start)
à vos dotemacs et exécuter emacsclient
au lieu de emacs
chaque fois que vous voulez ouvrir un fichier dans Emacs. De cette façon, vous devez payer le coût de chargement d’Emacs une seule fois, après quoi les clients apparaissent immédiatement.
modifier
Vous avez raison, la v22 ne crée pas de nouvelle image. Créez un script shell qui fait 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'"))'
D’autres ont traité de l’utilisation de gnuserve
et d’ emacsclient
, et je suggérerais de comstackr avec emacs (être capable de sauter aux erreurs de compilation est un gain).
Mais, en accélérant spécifiquement les fichiers .emac, vous pouvez:
Byte comstackr le fichier .emacs, que vous pouvez faire automatiquement en utilisant cet extrait de code
Remplacer autant d’instructions (require 'package)
par la fonctionnalité ed auto-load . Cela retardera le chargement du lisp jusqu’à ce qu’il soit réellement requirejs. 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 autoload
.
Supprimer le code / la fonctionnalité que vous n’utilisez plus.
Essayez d’exécuter emacs avec l’option --no-site-file
pour éviter de charger des paquets inutiles dans le site d’installation du site-start.el
.
Si vous êtes vraiment sérieux, vous pouvez lancer vos propres emacs avec vos fonctionnalités préférées déjà chargées. Cela signifie, bien sûr, qu’il est plus compliqué d’apporter des modifications à ce que vous avez dans vos .emacs
car cela fait partie du binary. Suivez le lien pour plus d’informations sur l’utilisation de dump-emacs
.
Achetez un ordinateur plus rapide et / ou un disque plus rapide.
Maintenant, comment trouvez-vous ce que vos charges .emacs charge? Dans le but de supprimer la fonctionnalité ou de la retarder? Vérifiez votre tampon *Messages*
, qui contient des lignes telles que:
Chargement /home/tjackson/.emacs.tjackson.el (source) ... Chargement /home/tjackson/installed/emacs/lisp/loaddefs.el (source) ... terminé Chargement de /user/tjackson/.elisp/source/loaddefs.el (source) ... terminé Chargement automatique ... fait Chargement /home/tjackson/.emacs.tjackson.el (source) ... terminé
Si vous remarquez, les instructions Loading
peuvent être .emacs.tjackson.el
: le premier .emacs.tjackson.el
se termine par ...
et la dernière ligne indique que le chargement de .emacs.tjackson.el
est ...done
. Tous ces autres fichiers sont chargés depuis mon fichier .emacs.tjackson.el
. Toutes les autres charges sont atomiques.
Remarque: Si vous avez un fichier .emac volumineux, il est possible que le tampon *Messages*
perd certains messages car il ne conserve qu’une quantité fixe d’informations. Vous pouvez append ce paramètre à vos .emacs
pour conserver tous les messages:
(setq message-log-max t)
Remarque: Si la commande de 'load
supprime les messages si le nomessage
son quasortingème argument est non nul, supprimez ces invocations (ou conseillez 'load
et forcez le quasortingème argument à être nil
).
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 déplacer au premier plan.
Quelques conseils:
Utiliser les autoloads
L’utilisation de l’autoload vous évite de charger les 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))
Comstackz vos .emacs
Vous donne une légère augmentation de la 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. Un truc commun est:
(defun autocomstack nil "comstack itself if ~/.emacs" (interactive) (require 'bytecomp) (let ((dotemacs (file-truename user-init-file))) (if (ssortingng= (buffer-file-name) (file-chase-links dotemacs)) (byte-comstack-file dotemacs)))) (add-hook 'after-save-hook 'autocomstack)
Apprenez à aimer le serveur emacs.
Exécuter emacs en tant que serveur signifie ne jamais avoir à le fermer. Cependant, je remarque que vous utilisez toujours emacs22. emacs23 supporte le multi-tty, ce qui rend beaucoup plus facile l’exécution d’emacs en une seule session d’écran, puis ouvre de nouvelles fenêtres dans un autre terminal. J’utilise emacs pour éditer le courrier pour mon client de messagerie (mutt) et emacsclient est fantastique pour ce type de modifications rapides.
Un des
Mx shell Mx eshell Mx term Mx ansi-term
devrait répondre à vos besoins en ligne de commande à partir d’Emacs.
Vous pouvez également utiliser M-!
(aka Mx shell-command
) pour exécuter un one-liner sans tomber sur le shell.
Vérifiez votre fichier .emacs
pour voir si vous chargez des paquets inutiles. Le chargement des paquets peut prendre beaucoup de temps. Par exemple, vous pouvez uniquement charger le package php-mode
si vous modifiez 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 les paquets que vous chargez sont compilés (fichiers .elc
). Vous pouvez comstackr un fichier elisp
en exécutant
emacs -batch -f batch-byte-comstack thefile.el
Les paquets compilés sont beaucoup plus rapides que les paquets non compilés.
“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.”
Vous décrivez la façon dont un éditeur comme vim est utilisé comme. Tirez in & out. Emacs est généralement maintenu ouvert, et la plupart du temps, tout est fait à partir de l’intérieur. Hiena a déjà répondu à ce qui serait la bonne approche ici.
Le moyen le plus rapide est de profiler vos .emacs . J’ai réduit mon temps de chargement de> 3 s à 1 s en 5 minutes après avoir constaté que 4 lignes particulières de mes fichiers .emac prenaient plus de 80% du temps de chargement.
Une chose qui m’a aidé à réduire le temps de chargement de mes .emacs
, en plus du autoload
(comme d’autres l’ont suggéré), est eval-after-load . Dans l’exemple suivant, le fait de retarder l’appel à sql-set-product
vous évite d’avoir à charger sql
dans vos .emacs
, ce qui rend les autoloads 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 pour que vous puissiez faire la même chose, mais parfois il n’y en a pas, ou bien cette façon de faire est plus facile à penser.
Emacs est conçu pour fonctionner “tout le temps” (ou du moins pendant de longues périodes), il est donc déconseillé de démarrer et d’arrêter Emacs plusieurs fois par jour.
Je suggère d’utiliser l’écran. Screen est un multiplexeur de terminal, vous offrant un nombre illimité de terminaux virtuels dans un terminal.
Après l’installation, écrivez simplement “screen emacs” dans votre terminal. Emacs commencera comme d’habitude, mais en appuyant sur “ca c” (c’est-à-dire appuyer sur ctrl-a et c), un nouveau terminal virtuel sera ouvert. Vous pouvez revenir à emacs en appuyant sur “ca ca” (c’est deux fois ctrl-a).
Vous pouvez même vous déconnecter de la session d’écran en cours d’exécution, la séquence de touches est “ca d”.
Re-attaché à 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 détacher, de rentrer chez vous et de vous reconnecter depuis chez vous.
J’ai couru Emacs comme ça pendant des mois d’affilée.
Voici le site officiel: http://www.gnu.org/software/screen/ mais essayez de googler pour des tutoriels d’écran et des howtos
Vous pouvez utiliser benchmark-init pour profiler votre démarrage d’Emacs. Il gardera une trace de quels modules sont chargés et combien de temps est consacré à chacun. Les résultats peuvent être présentés sous forme de tableau ou d’arbre. L’arborescence facilite le suivi de qui charge quoi, ce qui peut être utile lorsque vous chargez un paquet avec beaucoup de dépendances, et le formulaire tabulé vous aide à trouver rapidement où la plupart du temps est dépensé.
Une fois que vous avez obtenu ces résultats, essayez de déterminer si tous les modules doivent être chargés en permanence ou si vous pouvez en charger certains à la demande. Par exemple, dans ma configuration, je ne charge que les extensions d’Emacs spécifiques à certains modes lorsque ce mode est activé, la plupart du temps, je n’utilise qu’un petit sous-ensemble dans une session. Les hooks d’ eval-after-load et 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ées. La plus grande partie du temps est consacrée au chargement de Helm, que je charge toujours car il remplace les fonctions find-file et autres fonctions de base qui sont toujours nécessaires, et CEDET, puisque j’utilise la dernière version et que celle-ci doit être chargée version intégrée.
Une chose que les autres n’ont pas mentionnée est d’inclure les bibliothèques elisp que vous utilisez dans les Emacs sous-évaluées pour déplacer le temps de chargement de la bibliothèque depuis le démarrage d’Emacs jusqu’à la génération 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.
Cela ne répond pas à la question, mais est en quelque sorte pertinent
Je ne sais pas comment le faire démarrer plus vite, mais il y a quelques petites 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:
alternativement, vous pourriez exécuter emacs comme ceci:
emacs file.ext &
J’ai eu environ 120 secondes heure de départ. J’ai pu trouver le correctif en installant ceci:
https://github.com/dholm/benchmark-init-el 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)))
alors une fois que vos emacs ont démarré, lancez:
Mx 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
J’essayais de résoudre le même problème quand je suis tombé sur cette question ici. Je voulais juste append que le problème pour moi n’était pas à cause du temps de chargement des paquets emacs lisp, mais du 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 paquet
Mx emacs-init-time
Pour moi, c’était 0,3 seconde, et pourtant le temps de chargement était extrêmement élevé. Après avoir modifié mon nom d’hôte correctement, le problème a été résolu.
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
Essayez d’utiliser la macro https://github.com/jwiegley/use-package pour définir les chargements et les personnalisations de vos packages. Il gère pour vous le chargement différé des paquets, ce qui facilite relativement le démarrage, même en présence d’un grand nombre de paquets configurés. J’ai près de 100 paquets référencés dans mes .emacs, mais mon temps de démarrage est inférieur à 2 secondes sous Linux et 2.2 sur Mac.
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 sessions d’emac supplémentaires ne sont essentiellement que de nouvelles images de cette session. Un avantage est le temps de démarrage rapide pour vos sessions ultérieures.