Project Icon

nixvim

基于Nix模块的灵活Neovim配置框架

NixVim是一个基于Nix模块的Neovim配置框架,通过Nix语言实现Neovim的灵活定制。该框架简化了插件管理、主题设置和键位映射等配置,同时保持高度可扩展性。NixVim支持多种使用方式,包括Home Manager、NixOS集成和独立运行。它提供了全面的文档,旨在简化Neovim配置流程,充分发挥Nix的优势。

文档 | 聊天

# 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作为配色方案,无需额外配置!

查看这份真实世界nixvim配置列表

它是如何工作的?

当你构建模块(可能使用home-manager)时,它会安装所有你的插件,并为NeoVim生成一个包含所有指定选项的lua配置。由于它使用lua,这确保了你的配置将以尽可能快的速度加载。 由于默认情况下一切都是禁用的,它将会像你希望的那样快速响应。

插件设置

大多数插件都有一个settings选项,它接受任何nix属性集并将其转换为lua表。然后这个表会被传递给插件的setup函数。实际上,这意味着如果一个插件有settings选项,任何插件选项都可以被配置,即使我们没有明确对应的nix选项。

原始lua

如果你只是想在init.lua中添加额外的lua代码行,你可以使用extraConfigLuaextraConfigLuaPreextraConfigLuaPost。 如果你想将lua代码赋值给一个通常接受其他类型(字符串、整数等)的选项,你可以使用nixvim的"原始类型",{ __raw = "lua代码"; }

示例 这段nix代码: ```nix { some_option.__raw = "function() print('hello, world!') end"; } ``` 将生成以下lua代码: ```lua { ['some_option'] = function() print('hello, world!') end, } ```
## 支持/问题 如果您有任何问题,请使用[讨论页面](https://github.com/nix-community/nixvim/discussions/categories/q-a)!或者,加入Matrix频道[#nixvim:matrix.org](https://matrix.to/#/#nixvim:matrix.org)! ## 安装 > [!警告] > NixVim 需要与兼容的 nixpkgs 版本一起安装。 > 这意味着 NixVim 的 `main` 分支需要使用 `nixos-unstable` 安装。 > > 如果您想使用 nixpkgs 24.05 版本的 NixVim,您应该使用 `nixos-24.05` 分支。 更多详情,请参阅我们文档中的[安装](https://nix-community.github.io/nixvim/install.html#installation)部分。
不使用 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 的模块。

## 使用方法 NixVim 可以通过四种方式使用:通过 home-manager、nix-darwin、NixOS 模块,以及通过 `makeNixvim` 函数独立使用。要使用这些模块,只需根据你所使用的系统导入 `nixvim.homeManagerModules.nixvim`、`nixvim.nixDarwinModules.nixvim` 和 `nixvim.nixosModules.nixvim` 模块即可。

更多详细信息,请参阅我们文档中的使用方法部分。

独立使用

如果你想独立使用,可以使用 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 模块定义。这对于传递额外的模块机制(如 optionsimports)很有用。
  • 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];
};
# 文档 本项目的文档可在 GitHub Pages 上找到: [https://nix-community.github.io/nixvim](https://nix-community.github.io/nixvim) 稳定版文档也可以在 [https://nix-community.github.io/nixvim/stable](https://nix-community.github.io/nixvim/stable) 查看。 如果 `enableMan` 选项设置为 `true`(默认为 true),包含相同信息的 man 页面也会被安装,可以通过 `man nixvim` 查看。

插件

安装 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
silentfalse<silent>
nowaitfalse<nowait>
scriptfalse<script>
exprfalse<expr>
uniquefalse<unique>
noremaptrue使用映射的 'noremap' 变体
remapfalse使映射递归(与 noremap 相反)
desc""此键位映射的描述

全局变量

有时您可能想定义一个全局变量,例如设置 leader 键。这可以通过 globals 属性轻松实现:

{
  programs.nixvim = {
    globals.mapleader = ","; # 将 leader 键设置为逗号
  };
}

附加配置

有时 NixVim 可能无法满足您所有的自定义需求。在这些情况下,提供了 extraConfigVimextraConfigLua 选项:

{
  programs.nixvim = {
    extraConfigLua = ''
      -- 在 nvim 打开时打印一条小欢迎消息!
      print("Hello world!")
    '';
  };
}

如果您觉得您手动做的事情应该在 NixVim 中得到支持,请开一个 issue。

贡献指南

参见 CONTRIBUTING.md

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号