image

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 ];

Технологии:

Нужна помощь с вашим проектом?

Если вы работодатель или управляете проектом я буду рад сотрудничеству. Свяжитесь со мной и мы обсудим детали.