Как я могу сделать запуск Emacs быстрее?

Я использую Emacs v. 22 (консольная версия, удаленно с PuTTY или локально с Konsole ) в качестве основного текстового редактора в Linux. Требуется некоторое время, чтобы загружать каждый раз, когда я начинаю, хотя, вероятно, почти секунду, хотя я никогда не приурочил его. Я очень часто открываю и закрываю Emacs, потому что мне удобнее использовать командную строку Bash для манипулирования файлами и каталогами и компиляции.

Как ускорить время запуска?

В дополнение к решению Адама Розенфилда , я рекомендую использовать 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 может быть выполнено:

  1. Байт компилирует файл .emacs, который вы можете сделать автоматически, используя этот fragment кода

  2. Замена как можно большего числа операторов (require 'package) с помощью функций автозагрузки . Это задержит загрузку lisp до тех пор, пока она не понадобится. Использование этой техники позволило мне ускорить мой запуск с> 6 секунд до <1. Это требует немного работы, потому что не все библиотеки правильно помечены как autoload .

  3. Удаление кода / функций, которые вы больше не используете.

  4. Попробуйте запустить emacs с опцией --no-site-file чтобы избежать загрузки ненужных пакетов на сайт установки site-start.el .

  5. Если вы действительно серьезны, вы можете свернуть свои собственные emacs с уже загруженной любимой функциональностью. Это, конечно, означает, что более активно вносить изменения в то, что у вас есть в вашем .emacs потому что это часть двоичного файла. Перейдите по ссылке для получения информации о том, как использовать dump-emacs .

  6. Купите более быстрый компьютер и / или более быстрый диск.

Как определить, что загружает ваш .emacs

Теперь, как вы узнаете, что загружает ваш .emacs? С целью удалить функциональность или отложить ее? Проверьте буфер *Messages* , который содержит строки, такие как:

 Загрузка /home/tjackson/.emacs.tjackson.el (источник) ...
 Загрузка /home/tjackson/installed/emacs/lisp/loaddefs.el (source) ... done
 Загрузка /user/tjackson/.elisp/source/loaddefs.el (source) ... done
 Загрузка autorevert ... done
 Загрузка /home/tjackson/.emacs.tjackson.el (source) ... done

Если вы заметите, операторы Loading могут .emacs.tjackson.el : первый .emacs.tjackson.el заканчивается ... и последняя строка показывает, что загрузка .emacs.tjackson.el ...done . Все эти файлы загружаются из моего файла .emacs.tjackson.el . Все остальные нагрузки являются атомарными.

Примечание. Если у вас большой .emacs, возможно, что буфер *Messages* потеряет некоторые из сообщений, поскольку он сохраняет только фиксированный объем информации. Вы можете добавить этот параметр на раннем этапе в ваш .emacs чтобы сохранить все сообщения:

 (setq message-log-max t) 

Примечание: команда 'load будет подавлять сообщения, если их четвертый аргумент nomessage равен нулю, поэтому удалите любые такие вызовы (или, сообщите 'load и nomessage четвертый аргумент быть nil ).

Не закрывайте Emacs каждый раз, когда вы хотите использовать оболочку. Используйте Ctrl-Z, чтобы переместить Emacs на задний план и команду fg в Bash, чтобы перенести его на передний план.

Несколько советов:

  1. Использовать автозагрузки

    Использование автозагрузки экономит вас от загрузки библиотек, пока вы их не используете. Например:

     (if (locate-library "ediff-trees") (autoload 'ediff-trees "ediff-trees" "Start an tree ediff" t)) 
  2. Скомпилируйте ваши .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) 
  3. Научитесь любить сервер emacs.

    Запуск emacs в качестве сервера означает, что он не должен закрывать его. Однако я отмечаю, что вы все еще используете emacs22. emacs23 поддерживает multi-tty, что упрощает запуск emacs на одном сеансе экрана, а затем открывает новые windows в другом терминале. Я использую emacs для редактирования почты для моего почтового клиента (mutt), а emacsclient – это фантастика для таких быстрых изменений.

Один из

 Mx shell Mx eshell Mx term Mx ansi-term 

должен удовлетворять ваши потребности в командной строке из Emacs.

Вы также можете использовать M-! (aka Mx shell-command ), чтобы выполнить однострочный, не отбрасывая в оболочку.

Проверьте файл .emacs чтобы узнать, загружаете ли вы ненужные пакеты. Загрузка пакетов может занять значительное количество времени. Например, вы можете захотеть загрузить пакет php-mode , если вы редактируете файл PHP. Вы можете сделать это, установив процедуру перехвата, хотя я не уверен в деталях.

Также убедитесь, что все загружаемые вами пакеты скомпилированы (файлы .elc ). Вы можете скомпилировать файл elisp , выполнив

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

Скомпилированные пакеты загружаются намного быстрее, чем нескомпилированные пакеты.

«Я очень часто открываю и закрываю emacs, потому что мне удобнее использовать командную строку bash для манипулирования файлами и каталогами и компиляции».

Вы описываете, как используется такой редактор, как vim. Стреляйте и выходите. Emacs обычно остается открытым, и в основном все делается из «внутри него». Хиена уже ответила, какой будет правильный подход здесь.

Самый быстрый способ – профилировать ваши .emacs . Я сократил время загрузки от> 3s до 1s через 5 минут после того, как обнаружил, что 4 отдельных строки в моих .emacs занимают более 80% времени загрузки.

Одна вещь, которая помогла мне уменьшить время загрузки моих .emacs , в дополнение к autoload (как предложили другие), имеет значение eval-after-load . В следующем примере задержка вызова sql-set-product избавляет вас от необходимости загружать sql -файлы в ваш .emacs , что делает exsing sql autoloads более эффективным.

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

Конечно, для некоторых пакетов есть ansible крючок, который вы можете сделать то же самое, но иногда его нет, иначе этот способ просто легче думать.

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/, но попробуйте googling для уроков экрана и howtos

Вы можете использовать benchmark-init для профилирования запуска Emacs. Он будет отслеживать, какие модули загружаются и сколько времени тратится на каждого. Результаты могут быть представлены либо в виде таблицы, либо в виде дерева. Дерево упрощает отслеживание того, кто загружает то, что может быть полезно при загрузке пакета с большим количеством зависимостей, а табулированная форма помогает быстро найти, где большая часть времени тратится.

Как только вы получите эти результаты, попытайтесь выяснить, все ли модули должны быть загружены все время или если вы можете загрузить некоторые из них по запросу. Например, в моей конфигурации я загружаю только расширения Emacs, специфичные для определенных режимов, когда этот режим фактически активирован, поскольку большую часть времени я использую только небольшое подмножество из них в сеансе. eval-after-load и переключатели режимов будут вашими друзьями здесь.

Применяя этот метод, мой Emacs запускается через 3-4 секунды, и у меня установлено около 200 расширений . Большая часть времени тратится на загрузку Helm, которую я всегда загружаю, поскольку она заменяет find-file и другие основные функции, которые всегда нужны, и CEDET, поскольку я использую последнюю версию и ее нужно загрузить до того, как Emacs попытается загрузить старшую встроенная версия.

Одна вещь, о которой другие не упомянули, заключается в том, чтобы включить библиотеки elisp, которые вы используете как часть выгруженных Emacs, чтобы переместить время загрузки библиотеки с момента запуска Emacs до сборки Emacs. Это не для слабонервных, но если вы загружаете несколько библиотек в .emacs это может выиграть вам несколько секунд времени запуска.

Это не отвечает на вопрос, но

Я не знаю, как сделать это быстрее, но есть несколько вещей, которые я мог бы предложить:

  • для большинства вещей, которые вы делаете в командной строке, вы можете сделать их в emacs:

    • compile: Mx compile, затем введите команду, которую вы используете
    • мой опыт связан только с C ++, но с g ++ вы можете нажать Cx `, чтобы перейти к строкам, которые компилятор жалуется
    • запускать команды оболочки: M- !, выгружает вывод в буфер
    • интерактивная shell: Mx shell
  • альтернативно, вы можете запускать emacs следующим образом:

    • emacs file.ext &
    • который открывает emacs в фоновом режиме, поэтому вы все равно можете использовать оболочку (это лучше всего подходит для шпатлевки и X-пересылки с чем-то вроде Xming)

У меня было около 120 секунд времени начала. Я смог найти исправление, устанавливающее это:

https://github.com/dholm/benchmark-initel добавьте поверх своего 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 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

Я пытался решить ту же проблему, когда я столкнулся с этим вопросом. Я просто хотел добавить, что проблема для меня была не из-за времени загрузки пакетов emacs lisp, а в том, что у хоста не было полностью разрешенного имени хоста

Чтобы проверить время загрузки пакета, выполните

 Mx emacs-init-time 

Для меня это было 0,3 секунды, и все же время загрузки было чрезвычайно высоким. После правильного изменения имени хоста это устранило проблему.

Чтобы настроить полностью разрешенное имя хоста / etc / hostname и / etc / hostsfile, выполните следующие действия:

 127.0.0.1 localhost localhost.localdomain 192.168.0.2 hostname hostname.domain 

Попробуйте использовать макрос https://github.com/jwiegley/use-package для определения загрузок и настроек пакетов. Он обрабатывает отложенную загрузку пакетов для вас, что делает его относительно легким для получения хорошего времени запуска даже при наличии большого количества настроенных пакетов. У меня есть почти 100 пакетов, на которые ссылаются мои .emacs, но время загрузки у меня меньше 2 секунд на Linux и 2.2 на Mac.

Я должен был бы проверить свою настройку, но есть пакет под названием gnuserve или emacsclient. Он много мигрирует, поэтому для этого вам понадобится Google.

Он запускает один сеанс emacs в фоновом режиме. Любые дальнейшие сеансы emacs являются по существу только новыми кадрами этого сеанса. Один совет – это быстрое время запуска для ваших последующих сеансов.

  • Микропроцессорность DateTime.DayOfWeek
  • Снижение производительности при работе с интерфейсами на C ++?
  • Получить количество циклов процессора?
  • Что более эффективно i ++ или ++ i?
  • Как оптимизировать vlookup для высокого количества поиска? (альтернативы VLOOKUP)
  • Легче ли оптимизировать Fortran, чем C для тяжелых вычислений?
  • Почему GCC генерирует на 15-20% быстрее код, если я оптимизирую размер вместо скорости?
  • Является ли стандарт C ++ низкой эффективностью для iostreams, или я просто имею дело с плохой реализацией?
  • Скорость компиляции Java и скорость компиляции Scala
  • Производительность селектора jQuery с контекстом
  • Делать или не делать: хранить изображения в базе данных
  • Давайте будем гением компьютера.