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

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