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


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

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

17 67

17 ответов:

кроме решение Адама Розенфилда, Я рекомендую использовать Emacs в режиме сервера. Вы можете добавить (server-start) к вашим dotemacs, и бегите emacsclient вместо emacs всякий раз, когда вы хотите открыть файл в Emacs. Таким образом, вы должны оплатить стоимость загрузки Emacs только один раз, после чего клиенты всплывают немедленно.

Edit

вы правы, 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 "''"))'

другие покрыли с помощью gnuserve и emacsclient, и я бы предложил компиляцию в emacs (возможность перейти к ошибкам компиляции-это победа).

но, специально ускоряя .emacs можно сделать с помощью:

  1. байт-компиляции .emacs файл, который вы можете сделать автоматически с помощью этот фрагмент кода

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

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

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

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

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

как определить, что ваш .в 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, вполне возможно, что *Messages* буфер потеряет некоторые сообщения, потому что он хранит только фиксированный объем информации. Вы можете добавить этот параметр на ранней стадии к вашему .emacs сохранить все сообщения вокруг:

(setq message-log-max t)

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

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

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

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

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

    (if (locate-library "ediff-trees")
        (autoload 'ediff-trees "ediff-trees" "Start an tree ediff" t))
    
  2. компиляции .emacs

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

    (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 в одном сеансе экрана, а затем поднять новые окна в другом терминале. Я использую 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. Вы можете сделать это, установив процедуру hook, хотя я не уверен в деталях.

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

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

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

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

вы описываете, как используется такой редактор, как vim. Стрелять в&out. Emacs обычно остается открытым, и в основном все делается "изнутри". хиена уже ответила, что было бы правильным подходом здесь.

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

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

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

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

Emacs предназначен для запуска "все время" (или, по крайней мере, в течение длительного периода времени), поэтому запуск и остановка Emacs несколько раз в течение дня не рекомендуется.

Я бы предложил использовать экран. Экран терминальный мультиплексор, давая вам неограниченные виртуальные терминалы в одном терминале.

после установки просто напишите "экран emacs" в вашем терминале. Emacs запустится как обычно, но нажатие "c-a c "(то есть нажмите ctrl-a, а затем c) откроет новый виртуальный терминал. Вы можете вернуться к emacs, нажав "c-a c-a" (это два раза ctrl-a).

вы даже можете отсоединиться от запущенного сеанса экрана, последовательность клавиш "c-a d".

повторно присоединитесь к сеансу, выпустив "экран-R", и вы вернетесь туда, где вы оставили. Это позволяет запустить сеанс emacs на работе, отсоединить, вернуться домой и повторно подключиться из дома.

Я уже несколько месяцев подряд запускаю Emacs.

вот официальный сайт: http://www.gnu.org/software/screen/ но попробуйте погуглить для экрана учебники и howtos

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

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

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

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

это не отвечает на вопрос, но является своего рода актуальным

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

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

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

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

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

https://github.com/dholm/benchmark-init-el положите на верхней части вашего init.Эл

(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 секунд в tramp-loaddefs

я исправил это путем добавления

127.0.0.1  host.does.not.exist

to / etc / hosts и это сделало мой запуск быстрым

смотрите больше здесь:https://github.com/emacs-helm/helm/issues/1045

еще одна вещь, которая может быть полезна для вас:https://www.emacswiki.org/emacs/ProfileDotEmacs

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

чтобы проверить время загрузки пакетов

M-x emacs-init-time

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

настройка ваше полностью разрешенное имя хоста edit /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 по существу являются просто новыми кадрами этого сеанса. Одно преимущество-это быстрое время запуска для ваших последующих сеансах.