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?
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'"))'
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:
Octet compilant le fichier .emacs, ce que vous pouvez faire automatiquement en utilisant cet extrait de code
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
.
Suppression du code/des fonctionnalités que vous n'utilisez plus.
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
.
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
.
Achetez un ordinateur et/ou un disque plus rapide.
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
).
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.
Quelques conseils:
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))
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)
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.
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.
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.
"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.
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.
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.
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
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.
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
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.
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:
vous pouvez également exécuter emacs comme ceci:
emacs file.ext &
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.
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
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.