文档 | 聊天
# NixVim - 一个基于nix的Neovim配置系统 - [快速设置教程](https://www.youtube.com/watch?v=b641h63lqy0)(由[@Vimjoyer](https://www.youtube.com/@vimjoyer)制作) - [Nixvim:如何利用Nix的强大功能配置Neovim](https://www.youtube.com/watch?v=GOe0C7Qtypk)(NeovimConf 2023演讲,由[@GaetanLepage](https://glepage.com/)主讲) ## 这是什么?NixVim 是一个基于 Nix 模块构建的 Neovim 发行版。它以 Nix flake 的形式发布,通过 Nix 进行配置,同时为您的插件和 vimrc 留有空间。
它看起来是什么样的?
这里有一个简单的配置,使用gruvbox作为配色方案,并使用lightline插件:
{
programs.nixvim = {
enable = true;
colorschemes.gruvbox.enable = true;
plugins.lightline.enable = true;
};
}
当我们这样做时,lightline将被设置为一个合理的默认值,并使用gruvbox作为配色方案,无需额外配置!
它是如何工作的?
当你构建模块(可能使用home-manager)时,它会安装所有你的插件,并为NeoVim生成一个包含所有指定选项的lua配置。由于它使用lua,这确保了你的配置将以尽可能快的速度加载。 由于默认情况下一切都是禁用的,它将会像你希望的那样快速响应。
插件设置
大多数插件都有一个settings
选项,它接受任何nix属性集并将其转换为lua表。然后这个表会被传递给插件的setup
函数。实际上,这意味着如果一个插件有settings
选项,任何插件选项都可以被配置,即使我们没有明确对应的nix选项。
原始lua
如果你只是想在init.lua
中添加额外的lua代码行,你可以使用extraConfigLua
、extraConfigLuaPre
和extraConfigLuaPost
。
如果你想将lua代码赋值给一个通常接受其他类型(字符串、整数等)的选项,你可以使用nixvim的"原始类型",{ __raw = "lua代码"; }
。
示例
这段nix代码: ```nix { some_option.__raw = "function() print('hello, world!') end"; } ``` 将生成以下lua代码: ```lua { ['some_option'] = function() print('hello, world!') end, } ```不使用 flakes
NixVim 现在附带 flake-compat
,使其可以在任何系统上使用。
要安装它,请编辑您的 home-manager(或 NixOS)配置:
{ pkgs, lib, ... }:
let
nixvim = import (builtins.fetchGit {
url = "https://github.com/nix-community/nixvim";
# 如果您没有运行 nixpkgs 的不稳定版本,请选择对应的 nixvim 分支。
# ref = "nixos-24.05";
});
in
{
imports = [
# 对于 home-manager
nixvim.homeManagerModules.nixvim
# 对于 NixOS
nixvim.nixosModules.nixvim
# 对于 nix-darwin
nixvim.nixDarwinModules.nixvim
];
programs.nixvim.enable = true;
}
使用 flakes
如果您已经在使用 flakes 管理系统,这是推荐的方法。要启用 flakes,请在 /etc/nixos/configuration.nix
中添加以下内容:
{ pkgs, lib, ... }:
{
nix = {
settings.experimental-features = [ "nix-command" "flakes" ];
};
}
现在,您需要导入模块。如果您的系统已经使用 flakes 配置,只需添加 nixvim 输入:
{
# ...
inputs.nixvim = {
url = "github:nix-community/nixvim";
# 如果您没有运行 nixpkgs 的不稳定版本,请选择对应的 nixvim 分支。
# url = "github:nix-community/nixvim/nixos-24.05";
inputs.nixpkgs.follows = "nixpkgs";
};
}
现在您可以使用 inputs.nixvim.homeManagerModules.nixvim
访问 home-manager 安装的模块,使用 inputs.nixvim.nixosModules.nixvim
访问 NixOS 的模块,以及使用 inputs.nixvim.nixDarwinModules.nixvim
访问 nix-darwin 的模块。
更多详细信息,请参阅我们文档中的使用方法部分。
独立使用
如果你想独立使用,可以使用 makeNixvim
函数:
{ pkgs, nixvim, ... }: {
environment.systemPackages = [
(nixvim.legacyPackages."${pkgs.stdenv.hostPlatform.system}".makeNixvim {
colorschemes.gruvbox.enable = true;
})
];
}
要开始使用独立配置,你可以在一个空目录中运行以下命令使用模板(推荐):
nix flake init --template github:nix-community/nixvim
或者,如果你想要一个最小的 flake 来构建自定义的 neovim,可以使用以下配置:
最小 flake 配置
{
description = "一个非常基础的 flake";
inputs.nixvim.url = "github:nix-community/nixvim";
outputs = {
self,
nixvim,
flake-parts,
} @ inputs: let
config = {
colorschemes.gruvbox.enable = true;
};
in
flake-parts.lib.mkFlake {inherit inputs;} {
systems = [
"aarch64-darwin"
"aarch64-linux"
"x86_64-darwin"
"x86_64-linux"
];
perSystem = {
pkgs,
system,
...
}: let
nixvim' = nixvim.legacyPackages."${system}";
nvim = nixvim'.makeNixvim config;
in {
packages = {
inherit nvim;
default = nvim;
};
};
};
}
然后你可以使用 nix run .# -- <file>
运行 neovim。这对于轻松测试配置更改很有用。
高级用法
你可能想要对 nixvim 模块有更多控制,比如:
- 将配置分割成多个文件
- 添加自定义 nix 模块来增强 nixvim
- 更改 nixvim 使用的 nixpkgs
在这种情况下,你可以使用 makeNixvimWithModule
函数。
它接受一个包含以下键的集合:
pkgs
:要使用的 nixpkgs(默认为 nixvim flake 指向的 nixpkgs)module
:用于扩展 nixvim 的 nix 模块定义。这对于传递额外的模块机制(如options
或imports
)很有用。extraSpecialArgs
:使用函数时传递给模块的额外参数。例如,在 flake 中可以是self
。
更多详细信息,请参阅我们文档中的独立使用部分。
与 devShell
一起使用
你还可以使用 nixvim 定义一个只在 Nix devShell
内可用的实例:
devShell 配置
let
nvim = nixvim.legacyPackages.x86_64-linux.makeNixvim {
plugins.lsp.enable = true;
};
in pkgs.mkShell {
buildInputs = [nvim];
};
插件
安装 NixVim 后,您无疑会想要启用一些插件。插件基于模块系统,类似于 NixOS 和 Home Manager。
因此,要启用受支持的插件,您只需启用其模块:
{
programs.nixvim = {
plugins.lightline.enable = true;
};
}
当然,如果仅此而已,NixVim 就没什么意义了,您可以直接使用常规的插件管理器。所有受支持插件的选项都作为该模块的选项公开。目前还没有文档,但源代码中有详细的解释。计划为每个模块提供详细文档。
并非所有插件都有模块,所以您可能仍然想要获取一些插件。这不是问题,只需使用 extraPlugins
选项:
{
programs.nixvim = {
extraPlugins = with pkgs.vimPlugins; [
vim-nix
];
};
}
但是,如果您发现自己经常这样做,请考虑贡献或请求一个模块!
配色方案
配色方案在不同的范围内提供:
{
programs.nixvim = {
# 启用 gruvbox
colorschemes.gruvbox.enable = true;
};
}
就像普通插件一样,额外的配色方案选项作为其模块的一部分提供。
如果您的配色方案不是作为模块提供的,请使用 extraPlugins
安装它,并使用 colorscheme
选项设置:
{
programs.nixvim = {
extraPlugins = [ pkgs.vimPlugins.gruvbox ];
colorscheme = "gruvbox";
};
}
默认情况下,所有 NixVim 支持的插件都会使用您设置的主要配色方案,但可以在每个插件的基础上覆盖。
选项
NeoVim 有很多配置选项。您可以在 NeoVim 中通过 :h option-list
找到它们的列表。
所有这些都可以在 NixVim 中配置。您只需要设置 opts
属性:
{
programs.nixvim = {
opts = {
number = true; # 显示行号
relativenumber = true; # 显示相对行号
shiftwidth = 2; # Tab 宽度应为 2
};
};
}
请注意,例如,要禁用行号,您不应将 opts.nonumber
设置为 true,而应将 opts.number
设置为 false。
键位映射
完全可以在 NixVim 中定义键位映射。这是通过 keymaps
属性完成的:
{
programs.nixvim = {
keymaps = [
{
key = ";";
action = ":";
}
{
mode = "n";
key = "<leader>m";
options.silent = true;
action = "<cmd>!make<CR>";
}
];
};
}
这相当于以下 vimscript:
noremap ; :
nnoremap <leader>m <silent> <cmd>make<CR>
这个表格描述了 keymaps
选项的所有模式。
您可以通过使用字符串列表为单个映射提供多个模式。
简写 | 描述 |
---|---|
"n" | 普通模式 |
"i" | 插入模式 |
"v" | 可视和选择模式 |
"s" | 选择模式 |
"t" | 终端模式 |
"" | 普通、可视、选择和操作符待定模式 |
"x" | 仅可视模式,不包括选择 |
"o" | 操作符待定模式 |
"!" | 插入和命令行模式 |
"l" | 插入、命令行和语言参数模式 |
"c" | 命令行模式 |
每个键位映射可以在 options
属性中指定以下设置。
NixVim | 默认值 | VimScript |
---|---|---|
silent | false | <silent> |
nowait | false | <nowait> |
script | false | <script> |
expr | false | <expr> |
unique | false | <unique> |
noremap | true | 使用映射的 'noremap' 变体 |
remap | false | 使映射递归(与 noremap 相反) |
desc | "" | 此键位映射的描述 |
全局变量
有时您可能想定义一个全局变量,例如设置 leader 键。这可以通过 globals
属性轻松实现:
{
programs.nixvim = {
globals.mapleader = ","; # 将 leader 键设置为逗号
};
}
附加配置
有时 NixVim 可能无法满足您所有的自定义需求。在这些情况下,提供了 extraConfigVim
和 extraConfigLua
选项:
{
programs.nixvim = {
extraConfigLua = ''
-- 在 nvim 打开时打印一条小欢迎消息!
print("Hello world!")
'';
};
}
如果您觉得您手动做的事情应该在 NixVim 中得到支持,请开一个 issue。