Я использую Emacs v. 22 (консольная версия, либо удаленно с PuTTY или локально с Konsole) в качестве основного текстового редактора в Linux. Требуется некоторое время, чтобы загружать каждый раз, когда я начинаю, хотя, вероятно, почти секунду, хотя я никогда не приурочил его. Я очень часто открываю и закрываю Emacs, потому что мне удобнее использовать командную строку Bash для обработки файлов и каталогов и компиляции.
Как ускорить время запуска?
Ответ 1
В дополнение к решению Адама Розенфилда, я рекомендую использовать Emacs в режиме сервера. Вы можете добавить (server-start)
к вашим точкам и запустить emacsclient
вместо emacs
всякий раз, когда вы хотите открыть файл в Emacs. Таким образом, вы должны оплатить стоимость загрузки Emacs только один раз, после чего клиенты сразу появятся.
Edit
Вы правы, v22 не создает новый фрейм. Создайте оболочку script, которая делает трюк:
#!/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'"))'
Ответ 2
Другие рассмотрели использование gnuserve
и emacsclient
, и я бы предложил компиляцию в emacs (возможность переходить к ошибкам компиляции - это победа).
Но, особенно ускорение .emacs может быть выполнено:
-
Байт, компилирующий файл .emacs, который вы можете сделать автоматически, используя этот фрагмент кода
-
Замена как можно большего числа операторов (require 'package)
autoload ed. Это задержит загрузку lisp, пока она не понадобится. Использование этой техники позволило мне ускорить мой запуск s > 6 секунд до < 1. Это требует немного работы, потому что не все библиотеки правильно помечены autoload
.
-
Удаление кода/функций, которые вы больше не используете.
-
Попробуйте запустить emacs с опцией --no-site-file
, чтобы избежать загрузки ненужных пакетов при установке сайта site-start.el
.
-
Если вы действительно серьезны, вы можете свернуть свои собственные emacs с уже загруженной любимой функциональностью. Это, конечно, означает, что он более активно вносит изменения в то, что у вас есть в .emacs
, потому что это часть двоичного файла. Перейдите по ссылке для получения информации о том, как использовать dump-emacs
.
-
Купить более быстрый компьютер и/или более быстрый диск.
Как определить, что загружает ваши .emacs
Теперь, как вы узнаете, что загружает ваш .emacs? С целью удалить функциональность или отложить ее? Проверьте буфер *Messages*
, содержащий строки, например:
Loading /home/tjackson/.emacs.tjackson.el (source)...
Loading /home/tjackson/installed/emacs/lisp/loaddefs.el (source)...done
Loading /user/tjackson/.elisp/source/loaddefs.el (source)...done
Loading autorevert...done
Loading /home/tjackson/.emacs.tjackson.el (source)...done
Если вы заметите, операторы Loading
могут вложить: первый .emacs.tjackson.el
заканчивается на ...
, а в последней строке отображается загрузка .emacs.tjackson.el
...done
. Все эти файлы загружаются из моего файла .emacs.tjackson.el
. Все остальные нагрузки являются атомарными.
Примечание. Если у вас большой .emac, возможно, что буфер *Messages*
потеряет некоторые из сообщений, поскольку он сохраняет только фиксированный объем информации. Вы можете добавить этот параметр на раннем этапе к .emacs
, чтобы сохранить все сообщения:
(setq message-log-max t)
Примечание: команда 'load
будет подавлять сообщения, если ее четвертый аргумент nomessage
не равен нулю, поэтому удалите все такие вызовы (или, советуем 'load
и заставляем четвертый аргумент быть nil
).
Ответ 3
Не закрывайте Emacs каждый раз, когда вы хотите использовать оболочку. Используйте Ctrl-Z, чтобы переместить Emacs на задний план и команду fg
в Bash, чтобы переместить ее на передний план.
Ответ 4
Несколько советов:
-
Использовать автозагрузки
Использование autoload избавляет вас от загрузки библиотек, пока вы их не используете.
Например:
(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 являются фантастическими для таких быстрых изменений.
Ответ 5
Один из
M-x shell
M-x eshell
M-x term
M-x ansi-term
должен удовлетворять ваши потребности в командной строке из Emacs.
Вы также можете использовать M-!
(aka M-x shell-command
) для выполнения однострочного перевода без отбрасывания в оболочку.
Ответ 6
Проверьте файл .emacs
, чтобы узнать, загружаете ли вы ненужные пакеты. Загрузка пакетов может занять значительное количество времени. Например, вы можете захотеть загрузить пакет php-mode
, если вы редактируете файл PHP. Вы можете это сделать, установив процедуру hook, хотя я не уверен в деталях.
Также убедитесь, что все загружаемые вами пакеты скомпилированы (.elc
файлы). Вы можете скомпилировать файл elisp
, запустив
emacs -batch -f batch-byte-compile thefile.el
Скомпилированные пакеты загружаются гораздо быстрее, чем нескомпилированные пакеты.
Ответ 7
"Я очень часто открываю и закрываю emacs, потому что мне удобнее использовать командную строку bash для управления файлами и каталогами и компиляции".
Вы описываете, как используется такой редактор, как vim. Стреляйте в & out. Emacs обычно остается открытым, и в основном все делается из "внутри него". hiena уже ответила, какой будет правильный подход здесь.
Ответ 8
Самый быстрый способ - создать профиль .emacs. Я сократил время загрузки от > 3s до 1s через 5 минут после того, как обнаружил, что 4 строки в моем .emacs занимают более 80% времени загрузки.
Ответ 9
Одна вещь, которая помогла мне уменьшить время загрузки моего .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-program "sqlite3")
))
Конечно, для некоторых пакетов будет hook, что вы можете сделать то же самое, но иногда нет, иначе этот способ просто легче думать.
Ответ 10
Emacs предназначен для запуска "все время" (или, по крайней мере, в течение длительных периодов времени), поэтому запуск и остановка Emacs несколько раз в течение дня не рекомендуется.
Я бы предложил использовать экран. Экран - это терминальный мультиплексор, предоставляющий неограниченные виртуальные терминалы в одном терминале.
После установки просто напишите "screen emacs" в своем терминале. Emacs начнется как обычно, но нажатие "c-a c" (то есть нажмите ctrl-a, а затем c) откроет новый виртуальный терминал. Вы можете вернуться к emacs, нажав "c-a c-a" (это два раза ctrl-a).
Вы можете даже отсоединиться от сеанса работы экрана, последовательность клавиш - "c-a d".
Повторно присоединитесь к сеансу, выпустив "screen -R", и вы вернетесь туда, куда вы ушли. Это позволяет вам начать сеанс emacs на работе, отсоединиться, вернуться домой и снова подключиться из дома.
Я запускаю Emacs вот так несколько месяцев подряд.
Здесь официальный сайт: http://www.gnu.org/software/screen/, но попробуйте googling для экранных руководств и howtos
Ответ 11
Одна вещь, о которой другие не упоминали, заключается в том, чтобы включить библиотеки elisp, которые вы используете как часть dumped Emacs, чтобы переместить загрузку библиотеки время от запуска Emacs до сборки Emacs. Это не для слабонервных, но если вы загрузите несколько библиотек в .emacs
, это может выиграть вам несколько секунд времени запуска.
Ответ 12
Вы можете использовать benchmark-init для профайла своего запуска Emacs. Он будет отслеживать, какие модули загружаются и сколько времени тратится на каждого. Результаты могут быть представлены либо в виде таблицы, либо в виде дерева. Дерево упрощает отслеживание того, кто загружает то, что может быть полезно при загрузке пакета с большим количеством зависимостей, а табулированная форма помогает быстро найти, где большую часть времени тратится.
Как только вы получите эти результаты, попытайтесь выяснить, должны ли все модули загружаться все время или если вы можете загрузить некоторые из них по требованию. Например, в моей конфигурации я загружаю только расширения Emacs, специфичные для определенных режимов, когда этот режим фактически активирован, поскольку большую часть времени я использую только небольшое подмножество из них в сеансе. eval-after-load, и здесь будут вашими крюками режима.
Применяя этот метод , мой Emacs начинается через 3-4 секунды, и у меня установлено рядом с 200 расширениями. Большая часть времени тратится на загрузку Helm, которую я всегда загружаю, поскольку она заменяет find-file и другие основные функции, которые всегда нужны, и CEDET, поскольку я использую последнюю версию и ее нужно загрузить до того, как Emacs попытается загрузить старшую встроенная версия.
Ответ 13
Это не отвечает на вопрос, но является релевантным
Я не знаю, как сделать это быстрее, но есть несколько вещей, которые я мог бы предложить:
-
для большинства вещей, которые вы делаете в командной строке, вы можете сделать их в emacs:
- скомпилируйте: скомпилируйте M-x, затем введите команду, которую вы используете
- мой опыт связан только с С++, но с g++ вы можете нажать C-x `, чтобы перейти к строкам, которые компилятор жалуется на
- выполнить команды оболочки: M-!, выгружает вывод в буфер
- интерактивная оболочка: оболочка M-x
-
вы можете запустить emacs следующим образом:
-
emacs file.ext &
- который открывает emacs в фоновом режиме, поэтому вы все равно можете использовать оболочку (это лучше всего работает с шпатлеровкой и X-пересылкой с чем-то вроде Xming)
Ответ 14
Я пытался решить ту же проблему, когда я столкнулся с этим вопросом. Я просто хотел добавить, что проблема для меня была не из-за времени загрузки пакетов 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
Ответ 15
Попробуйте использовать макрос https://github.com/jwiegley/use-package для определения загрузок и настроек пакета. Он обрабатывает отложенную загрузку пакетов для вас, что делает его относительно легким для получения хорошего времени запуска даже при наличии большого количества настроенных пакетов. У меня почти 100 пакетов, на которые ссылаются мои .emacs, но время загрузки у меня меньше 2 секунд на Linux и 2.2 на Mac.
Ответ 16
У меня было время начала 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 выполните:
M-x benchmark-init/show-durations-tree
На моей стороне проблема была 127 secs в 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
Ответ 17
Мне нужно было бы проверить мою настройку, но есть пакет под названием gnuserve или emacsclient. Он много мигрирует, поэтому для этого вам понадобится Google.
Он запускает один сеанс emacs в фоновом режиме. Любые дальнейшие сеансы emacs являются по существу только новыми кадрами этого сеанса. Одним из советов является быстрое время запуска для ваших последующих сеансов.