Как мне побайтно скомпилировать все в моем каталоге .emacs.d?

138

Я решил проверить Emacs, и мне очень понравилось. Теперь я использую Emacs Starter Kit , который обеспечивает лучшие настройки по умолчанию и некоторые приятные настройки для установки Emacs по умолчанию.

Я немного настроил его, добавил некоторые вещи, такие как yasnippet , color-themes , unbound и другие вещи. Я установил github-репозиторий, в котором я храню все настройки, чтобы я мог получить к ним доступ из разных мест или в случае, если что-то пойдет не так, и я потеряю каталог .emacs.d.

Все это очень хорошо, но есть проблема: Emacs загружается за 1-2 секунды. AFAIK Я могу скомпилировать отдельные файлы .el с помощью Mx byte-compile-file в .elc, и это работает. Но есть много файлов .el, и мне интересно, есть ли способ собрать их все с помощью простой команды или чего-то еще, чтобы ускорить загрузку Emacs. Мой Emacs не всегда открыт, и я открываю и закрываю его довольно часто, особенно после того, как я настроил его в качестве редактора по умолчанию для команды редактирования в Total Commander, чтобы привыкнуть к нему быстрее (да, windows xp здесь).

Моя версия Emacs - 22,3. И да, стандартная установка Emacs без каких-либо настроек запускается мгновенно.

Я не уверен, какая версия предпочтительна при загрузке, .el или скомпилированная .elc, кстати Oo

Итак, есть ли команда elisp или ключ командной строки Emacs, чтобы заставить Emacs байтово скомпилировать все в каталоге .emacs.d?

Микка
источник

Ответы:

208

C-u 0 M-x byte-recompile-directory

скомпилирует все файлы .el в каталоге и во всех подкаталогах ниже.

C-u 0Часть , чтобы сделать его не спрашивать о каждом .el файл , который не имеет аналогов .elc.

Лауринас Бивейнис
источник
9
И после этого (после того, как каждый был скомпилирован один раз), просто используйте ту же команду без C-u 0(иначе C-0, кстати). Это будет компилировать только те исходные файлы, которые более поздние, чем их версии, скомпилированные байтами.
Дрю
1
Небольшое замечание: для меня это не сработало, пока я не удалил все соответствующие файлы «.elc». Он просто сказал что-то вроде «Готово, 0 файлов скомпилировано, α файлов пропущено».
Привет, Ангел,
1
@ Привет, Ангел, у меня такая же проблема. Вы нашли какое-нибудь решение?
zhanxw
@zhanxw да. К сожалению, команда компилирует только файлы, которые либо изменились, либо не имеют аналога «.elc». Таким образом, чтобы сначала перекомпилировать все в каталоге, вы должны удалить все файлы «.elc».
Привет, Ангел,
2
К сожалению, интерактивная команда не раскрывает ее, но если вы вызываете функцию напрямую, вы можете использовать необязательный аргумент FORCEдля перекомпиляции файлов, у которых уже есть связанный «.elc», даже если они не старше исходного файла:M-: (byte-recompile-directory "/the/directory/" 0 t)
jbm
44

Для автоматической байтовой компиляции всего, что требует байтовой компиляции каждый раз, когда я запускаю emacs, я помещаю следующее после моих изменений load-pathв начало моего .emacsфайла:

(byte-recompile-directory (expand-file-name "~/.emacs.d") 0)

Удивительно, но это не сильно увеличивает время запуска (если что-то не нужно компилировать).

Чтобы ускорить мой emacs, я сначала идентифицировал медленные части с помощью profile-dotemacs.el, а затем заменил их автозагрузками .

Ричард Хансен
источник
Документация по автозагрузке перемещена. Это и ссылка на profile-dotemacs.el - именно то, что мне было нужно, когда я наткнулся на эту страницу.
Digicrat
24

Вы можете использовать --batchфлаг для перекомпиляции из командной строки.

Чтобы перекомпилировать все, сделайте

emacs --batch --eval '(byte-recompile-directory "~/.emacs.d")'

или перекомпилировать один файл как из Makefile,

emacs --batch --eval '(byte-compile-file "your-elisp-file.el")'
Майк Самуэль
источник
5
используйте вместо этого пакетную байтовую компиляцию .
npostavs
1
Не могли бы вы как это использовать?
nacho4d
8
@ nacho4d emacs -Q --batch -f batch-byte-compile *.el foo/*.el- он не повторяется, как byte-Recompile-directory .
Брайан Бернс
3
Вы, вероятно, хотите добавить аргумент для принудительной перекомпиляции, например. emacs --batch --eval '(byte-Recompile-directory "~ / .emacs.d" 0)'
Ибрагим
17

Это немного отклоняется от вопроса, но для решения проблемы медленной загрузки вы можете использовать новую функцию демона в Emacs 23.

«Если у вас много пакетов поддержки, запуск emacs может быть немного медленным. Однако emacs 23 содержит emacs --daemon, который позволяет запускать emacs в фоновом режиме (например, при входе в систему). создание новых окон (фреймов) emacs с помощью emacsclient. Конечно, у вас уже может быть сервер 'emacs' в более старых версиях, но возможность запустить его в фоновом режиме делает это решение намного лучше "

С http://emacs-fu.blogspot.com/2009/07/emacs-23-is-very-near.html

mwilliams
источник
Я определенно проверю это. Спасибо!
Микка
2
Если вы добавите псевдоним emacs = 'emacsclient -nw -a "" -c' в ваш .bashrc (или версию вашей оболочки), он сначала попытается подключиться к работающему демону, если он есть, если нет, то запустит его и подключится ты.
Фредерик
2

Для моего использования spacemacs, команда spacemacs/recompile-elpa. Команда byte-recompile-directoryне компилирует ни один файл.

Ю Шен
источник
2
Разные вещи. В ELPA / MELPA определены методы сборки в собственной иерархии архивов. byte-Recompile-directory пытается скомпилировать все файлы .el в пользовательском каталоге.
RichieHH