После обновления на Debian 13 и обновления плагинов для neovim столкнулся с неприятной ошибкой в популярном плагине для автокомплита nvim-cmp. Ошибка происходила при вводе любых данных в режиме вставки. Трассировка выдавала что-то на подобии: Обнаружена ошибка при обработке TextChangedI Автокоманды для "*":
Error executing lua callback: /usr/local/share/nvim/runtime/lua/vim/lspclient.lua:643: bufnr: expected number, got function
stack traceback:
[C]: in function 'error'
vim/shared.lua: in function 'validate'
/usr/local/share/nvim/runtime/lua/vim/lsp/client.lua:643: in function 'resolve_bufnr'
...
++ Решение
В Debian 13 находится neovim версии 0.10.4. Дополнение nvim-cmp по какой-то причине требует для работы более новую версию neovim. В частности, проблема исчезла с версией 0.11.3.
++ Установка более свежей версии neovim
Существует много способов установки более свежих пакетов в Debian, включая подключение репозитория backports и использование самодостаточных пакетов типа appimage или flatpack. Ниже будет описан более сложный, но универсальный и контролируемый способ - сборка необходимого deb пакета вручную. Руководство по сборке и установки рассчитано на пользователей которые никогда раньше этим не занимались.
1. Клонирование нужной версии из официального репозитория:
git clone --depth=1 --recurse-submodules --branch=v0.11.3 https://github.com/neovim/neovim.git
--depth=1 позволяет не скачивать всю историю изменений ветки
--recurse-submodules заставляет скачать все необходимые для сборки модули из других репозиториев github
--branch=v0.11.3 указывает необходимую для скачивания ветку, в частности используем ветку помеченую через tag v0.11.3
2. Компиляция программы
Переходим в директорию neovim и начинаем сборку:
cd neovim
make CMAKE_INSTALL_PREFIX=/usr/local/ -j14
prefix позволяет задать директорию для дальнейшей установки пакета отличной от директории по умолчанию. Пакеты собранные вручную лучше располfгать по пути /usr/local/
Флаг -j14 определяет количество потоков, которые будут использоваться для параллельной сборки. Рекомендуется использовать не более чем количество логических ядер процессора + 1.
3. Установка программы в локальную директорию
После окончания сборки создадим временную директорию nvim-v0.11.3 и установим в неё скомпилированный neovim:
mkdir nvim-v0.11.3
make DESTDIR=$(pwd)/nvim-v0.11.3 install
DESTDIR указывает директорию, которая будет использована вместо корня файловой системы. $(pwd) дописывает абсолютный путь к текущей директории. После этого шага директория nvim-v0.11.3 должна содержать папку usr содержимым, которое пакетный менеджер должен добавить в текущую систему.
На данном этапе программа уже может работать и не вызывать ошибок. Проверить это выполнив команду:
nvim-v0.11.3/usr/local/bin/nvim
4. Подготовка информации для превращения созданной директории в deb пакет
Для формирования пакета в директории nvim-v0.11.3 необходимо создать еще одну папку DEBIAN и добавить в ней два файла.
Файл с описанием пакета nvim-v0.11.3/DEBIAN/control со следующим содержимым:
Package: neovim
Version: 0.11.3
Architecture: amd64
Section: editors, devel
Priority: standard
Maintainer: Ваше Имя {your@mail.ru>
Description: Code editor
Можно изменить сведения в поле Maintainer и отредактировать поле Architecture в соответствии с архитектурой вашего процессора (актуально для всяких SBC на ARM и RISC-V)
Устанавливаемые программы могут использовать разделяемые библиотеки (shared object). Данные библиотеки содержат общий для разных программ код в виде скомпилированных функций. Для того, чтобы эти библиотеки были доступны из места их установки часто необходимо указать системе о необходимости обновить соответствующую информацию. Сделать это можно в специальном скрипте, выполняемом после установки. Содержимое файла nvim-v0.11.3/DEBIAN/postinst должно выглядеть так:
#!/usr/bin/env bash
ldconfig && echo "Кэш разделяемых библиотек обновлен"
Данный скрипт необходимо сделать исполняемым. Сделать это можно консольной командой:
chmod +x nvim-v0.11.3/DEBIAN/postinst
5. Сборка deb пакета
Теперь полученную директорию можно превратить в deb пакет. Для этого необходимо выполнить команду:
dpkg-deb --build --root-owner-group nvim-v0.11.3
После успешного выполнения команды в текущей директории должен появиться файл nvim-v0.11.3.deb. Пакет можно скопировать на флешку либо распростронять любым другим способом, чтобы не собирать его снова на других компьютерах.
6. Установка deb пакета
Установить пакет можно с помощью менеджера apt:
sudo apt install ./nvim-v0.11.3.deb
При помощи apt пакет можно будет удалить. При необходимости установить более свежую версию nvim apt автоматически удалит предыдущую.
После установки nvim должен запускаться и нормально работать с указанным плагином.
URL:
Обсуждается: http://www.opennet.dev/tips/info/3278.shtml