NvChad for Nix (neovim)
Что это?
Мой личный репозиторий содержит черновик проекта. Проект был хорошо принят сообществом NvChad и nix-community. Главная ветка была перемещена в организацию nix-community и теперь активно поддерживается мной и сообществом.
Репозиторий проекта содержит nix flake для установки конфигурации NvChad на любой системе, использующей Nix и nix flakes. Flake содержит:
- пакет nvchad
- оверлей nvchad
- модуль home manager
Вы можете выбрать любой из представленных методов для установки NvChad.
Общие замечания
Сам NvChad не является исполняемым файлом, это идеальная конфигурация для Neovim.
К сожалению, нет простого способа добавить его в /nix/store
.
Точнее, добавить его легко, но он не будет работать, по крайней мере, пока (версия 2.5).
Это связано с тем, что по умолчанию neovim читает файл ~/.config/nvim/init.lua
и запускается.
NvChad лениво загружает плагины, и при первом запуске lazyvim
сохранит
lazy-lock.json
рядом с ~/.config/nvim/init.lua
.
Как вы понимаете, это не проблема для любого дистрибутива, и это
не нарушает принципы The Twelve Factor App,
поскольку, как уже сказано, NvChad является конфигурацией, а не пакетом с приложением.
Но в случае с Nix проблема в том, что /nix/store
является системой только для чтения,
исходный код, пытающийся записать файл или изменить текущий, вызовет ошибку.
Также возникнет проблема с возможностью изменения конфигурации
на лету, поскольку это изменяет файл chadrc.lua.Метод, который мы использовали для решения этой проблемы (модуль home-manager), является хаком.
Не волнуйтесь, он ничего не ломает, но не соответствует основному
принципу того, как home-manager добавляет конфигурационные файлы в домашний каталог пользователя.
Абсолютно все конфигурационные файлы хранятся в /nix/store/
.
По умолчанию home-manager создает символические ссылки из /nix/store/
в домашний каталог пользователя.
Это гарантирует, что изменения конфигурации после следующей сборки генерации будут доступны пользователю.Кроме того, если вы когда-либо создавали декларативную конфигурацию
для стандартного neovim, вы знаете, что плагины также хранятся в /nix/store/
.
NvChad устанавливает плагины в ~/.local/share/nvim/
.
Это не проблема для нас, они все равно являются неизменяемыми до тех пор, пока вы не обновите их явно.
Если ваша собственная конфигурация NvChad, которую вы передаете
в модуль как config.programs.nvchad.extraConfig
,
содержит lazy-lock.json
, будут установлены конкретные версии плагинов.
Вот все, что вам нужно знать, прежде чем начать использовать NvChad с Nix. Если вам все еще нужно добавить NvChad в вашу конфигурацию, добро пожаловать!
Как это работает?
-
вы добавляете этот репозиторий как
inputs
вflake.nix
вашей конфигурации -
вы добавляете пакет с NvChad в вашу конфигурацию как оверлей или как модуль home-manager
- указываете extraPackages и extraConfig для пакета или модуля
- вы создаете новое поколение системы в результате вы получаете исполняемый файл
nvim
,nvim.desktop
для запуска из лаунчера и ваш собственный оверлей конфигурации, если вы передали extraConfig - каждый extraPackages доступен для NvChad, если это, например, сервер LSP, NvChad найдет его исполняемый файл
- extraPackages не доступны глобально, они доступны только в рамках NvChad
- если вы не передали никаких параметров, только extraPackages для стартовой конфигурации включены
Быстрый запуск без установки для пробной версии
nix run github:MOIS3Y/nvchad4nix/v2.5#nvchad
⚠️ПРЕДУПРЕЖДЕНИЕ⚠️
Запустите команду выше, если вы не используете свою конфигурацию neovim!
Если у вас уже есть конфигурация neovim в ~/.config/nvim
и там присутствует init.lua
,
nvchad не скопирует конфигурацию в домашний каталог и, вероятно, не запустится корректно.
Если в ~/.config/nvim
нет init.lua
, но есть другие файлы, это перезапишет
~/.config/nvim
конфигурацией NvChad starter.
Ваша текущая конфигурация будет сохранена в ~/.config/nvim/nvim_%Y_%m_%d_%H_%M_%S.bak
.
Установка
Чтобы установить его, вы должны включить flakes и ваша конфигурация NixOS должна управляться с помощью flakes. Смотрите Flakes для инструкций о том, как установить и включить их в NixOS. Первый шаг
Вы можете добавить этот flake
как inputs
в flake.nix
в репозитории,
содержащем вашу конфигурацию NixOS:
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
# ...
nvchad4nix = {
url = "github:MOIS3Y/nvchad4nix";
inputs.nixpkgs.follows = "nixpkgs";
};
# ...
};
Этот flake предоставляет оверлей для Nixpkgs, с пакетом и модулем home-manager.
Их можно найти в flake как
inputs.nvchad4nix.overlays.default
- inputs.nvchad4nix.overlays.nvchadinputs.nvchad4nix.packages.${system}.default
- inputs.nvchad4nix.packages.${system}.nvchadinputs.nvchad4nix.homeManagerModule
(где ${system} - это либо x86_64-linux, aarch64-linux, x86_64-darwin, aarch64-darwin)
Второй шаг
Выходные данные могут быть добавлены различными способами, например, так я делаю это для NixOS:
В следующем примере home manager установлен как модуль NixOS
outputs = { self, nixpkgs, home-manager, ... }@inputs:
let
system = "x86_64-linux";
lib = nixpkgs.lib;
pkgs = import nixpkgs { inherit system; config.allowUnfree = true; };
extraSpecialArgs = { inherit system; inherit inputs; }; # <- передача inputs в атрибутный набор для home-manager
specialArgs = { inherit system; inherit inputs; }; # <- передача inputs в атрибутный набор для NixOS (по желанию)
in {
nixosConfigurations = {
desktop-laptop = lib.nixosSystem {
modules = [
inherit specialArgs; # <- это сделает inputs доступными повсюду в конфигурации NixOS
./path/to/configuration.nix
home-manager.nixosModules.home-manager {
home-manager = {
inherit extraSpecialArgs; # <- это сделает inputs доступными повсюду в конфигурации HM
useGlobalPkgs = true;
useUserPackages = true;
users.yourUserName = import ./path/to/home.nix;
};
}
];
};
};
};
Если вы новичок в NixOS, вот полезный канал Vimjoyer.
Третий шаг (необязательно)
Все, что вам нужно сделать, это добавить nvchad в список доступных пакетов с помощью оверлеев.
Где-то в вашем configuration.nix
{ config, pkgs, inputs, ... }: { # <-- inputs из flake
# ...
nixpkgs = {
overlays = [
(final: prev: {
nvchad = inputs.nvchad4nix.packages."${pkgs.system}".nvchad;
})
];
};
# ...
}
Или добавьте напрямую в flake.nix
outputs = { self, nixpkgs, home-manager, ... }@inputs:
let
system = "x86_64-linux";
lib = nixpkgs.lib;
pkgs = import nixpkgs { inherit system; config.allowUnfree = true; };
extraSpecialArgs = { inherit system; inherit inputs; }; # <- передача inputs в атрибутный набор для home-manager
specialArgs = { inherit system; inherit inputs; }; # <- передача inputs в атрибутный набор для NixOS (по желанию)
in {
nixosConfigurations = {
desktop-laptop = lib.nixosSystem {
modules = [
inherit specialArgs; # <- это сделает inputs доступными повсюду в конфигурации NixOS
./path/to/configuration.nix
{ # <- пример добавления оверлея в Nixpkgs:
nixpkgs = {
overlays = [
inputs.nvchad4nix.overlays.default
];
};
};
home-manager.nixosModules.home-manager {
home-manager = {
inherit extraSpecialArgs; # <- это сделает inputs доступными повсюду в конфигурации HM
useGlobalPkgs = true;
useUserPackages = true;
users.yourUserName = import ./path/to/home.nix;
};
}
];
};
};
};
Теперь вы можете вызывать пакет из пакетов nixpkgs в любом месте.
pkgs.nvchad
Примеры:
users.users.<имя>.packages = [ pkgs.nvchad ]; NixOS
home.packages = with pkgs; [ pkgs.nvchad ]; home-manager
Конфигурация
В зависимости от того, какой метод использования вы выберете, посмотрите на пару фрагментов: Модуль home-manager
Где-то в вашем home.nix или отдельном модуле:
По умолчанию:
{ inputs, config, pkgs, ... }: {
imports = [
inputs.nvchad4nix.homeManagerModule
];
programs.nvchad.enable = true;
}
Или с настройкой опций:
{ inputs, config, pkgs, ... }: {
imports = [
inputs.nvchad4nix.homeManagerModule
];
programs.nvchad = {
enable = true;
extraPackages = with pkgs; [
nodePackages.bash-language-server
docker-compose-language-service
dockerfile-language-server-nodejs
emmet-language-server
nixd
(python3.withPackages(ps: with ps; [
python-lsp-server
flake8
]))
];
extraConfig = pkgs.fetchFromGitHub { # <- здесь вы можете установить свой репозиторий
owner = "NvChad";
repo = "starter";
rev = "41c5b467339d34460c921a1764c4da5a07cdddf7";
sha256 = "sha256-yxZTxFnw5oV/76g+qkKs7UIwgkpD+LkN/6IJxiV9iRY=";
name = "nvchad-2.5-starter";
};
hm-activation = true;
backup = true;
};
}
Вы также можете добавить свой репозиторий с установкой стандартного NvChad и своим оверлеем на основе Starter на чистом .lua в flake.nix inputs.
inputs = {
# По умолчанию:
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
# NvChad:
nvchad4nix = {
url = "github:MOIS3Y/nvchad4nix";
inputs.nixpkgs.follows = "nixpkgs";
};
nvchad-on-steroids = { # <- здесь
url = "github:MOIS3Y/nvchad-on-steroids";
flake = false;
};
};
А затем:
Где-то в вашем home.nix или отдельном модуле:
{ inputs, config, pkgs, ... }: {
imports = [
inputs.nvchad4nix.homeManagerModule
];
programs.nvchad = {
enable = true;
extraPackages = with pkgs; [
emmet-language-server
nixd
];
extraConfig = inputs.nvchad-on-steroids; # <- здесь extraConfig из inputs
hm-activation = true;
backup = false;
};
}
Доступные опции:
- enable
- extraPackages
- extraConfig
- hm-activation
- backup
enable
(необязательно)
true или false
если false, игнорировать этот модуль при сборке нового поколения.
neovim
(необязательно)
pkgs.neovim
"пакет neovim для использования под оберткой nvchad".
extraPackages
(необязательно)
[] список pkgs
Список дополнительных пакетов, доступных для NvChad в качестве зависимостей времени выполнения. Расширения NvChad предполагают, что библиотеки, которые им нужны, будут доступны глобально. По умолчанию все зависимости для стартовой конфигурации включены. Переопределение опции расширит этот список.
extraConfig (необязательно)
/nix/store/ваш-пакет-конфигурации
Ваша собственная конфигурация NvChad на основе стартового репозитория. Переопределение опции заменит стандартную конфигурацию, включенную в модуль. Это должен быть путь к nix store. Самый простой способ — использовать pkgs.fetchFromGitHub.
hm-activation
(необязательно)
true или false
Это трюк. Если вы не хотите, чтобы home-manager управлял конфигурацией nvchad, установите опцию в false. В этом случае HM не будет копировать конфигурацию, сохраненную в /nix/store, в ~/.config/nvim. Таким образом, вы можете настроить конфигурацию обычным способом, клонируя ее из репозитория NvChad. По умолчанию, ~/.config/nvim управляется HM.
backup
(необязательно)
true или false
Поскольку модуль нарушает принцип неизменяемости
и копирует NvChad в ~/.config/nvim, а не создает
символическую ссылку по умолчанию, он создаст резервную копию
~/.config/nvim_%Y_%m_%d_%H_%M_%S.bak при каждой генерации.
Это гарантирует, что модуль
не удалит эту конфигурацию случайно.
Вам, вероятно, не нужны резервные копии, просто отключите их:
config.programs.nvchad.backup = false;
.
Переопределение пакета
Примечание! помните, что пакет доступен глобально для установки, используйте оверлей из раздела Установка.
Сборку пакета можно настроить:
{ config, pkgs, ... }: let
my-awesome-nvchad-conf = pkgs.fetchFromGitHub {
owner = "NvChad";
repo = "starter";
rev = "41c5b467339d34460c921a1764c4da5a07cdddf7";
sha256 = "sha256-yxZTxFnw5oV/76g+qkKs7UIwgkpD+LkN/6IJxiV9iRY=";
name = "nvchad-2.5-starter";
};
in {
home.packages = with pkgs; [
(pkgs.nvchad.override {
extraPackages = [ nixd emmet-language-server ];
extraConfig = my-awesome-nvchad-conf;
})
];
}
Или с inputs:
{ inputs, config, pkgs, ... }: {
home.packages = with pkgs; [
(pkgs.nvchad.override {
extraPackages = [ nixd emmet-language-server ];
extraConfig = inputs.my-awesome-nvchad-conf;
})
];
}
Использование
Какой бы метод вы ни выбрали, после установки вы, вероятно, захотите запустить NvChad.
Используя исполняемый файл обертки nvim, он будет автоматически доступен в вашем $PATH
.
Вы также можете запустить его через менеджер приложений (rofi, wofi и др.).
Пакет поставляется с nvim.desktop
.
Если вы не используете модуль HM или отключилиhm-activation
:
NvChad ожидает, что ~/.config/nvim/init.lua
будет доступен при запуске.
если файл не существует, NvChad скопирует его и все файлы из /nix/store/hash-nvchad-2.5/config
.
это будет либо ваша конфигурация, либо стартовая.
если ~/.config/nvim/ не пуст, NvChad создаст резервную копию рядом.
Примечание!
Если вы используете модуль home-manager для NvChad, не добавляйте neovim из стандартного модуля:
programs.neovim.enable = true;
Также не добавляйте neovim как пакет в конфигурацию:
home.packages = [ pkgs.neovim ];