В репозитории Debian 11 включен Emacs версии 27.1, в котором отсутствуют некоторые функции. Поэтому последнюю версию целесообразно собирать из исходников.
При сборке из исходников можно получить:
- поддержку синтаксического анализа кода при помощи tree-sitter;
- просмотр и динамическое изменение размера изображений с помощью imagemagick;
- встроенную поддержку JSON, что позволяет ускорить работу серверов LSP;
- возможность открывать xwidgets в буферах Emacs.
- нативную поддержку JIT- компиляции, что позволяет улучшить общую производительность Emacs.
Кроме того, при сборке можно поиграть с разными оптимизациями GCC.
Получаем исходники Emacs
Первое, что нужно сделать — это скачать исходники. Для этого клонируем git-репозиторий.
git clone git://git.savannah.gnu.org/emacs.git
Git скачает около 800mb исходников. Если не нужна история и предыдущие версии, то:
git clone --depth 1 git://git.savannah.gnu.org/emacs.git
Эта команда скачает только последнюю ветку master
репозитория, не загружая всю историю.
Зеркала на savannah.gnu.org медленные поэтому возможно имеет смысл скачать с github.
Устанавливаем необходимые для сборки зависимости
Все зависимости сразу можно установить одной командой:
apt build-dep emacs
Но по-моему, она тащит много лишнего. Поэтому ставим все необходимое руками.
Зависимости, необходимые для базовой установки
apt install \
build-essential \
libgtk-3-dev \
libgnutls28-dev \
libtiff5-dev \
libgif-dev \
libjpeg-dev \
libpng-dev \
libxpm-dev \
libncurses-dev \
libwebkit2gtk-4.0-dev \
texinfo
Нативная поддержка JSON
apt install \
libjansson4 \
libjansson-dev
Поддержка JIT-компиляции
При первом запуске Emacs начнет перекомпилировать все установленные пакеты, открывать различные буферы, и вести себя крайне агрессивно.
apt install \
libgccjit0 \
libgccjit-10-dev
Динамическое изменение размера изображений
apt install \
libmagickcore-dev \
libmagick++-dev
Инкрементальный анализ
Библиотека tree-sitter — это система синтаксического анализа общего назначения, поддерживающая инкрементный синтаксический анализ и восстановление после ошибок.
В стабильном Debian нет нужных пакетов, но они есть в ветке testing.
Подключаем репозиторий testing.
Создаем файл /etc/apt/sources.list.d/bookworm.list
.
deb http://deb.debian.org/debian/ bookworm main
Чтобы не сломать систему назначаем ветке testing
минимальный приоритет.
Создадим файл /etc/apt/preferences.d/20bookworm
смотри man 5 apt_preferences
Package: *
Pin: release a=testing
Pin-Priority: 1
Теперь можно ставить нужные зависимости
apt install libtree-sitter-dev
Сборка и установка
Теперь переходим в каталог с исходниками.
cd emacs
Emacs будет собираться из ветки master
. Чтобы собрать Emacs другой версии, переключаем ветку.
Например: чтоб собрать Emacs 29, переключаемся на ветку 29:
git checkout emacs-29
git pull
Теперь будет собираться Emacs 29.
Устанавливаем компилятор, которым будем собирать Emacs.
export CC=/usr/bin/gcc-10
export CXX=/usr/bin/gcc-10
Настраиваем сборку.
./autogen.sh
Возможно также стоит запустить ./configure --help
, чтобы посмотреть и включить нужные опции.
./configure \
--with-native-compilation \
--with-json \
--with-tree-sitter \
--with-imagemagick \
--with-xwidgets \
--without-compress-install
--with-native-compilation
- включает поддержку встроенного компилятора Emacs Lisp.
--with-tree-sitter
- включить tree-sitter
--with-json
- скомпилировать с собственной поддержкой JSON
--with-imagemagick
- включает поддержку imagemagick
--with-xwidgets
- включить использование xwidgets в буферах Emacs
--without-compress-install
- не сжимать некоторые файлы (*.el, *.info и т. д.) при установке.
После этого запускаем сборку.
make --jobs=$(nproc)
Устанавливаем Emacs
Следующая команда выполняется от пользователя root
.
Emacs будет установлен в каталог /usr/local/bin
make install
Проверяем, работают ли новые функции
Чтобы проверить, что и JSON, и tree-sitter работают, нужно запустить следующий elisp код в Emacs.
Для tree-sitter:
(if (and (fboundp 'native-comp-available-p)
(native-comp-available-p))
(message "Native compilation is available")
(message "Native complation is *not* available"))
И для JSON:
(if (functionp 'json-serialize)
(message "Native JSON is available")
(message "Native JSON is *not* available"))
В итоге получаем:
emacs --version
GNU Emacs 30.0.50
Development version 50b55656b9c5 on master branch; build date 2023-02-25.
Copyright (C) 2023 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GNU Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.