43.1.1 Сводка: последовательность действий при запуске

При запуске Emacs выполняет следующие операции (см. normal-top-level в startup.el):

  1. Добавляет подкаталоги в load-path, запуская файл с именем subdirs.el в каждом каталоге из списка. Обычно этот файл добавляет подкаталоги каталога в список, и они, в свою очередь, сканируются. Файлы subdirs.el обычно генерируются автоматически при установке Emacs.
  2. Загружает любой leim-list.el, найденный в каталогах load-path. Этот файл предназначен для регистрации методов ввода. Поиск выполняется только для личных файлов leim-list.el, которые вы могли создать; каталоги, содержащие стандартные библиотеки Emacs, пропускаются (они должны содержать только один файл leim-list.el, который скомпилирован в исполняемый файл Emacs).
  3. Устанавливает переменную before-init-time в значение current-time (см. Время суток). Также устанавливает after-init-time в nil, что служит для Lisp-программ сигналом о том, что Emacs инициализируется.
  4. Устанавливает языковое окружение и терминальную кодовую систему, если это запрошено переменными окружения, такими как LANG.
  5. Выполняет базовый разбор аргументов командной строки.
  6. Загружает ваш ранний файл инициализации (см. Ранний файл инициализации в Руководстве GNU Emacs). Это не делается, если были указаны параметры ‘-q’, ‘-Q’ или ‘--batch’. Если указан параметр ‘-u’, Emacs ищет файл инициализации в домашнем каталоге этого пользователя.
  7. Вызывает функцию package-activate-all для активации любого установленного дополнительного пакета Emacs Lisp. См. Основы упаковки. Однако Emacs не активирует пакеты, если package-enable-at-startup равен nil или если он запущен с одним из параметров ‘-q’, ‘-Q’ или ‘--batch’. Чтобы активировать пакеты в последнем случае, package-activate-all следует вызывать явно (например, через параметр ‘--funcall’).
  8. Если не в пакетном режиме, инициализирует оконную систему, заданную переменной initial-window-system (см. initial-window-system). Функция инициализации, window-system-initialization, является обобщённой функцией (см. Обобщённые функции), конкретная реализация которой отличается для каждой поддерживаемой оконной системы. Если значение initial-window-system равно windowsystem, то соответствующая реализация функции инициализации определена в файле term/windowsystem-win.el. Этот файл должен быть скомпилирован в исполняемый файл Emacs при его сборке.
  9. Запускает обычный хук before-init-hook.
  10. При необходимости создаёт графический фрейм. В рамках создания графического фрейма инициализирует оконную систему, заданную initial-frame-alist и default-frame-alist (см. Начальные параметры фрейма) для графического фрейма, вызывая функцию window-system-initialization для этой оконной системы. Это не выполняется в пакетном (неинтерактивном) режиме или в режиме демона.
  11. Инициализирует лица начального фрейма и настраивает строку меню и панель инструментов, если требуется. Если графические фреймы поддерживаются, настраивает панель инструментов, даже если текущий фрейм не является графическим, поскольку графический фрейм может быть создан позже.
  12. Использует custom-reevaluate-setting для повторной инициализации элементов списка custom-delayed-init-variables. Это любые предварительно загруженные пользовательские параметры, значение по умолчанию которых зависит от контекста выполнения, а не сборки. См. custom-initialize-delay.
  13. Загружает библиотеку site-start, если она существует. Это не делается, если были указаны параметры ‘-Q’ или ‘--no-site-file’.
  14. Загружает ваш файл инициализации (см. Файл инициализации). Это не делается, если были указаны параметры ‘-q’, ‘-Q’ или ‘--batch’. Если указан параметр ‘-u’, Emacs ищет файл инициализации в домашнем каталоге этого пользователя.
  15. Загружает библиотеку default, если она существует. Это не делается, если inhibit-default-init не равен nil, а также если были указаны параметры ‘-q’, ‘-Q’ или ‘--batch’.
  16. Загружает ваши аббревиатуры из файла, заданного abbrev-file-name, если этот файл существует и может быть прочитан (см. abbrev-file-name). Это не делается, если был указан параметр ‘--batch’.
  17. Устанавливает переменную after-init-time в значение current-time. Ранее эта переменная была установлена в nil; установка её в текущее время сигнализирует, что фаза инициализации завершена, и вместе с before-init-time позволяет измерить, сколько времени это заняло.
  18. Запускает обычные хуки after-init-hook и delayed-warnings-hook. Последний показывает любые предупреждения, выданные во время предыдущих этапов запуска, которые автоматически откладываются.
  19. Если буфер *scratch* существует и всё ещё находится в режиме Fundamental (как и должно быть по умолчанию), устанавливает его основной режим в соответствии с initial-major-mode.
  20. При запуске на текстовом терминале загружает терминально-специфичную Lisp-библиотеку (см. Терминально-специфичная инициализация) и запускает хук tty-setup-hook. Это не выполняется в режиме --batch и если term-file-prefix равен nil.
  21. Отображает начальное сообщение в области эхо, если вы не отключили это с помощью inhibit-startup-echo-area-message.
  22. Обрабатывает любые параметры командной строки, не обработанные ранее.
  23. Теперь завершает работу, если был указан параметр --batch.
  24. Если буфер *scratch* существует и пуст, вставляет (substitute-command-keys initial-scratch-message) в этот буфер.
  25. Если initial-buffer-choice является строкой, посещает файл (или каталог) с этим именем. Если это функция, вызывает функцию без аргументов и выбирает буфер, который она возвращает. Если в качестве аргумента командной строки передан один файл, этот файл посещается и его буфер отображается вместе с initial-buffer-choice. Если передано более одного файла, все файлы посещаются, и буфер *Список буферов* отображается вместе с initial-buffer-choice.
  26. Запускает emacs-startup-hook.
  27. Вызывает frame-notice-user-settings, которая изменяет параметры выбранного фрейма в соответствии с тем, что задано в файлах инициализации.
  28. Запускает window-setup-hook. Единственное отличие между этим хуком и emacs-startup-hook состоит в том, что этот запускается после упомянутых выше изменений параметров фрейма.
  29. Отображает экран запуска — специальный буфер, содержащий информацию об авторских правах и основах использования Emacs. Это не делается, если inhibit-startup-screen или initial-buffer-choice не равны nil, или если были указаны параметры командной строки ‘--no-splash’ или ‘-Q’.
  30. Если был запрошен демон, вызывает server-start. (В системах POSIX, если был запрошен фоновый демон, он затем отсоединяется от управляющего терминала.) См. Сервер Emacs в Руководстве GNU Emacs.
  31. При запуске менеджером сессий X вызывает emacs-session-restore, передавая в качестве аргумента идентификатор предыдущей сессии. См. Управление сессиями.

Следующие параметры влияют на некоторые аспекты последовательности запуска.

Пользовательский параметр: inhibit-startup-screen

Если эта переменная не равна nil, она запрещает экран запуска. В этом случае Emacs обычно отображает буфер *scratch*, но см. initial-buffer-choice ниже.

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

inhibit-startup-message и inhibit-splash-screen являются псевдонимами этой переменной.

Пользовательский параметр: initial-buffer-choice

Если не равен nil, эта переменная является строкой, задающей файл или каталог, который Emacs должен отобразить после запуска, вместо экрана запуска. Если её значение является функцией, Emacs вызывает эту функцию, которая должна вернуть буфер, который затем отображается. Если её значение равно t, Emacs отображает буфер *scratch*.

Пользовательский параметр: inhibit-startup-echo-area-message

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

(setq inhibit-startup-echo-area-message
      "ваше-имя-пользователя")

Emacs явно проверяет наличие выражения, показанного выше, в вашем файле инициализации; ваше имя пользователя должно присутствовать в выражении как строковая константа Lisp. Вы также можете использовать интерфейс Customize. Другие способы установки inhibit-startup-echo-area-message в то же значение не подавляют начальное сообщение. Таким образом, вы можете легко подавить сообщение для себя, если хотите, но бездумное копирование вашего файла инициализации не подавит сообщение для кого-то другого.

Пользовательский параметр: initial-scratch-message

Если эта переменная не равна nil, она должна быть строкой, которая рассматривается как документация для вставки в буфер *scratch* при запуске Emacs или при его повторном создании. Если она равна nil, буфер *scratch* пуст.

Следующие параметры командной строки влияют на некоторые аспекты последовательности запуска. См. Начальные параметры в Руководстве GNU Emacs.

--no-splash

Не отображать заставку.

--batch

Запуск без интерактивного терминала. См. Пакетный режим.

--daemon
--bg-daemon
--fg-daemon

Не инициализировать дисплей; просто запустить сервер. («Фоновый» демон автоматически запускается в фоне.)

--no-init-file
-q

Не загружать ни файл инициализации, ни библиотеку default.

--no-site-file

Не загружать библиотеку site-start.

--quick
-Q

Эквивалентно ‘-q --no-site-file --no-splash’.

--init-directory

Указать каталог для поиска файлов инициализации Emacs.