Как я могу ускорить запуск Emacs?
Я использую Emacs v. 22 (консольная версия, удаленно с PuTTY или локально с Konsole) в качестве основного текстового редактора в Linux. Загрузка занимает некоторое время каждый раз, когда я запускаю его, хотя, вероятно, почти секунду, хотя я никогда не рассчитывал это. Я часто открываю и закрываю Emacs, потому что мне удобнее использовать командную строку Bash для манипулирования файлами / каталогами и компиляции.
Как я могу ускорить время запуска?
17 ответов
В дополнение к решению Адама Розенфилда, я рекомендую использовать Emacs в режиме сервера. Вы можете добавить (server-start)
к твоим дотемакам, и беги emacsclient
вместо emacs
всякий раз, когда вы хотите открыть файл в Emacs. Таким образом, вы должны оплатить стоимость загрузки Emacs только один раз, после чего клиенты сразу же появятся.
редактировать
Вы правы, v22 не создает новый фрейм. Создайте сценарий оболочки, который сделает свое дело:
#!/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'"))'
Другие покрыли использование gnuserve
а также emacsclient
, и я бы предложил компиляцию в emacs (возможность перехода к ошибкам компиляции - это победа).
Но, в частности, ускорение.emacs может быть сделано:
Байт, компилирующий файл.emacs, который вы можете сделать автоматически, используя этот фрагмент кода.
Замена как можно большего количества
(require 'package)
операторы с функцией автозагрузки. Это задержит загрузку lisp до тех пор, пока это действительно не потребуется. Использование этой техники позволило мне ускорить мой запуск с>6 секунд до <1. Это займет немного работы, потому что не все библиотеки поставлены правильно помеченыautoload
,Удаление кода / функциональности, которую вы больше не используете.
Попробуйте запустить emacs с опцией
--no-site-file
чтобы избежать загрузки ненужных пакетов при установке сайтаsite-start.el
,Если вы действительно серьезны, вы можете свернуть свои собственные emacs с уже загруженными вашими любимыми функциями. Это, конечно, означает, что это более важно вносить изменения в то, что у вас есть в
.emacs
потому что это часть двоичного файла. Перейдите по ссылке для получения информации о том, как использоватьdump-emacs
,Купите более быстрый компьютер и / или более быстрый диск.
Как определить, что загружает ваш.emacs
Теперь, как вы узнаете, что загружает ваш.emacs? С целью убрать функционал или отложить его? Проверьте свои *Messages*
буфер, который содержит строки вроде:
Загрузка /home/tjackson/.emacs.tjackson.el (источник)... Загрузка /home/tjackson/installed/emacs/lisp/loaddefs.el (источник)... выполнено Загрузка /user/tjackson/.elisp/source/loaddefs.el (источник)... выполнено Загрузка автовозврата... выполнена Загрузка /home/tjackson/.emacs.tjackson.el (источник)... сделано
Если вы заметите, Loading
заявления могут вкладываться: первое .emacs.tjackson.el
заканчивается ...
и последняя строка показывает .emacs.tjackson.el
нагрузка ...done
, Все эти другие файлы загружаются изнутри моего .emacs.tjackson.el
файл. Все остальные нагрузки являются атомными.
Примечание: если у вас большой.emacs, возможно, что *Messages*
буфер потеряет некоторые сообщения, потому что он хранит только фиксированный объем информации. Вы можете добавить этот параметр в начале .emacs
держать все сообщения вокруг:
(setq message-log-max t)
Примечание: это 'load
Команда будет подавлять сообщения, если четвертый аргумент nomessage
не ноль, поэтому удалите все такие вызовы (или, посоветуйте 'load
и заставить четвертый аргумент быть nil
).
Не закрывайте Emacs каждый раз, когда вы хотите использовать оболочку. Используйте Ctrl-Z для перемещения Emacs на задний план и fg
команда в Bash, чтобы переместить его обратно на передний план.
Пара советов:
Использовать автозагрузки
Использование автозагрузки избавляет вас от загрузки библиотек до тех пор, пока вы их не используете. Например:
(if (locate-library "ediff-trees") (autoload 'ediff-trees "ediff-trees" "Start an tree ediff" t))
Скомпилируйте ваш.emacs
Дает вам небольшое увеличение скорости, хотя есть недостатки, если вы работаете с управлением версиями, и ваш.emacs новее, чем.emacs.elc. Один общий трюк:
(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)
Научитесь любить сервер Emacs.
Запуск emacs в качестве сервера означает, что вам никогда не придется его закрывать. Однако я заметил, что вы все еще используете emacs22. emacs23 поддерживает multi-tty, что значительно упрощает запуск emacs за один сеанс экрана, а затем вызывает новые окна в другом терминале. Я использую emacs для редактирования почты для моего почтового клиента (mutt), и emacsclient отлично подходит для такого быстрого редактирования.
Один из
M-x shell
M-x eshell
M-x term
M-x ansi-term
должен соответствовать вашим требованиям командной строки из Emacs.
Вы также можете использовать M-!
(ака M-x shell-command
) выполнить однострочник, не опускаясь в оболочку.
Проверьте свои .emacs
файл, чтобы увидеть, загружаете ли вы ненужные пакеты. Загрузка пакетов может занять значительное количество времени. Например, вы можете загрузить только php-mode
пакет, если вы редактируете файл PHP. Вы можете сделать это, установив процедуру подключения, хотя я не уверен в деталях.
Также убедитесь, что все загружаемые вами пакеты скомпилированы (.elc
файлы). Вы можете скомпилировать elisp
файл, запустив
emacs -batch -f batch-byte-compile thefile.el
Скомпилированные пакеты загружаются намного быстрее, чем не скомпилированные.
Самый быстрый способ - профилировать ваш.emacs. Я сократил время загрузки с>3 с до 1 с через 5 минут после того, как обнаружил, что 4 строки в моем.emacs занимают более 80% времени загрузки.
"Я часто открываю и закрываю emacs, потому что мне удобнее использовать командную строку bash для манипулирования файлами / каталогами и компиляции".
Вы описываете, как используется редактор типа vim. Стреляй в и из. Emacs обычно остается открытым, и в основном все делается изнутри. Хиена уже ответила, что будет правильным подходом здесь.
Одна вещь, которая помогла мне сократить время загрузки моего .emacs
, в дополнение к autoload
(как предлагали другие), это eval-after-load. В следующем примере задержка вызова sql-set-product
избавляет вас от необходимости загружать sql
в вашем .emacs
делая существующее sql
автозагрузка более эффективна.
(eval-after-load "sql" "(Progn (sql-set-product 'mysql) (setq sql-mysql-options '("-C" "-t" "-f" "-n")) (setq sql-sqlite-программа "sqlite3")))
Конечно, для некоторых пакетов будет доступен хук, с помощью которого вы можете сделать то же самое, но иногда этого не происходит, иначе этот способ окажется проще для размышления.
Emacs предназначен для работы "все время" (или, по крайней мере, в течение длительных периодов времени), поэтому запускать и останавливать Emacs несколько раз в течение дня не рекомендуется.
Я бы предложил использовать экран. Экран является терминальным мультиплексором, предоставляя вам неограниченное количество виртуальных терминалов в одном терминале.
После установки просто напишите "screen emacs" в вашем терминале. Emacs запустится как обычно, но нажатие "ca c" (то есть ctrl-a и затем c) откроет новый виртуальный терминал. Вы можете вернуться к emacs, нажав "ca ca" (это два раза ctrl-a).
Вы даже можете отсоединиться от сеанса рабочего экрана, последовательность клавиш - "ca d".
Повторно присоединитесь к сеансу, введя "screen -R", и вы вернетесь туда, где вы оставили. Это позволяет вам запускать сеанс emacs на работе, отключаться, идти домой и повторно подключаться из дома.
Я запускал Emacs вот так уже несколько месяцев подряд.
Вот официальный веб-сайт: http://www.gnu.org/software/screen/ но попробуйте поискать учебники по экрану и инструкции
Вы можете использовать benchmark-init для профилирования вашего запуска Emacs. Он будет отслеживать, какие модули загружаются и сколько времени тратится на каждый из них. Результаты могут быть представлены в виде таблицы или в виде дерева. Дерево упрощает отслеживание того, кто что загружает, что может быть полезно, когда вы загружаете пакет с большим количеством зависимостей, а табличная форма помогает вам быстро найти, где тратится большая часть времени.
Получив эти результаты, попытайтесь выяснить, нужно ли загружать все модули постоянно или, возможно, вы можете загрузить некоторые из них по требованию. Например, в моей конфигурации я загружаю только расширения Emacs, которые специфичны для определенных режимов, когда этот режим фактически активирован, так как большую часть времени я использую только небольшое их подмножество в сеансе. eval-after-load и mode hooks будут вашими друзьями здесь.
Используя этот метод, мой Emacs запускается через 3-4 секунды, и у меня установлено около 200 расширений. Большую часть времени тратится на загрузку Helm, который я всегда загружаю, поскольку он заменяет find-file и другие функции ядра, которые всегда нужны, и CEDET, поскольку я использую последнюю версию, и ее необходимо загрузить до того, как Emacs попытается загрузить более старую встроенная версия.
Попробуйте использовать макрос https://github.com/jwiegley/use-package для определения загрузки вашего пакета и настроек. Он обрабатывает отложенную загрузку пакетов для вас, что позволяет относительно легко получить хорошее время запуска даже при наличии большого количества настроенных пакетов. У меня почти 100 пакетов, на которые есть ссылки в моем.emacs, но мое время запуска составляет менее 2 секунд в Linux и 2,2 секунды на Mac.
У меня было время начала около 120 секунд. Я смог найти исправление, устанавливающее это:
https://github.com/dholm/benchmark-init-el поместите поверх вашего 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)))
затем, как только ваш emacs запустится, запустите:
Mx benchmark-init / show-durations-tree
На моей стороне проблема была 127 секунд в tramp-loaddefs
Я исправил это, добавив
127.0.0.1 host.does.not.exist
в / etc / hosts и это ускорило мой запуск
смотрите больше здесь: https://github.com/emacs-helm/helm/issues/1045
еще одна вещь, которая может быть полезна для вас: https://www.emacswiki.org/emacs/ProfileDotEmacs
Одна вещь, которую другие не упомянули, - это включение библиотек elisp, которые вы используете как часть сброшенного Emacs, для переноса времени загрузки библиотеки из запуска Emacs в сборку Emacs. Это не для слабонервных, но если вы загрузите несколько библиотек в .emacs
это может выиграть несколько секунд времени запуска.
Это не отвечает на вопрос, но является уместным
Я не знаю, как заставить это начаться быстрее, но я мог бы предложить несколько вещей:
для большинства вещей, которые вы делаете в командной строке, вы можете делать их в emacs:
- compile: Mx compile, затем введите команду, которую вы используете
- мой опыт только с C++, но с g++ вы можете нажать Cx `, чтобы перейти к строкам, на которые жалуется компилятор
- запустить команды оболочки: M-!, выдает вывод в буфер
- интерактивная оболочка: Mx shell
альтернативно, вы можете запустить emacs так:
emacs file.ext &
- который открывает emacs в фоновом режиме, так что вы все равно можете использовать оболочку (это лучше всего работает с putty и X forwarding с чем-то вроде Xming)
Я пытался решить ту же проблему, когда столкнулся с этим вопросом здесь. Я просто хотел добавить, что проблема для меня была не в времени загрузки пакетов emacs lisp, а в том, что у хоста не было полностью разрешенного имени хоста.
Чтобы проверить время загрузки вашего пакета, сделайте
M-x emacs-init-time
Для меня это было 0,3 секунды, и все же время загрузки было чрезвычайно высоким. После правильного изменения моего имени хоста это решило проблему.
Чтобы настроить полностью разрешенное имя хоста, отредактируйте /etc/hostname и /etc/hostsfile с помощью:
127.0.0.1 localhost localhost.localdomain
192.168.0.2 hostname hostname.domain
Я должен был бы проверить свою настройку, но есть пакет под названием gnuserve или emacsclient. Он много мигрирует, поэтому вам придется поискать его в Google.
Он запускает один сеанс Emacs в фоновом режиме. Любые дальнейшие сессии emacs - это просто новые фреймы этой сессии. Один совет - быстрое время запуска для ваших последующих сессий.