mirror of
https://github.com/NotAShelf/nvf.git
synced 2025-09-05 18:01:32 +00:00
1321 lines
No EOL
108 KiB
HTML
1321 lines
No EOL
108 KiB
HTML
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||
<title>nvf manual</title>
|
||
<link rel="stylesheet" type="text/css" href="style.css" />
|
||
<script src="highlightjs/highlight.pack.js" type="text/javascript"></script><script src="highlightjs/loader.js" type="text/javascript"></script><script src="script/anchor-use.js" type="text/javascript"></script><script src="script/anchor-min.js" type="text/javascript"></script><script src="script/search.js" type="text/javascript"></script>
|
||
<meta name="generator" content="nixos-render-docs" />
|
||
<link rel="home" href="index.xhtml" title="nvf manual" />
|
||
<link rel="next" href="quirks.html" title="Appendix A. Known Issues and Quirks" />
|
||
</head>
|
||
<body>
|
||
<div class="navheader">
|
||
<table width="100%" summary="Navigation header">
|
||
<tr>
|
||
<th colspan="3" align="center">nvf manual</th>
|
||
</tr>
|
||
<tr>
|
||
<td width="20%" align="left"> </td>
|
||
<th width="60%" align="center"> </th>
|
||
<td width="20%" align="right"> <a accesskey="n" href="quirks.html">Next</a></td>
|
||
</tr>
|
||
</table>
|
||
<hr />
|
||
</div>
|
||
<div class="book">
|
||
<div class="titlepage">
|
||
<div>
|
||
<div><h1 class="title"><a id="nvf-manual"></a>nvf manual</h1></div>
|
||
<div><h2 class="subtitle">Version v0.8</h2></div>
|
||
</div>
|
||
<hr />
|
||
</div>
|
||
<div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="preface"> <a href="index.xhtml#ch-preface">Preface</a> </span></dt><dt> <span class="preface"> <a href="index.xhtml#ch-try-it-out">Try it out</a> </span></dt><dt> <span class="part"> <a href="index.xhtml#ch-installation">Installing nvf</a> </span></dt><dd><dl><dt> <span class="chapter"> <a href="index.xhtml#ch-standalone-installation">Standalone Installation</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-module-installation">Module Installation</a> </span></dt></dl></dd><dt> <span class="part"> <a href="index.xhtml#ch-configuring">Configuring nvf</a> </span></dt><dd><dl><dt> <span class="chapter"> <a href="index.xhtml#ch-custom-package">Custom Neovim Package</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-custom-plugins">Custom Plugins</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-overriding-plugins">Overriding plugins</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-languages">Language Support</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-using-dags">Using DAGs</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-dag-entries">DAG entries in nvf</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-autocmds-augroups">Autocommands and Autogroups</a> </span></dt></dl></dd><dt> <span class="part"> <a href="index.xhtml#ch-helpful-tips">Helpful Tips</a> </span></dt><dd><dl><dt> <span class="chapter"> <a href="index.xhtml#sec-debugging-nvf">Debugging nvf</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#sec-offline-documentation">Offline Documentation</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#sec-pure-lua-config">Pure Lua Configuration</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#sec-plugin-sources">Adding Plugins From Different Sources</a> </span></dt></dl></dd><dt> <span class="chapter"> <a href="index.xhtml#ch-hacking">Hacking nvf</a> </span></dt><dt> <span class="appendix"> <a href="quirks.html">A. Known Issues and Quirks</a> </span></dt><dt> <span class="appendix"> <a href="options.html">B. nvf Configuration Options</a> </span></dt><dt> <span class="appendix"> <a href="release-notes.html">C. Release Notes</a> </span></dt> </dl></div>
|
||
<div class="preface"> <div class="titlepage"> <div> <div> <h1 id="ch-preface" class="title" >Preface </h1> </div> </div></div><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#sec-what-is-it">What is nvf</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-bugs-suggestions">Bugs & Suggestions</a> </span></dt> </dl></div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-what-is-it" class="title" >What is nvf </h2> </div> </div></div><p>nvf is a highly modular, configurable, extensible and easy to use Neovim
|
||
configuration in Nix. Designed for flexibility and ease of use, nvf allows you
|
||
to easily configure your fully featured Neovim instance with a few lines of Nix.</p>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-bugs-suggestions" class="title" >Bugs & Suggestions </h2> </div> </div></div><p>If you notice any issues with nvf, or this documentation, then please consider
|
||
reporting them over at the <a class="link" href="https://github.com/notashelf/nvf/issues" target="_top">issue tracker</a>. Issues tab, in addition to the
|
||
<a class="link" href="https://github.com/notashelf/nvf/discussions" target="_top">discussions tab</a> is a good place as any to request new features.</p><p>You may also consider submitting bugfixes, feature additions and upstreamed
|
||
changes that you think are critical over at the <a class="link" href="https://github.com/notashelf/nvf/pulls" target="_top">pull requests tab</a>.</p>
|
||
</div>
|
||
|
||
</div><div class="preface"> <div class="titlepage"> <div> <div> <h1 id="ch-try-it-out" class="title" >Try it out </h1> </div> </div></div><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#sec-using-prebuilt-configs">Using Prebuilt Configs</a> </span></dt> </dl></div><p>Thanks to the portability of Nix, you can try out nvf without actually
|
||
installing it to your machine. Below are the commands you may run to try out
|
||
different configurations provided by this flake. As of v0.5, two specialized
|
||
configurations are provided:</p><div class="itemizedlist"><ul class="itemizedlist compact" style="list-style-type: disc;"><li class="listitem"><p><span class="strong"><strong>Nix</strong></span> - Nix language server + simple utility plugins</p></li><li class="listitem"><p><span class="strong"><strong>Maximal</strong></span> - Variable language servers + utility and decorative plugins</p></li></ul></div><p>You may try out any of the provided configurations using the <code class="literal">nix run</code> command
|
||
on a system where Nix is installed.</p><pre><code class="programlisting bash">$ cachix use nvf # Optional: it'll save you CPU resources and time
|
||
$ nix run github:notashelf/nvf#nix # will run the default minimal configuration
|
||
</code></pre><p>Do keep in mind that this is <span class="strong"><strong>susceptible to garbage collection</strong></span> meaning it
|
||
will be removed from your Nix store once you garbage collect.</p><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-using-prebuilt-configs" class="title" >Using Prebuilt Configs </h2> </div> </div></div><div class="toc"> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#sec-available-configs">Available Configurations</a> </span></dt> </dl></div><pre><code class="programlisting bash">$ nix run github:notashelf/nvf#nix
|
||
$ nix run github:notashelf/nvf#maximal
|
||
</code></pre><div class="section"> <div class="titlepage"> <div> <div> <h3 id="sec-available-configs" class="title" >Available Configurations </h3> </div> </div></div><p>::: {.info}</p><p>The below configurations are provided for demonstration purposes, and are
|
||
<span class="strong"><strong>not</strong></span> designed to be installed as is. You may</p><div class="section"> <div class="titlepage"> <div> <div> <h4 id="sec-configs-nix" class="title" >Nix </h4> </div> </div></div><p><code class="literal">Nix</code> configuration by default provides LSP/diagnostic support for Nix alongside
|
||
a set of visual and functional plugins. By running <code class="literal">nix run .#</code>, which is the
|
||
default package, you will build Neovim with this config.</p><pre><code class="programlisting bash">$ nix run github:notashelf/nvf#nix test.nix
|
||
</code></pre><p>This command will start Neovim with some opinionated plugin configurations, and
|
||
is designed specifically for Nix. the <code class="literal">nix</code> configuration lets you see how a
|
||
fully configured Neovim setup <span class="emphasis"><em>might</em></span> look like without downloading too many
|
||
packages or shell utilities.</p>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h4 id="sec-configs-maximal" class="title" >Maximal </h4> </div> </div></div><p><code class="literal">Maximal</code> is the ultimate configuration that will enable support for more
|
||
commonly used language as well as additional complementary plugins. Keep in
|
||
mind, however, that this will pull a lot of dependencies.</p><pre><code class="programlisting bash">$ nix run github:notashelf/nvf#maximal -- test.nix
|
||
</code></pre><p>It uses the same configuration template with the <a class="link" href="index.xhtml#sec-configs-nix" title="Nix" >Nix</a>
|
||
configuration, but supports many more languages, and enables more utility,
|
||
companion or fun plugins.</p><div class="warning"><h3 class="title">Warning</h3><p>Running the maximal config will download <span class="emphasis"><em>a lot</em></span> of packages as it is
|
||
downloading language servers, formatters, and more.</p></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div><div class="part"> <div class="titlepage"> <div> <div> <h1 id="ch-installation" class="title" >Installing nvf </h1> </div> </div></div><div class="partintro"><p>There are multiple ways of installing nvf on your system. You may either choose
|
||
the standalone installation method, which does not depend on a module system and
|
||
may be done on any system that has the Nix package manager or the appropriate
|
||
modules for NixOS and home-manager as described in the
|
||
<a class="link" href="index.xhtml#ch-module-installation" title="Module Installation" >module installation section</a>.</p><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="chapter"> <a href="index.xhtml#ch-standalone-installation">Standalone Installation</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-module-installation">Module Installation</a> </span></dt> </dl></div></div><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="ch-standalone-installation" class="title" >Standalone Installation </h2> </div> </div></div><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="chapter"> <a href="index.xhtml#ch-standalone-nixos">Standalone Installation on NixOS</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-standalone-hm">Standalone Installation on Home-Manager</a> </span></dt> </dl></div><p>It is possible to install nvf without depending on NixOS or Home-Manager as the
|
||
parent module system, using the <code class="literal">neovimConfiguration</code> function exposed in the
|
||
extended library. This function will take <code class="literal">modules</code> and <code class="literal">extraSpecialArgs</code> as
|
||
arguments, and return the following schema as a result.</p><pre><code class="programlisting nix">{
|
||
options = "The options that were available to configure";
|
||
config = "The outputted configuration";
|
||
pkgs = "The package set used to evaluate the module";
|
||
neovim = "The built neovim package";
|
||
}
|
||
</code></pre><p>An example flake that exposes your custom Neovim configuration might look like</p><pre><code class="programlisting nix">{
|
||
inputs = {
|
||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||
nvf.url = "github:notashelf/nvf";
|
||
};
|
||
|
||
outputs = {nixpkgs, ...} @ inputs: {
|
||
packages.x86_64-linux = {
|
||
# Set the default package to the wrapped instance of Neovim.
|
||
# This will allow running your Neovim configuration with
|
||
# `nix run` and in addition, sharing your configuration with
|
||
# other users in case your repository is public.
|
||
default =
|
||
(inputs.nvf.lib.neovimConfiguration {
|
||
pkgs = nixpkgs.legacyPackages.x86_64-linux;
|
||
modules = [
|
||
{
|
||
config.vim = {
|
||
# Enable custom theming options
|
||
theme.enable = true;
|
||
|
||
# Enable Treesitter
|
||
treesitter.enable = true;
|
||
|
||
# Other options will go here. Refer to the config
|
||
# reference in Appendix B of the nvf manual.
|
||
# ...
|
||
};
|
||
}
|
||
];
|
||
})
|
||
.neovim;
|
||
};
|
||
};
|
||
}
|
||
</code></pre><p>The above setup will allow to set up nvf as a standalone flake, which you can
|
||
build independently from your system configuration while also possibly sharing
|
||
it with others. The next two chapters will detail specific usage of such a setup
|
||
for a package output in the context of NixOS or Home-Manager installation.</p><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="ch-standalone-nixos" class="title" >Standalone Installation on NixOS </h2> </div> </div></div><p>Your built Neovim configuration can be exposed as a flake output to make it
|
||
easier to share across machines, repositories and so on. Or it can be added to
|
||
your system packages to make it available across your system.</p><p>The following is an example installation of <code class="literal">nvf</code> as a standalone package with
|
||
the default theme enabled. You may use other options inside <code class="literal">config.vim</code> in
|
||
<code class="literal">configModule</code>, but this example will not cover that extensively.</p><pre><code class="programlisting nix">{
|
||
inputs = {
|
||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||
home-manager.url = "github:nix-community/home-manager";
|
||
nvf.url = "github:notashelf/nvf";
|
||
};
|
||
|
||
outputs = {
|
||
nixpkgs,
|
||
nvf,
|
||
self,
|
||
...
|
||
}: {
|
||
# This will make the package available as a flake output under 'packages'
|
||
packages.x86_64-linux.my-neovim =
|
||
(nvf.lib.neovimConfiguration {
|
||
pkgs = nixpkgs.legacyPackages.x86_64-linux;
|
||
modules = [
|
||
# Or move this to a separate file and add it's path here instead
|
||
# IE: ./nvf_module.nix
|
||
(
|
||
{pkgs, ...}: {
|
||
# Add any custom options (and do feel free to upstream them!)
|
||
# options = { ... };
|
||
config.vim = {
|
||
theme.enable = true;
|
||
# and more options as you see fit...
|
||
};
|
||
}
|
||
)
|
||
];
|
||
})
|
||
.neovim;
|
||
|
||
# Example nixosConfiguration using the configured Neovim package
|
||
nixosConfigurations = {
|
||
yourHostName = nixpkgs.lib.nixosSystem {
|
||
# ...
|
||
modules = [
|
||
# This will make wrapped neovim available in your system packages
|
||
# Can also move this to another config file if you pass inputs/self around with specialArgs
|
||
({pkgs, ...}: {
|
||
environment.systemPackages = [self.packages.${pkgs.stdenv.system}.neovim];
|
||
})
|
||
];
|
||
# ...
|
||
};
|
||
};
|
||
};
|
||
}```
|
||
</code></pre>
|
||
</div><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="ch-standalone-hm" class="title" >Standalone Installation on Home-Manager </h2> </div> </div></div><p>Your built Neovim configuration can be exposed as a flake output to make it
|
||
easier to share across machines, repositories and so on. Or it can be added to
|
||
your system packages to make it available across your system.</p><p>The following is an example installation of <code class="literal">nvf</code> as a standalone package with
|
||
the default theme enabled. You may use other options inside <code class="literal">config.vim</code> in
|
||
<code class="literal">configModule</code>, but this example will not cover that extensively.</p><pre><code class="programlisting nix">{
|
||
inputs = {
|
||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||
home-manager.url = "github:nix-community/home-manager";
|
||
nvf.url = "github:notashelf/nvf";
|
||
};
|
||
|
||
outputs = {nixpkgs, home-manager, nvf, ...}: let
|
||
system = "x86_64-linux";
|
||
pkgs = nixpkgs.legacyPackages.${system};
|
||
configModule = {
|
||
# Add any custom options (and do feel free to upstream them!)
|
||
# options = { ... };
|
||
|
||
config.vim = {
|
||
theme.enable = true;
|
||
# and more options as you see fit...
|
||
};
|
||
};
|
||
|
||
customNeovim = nvf.lib.neovimConfiguration {
|
||
inherit pkgs;
|
||
modules = [configModule];
|
||
};
|
||
in {
|
||
# This will make the package available as a flake output under 'packages'
|
||
packages.${system}.my-neovim = customNeovim.neovim;
|
||
|
||
# Example Home-Manager configuration using the configured Neovim package
|
||
homeConfigurations = {
|
||
"your-username@your-hostname" = home-manager.lib.homeManagerConfiguration {
|
||
# ...
|
||
modules = [
|
||
# This will make Neovim available to users using the Home-Manager
|
||
# configuration. To make the package available to all users, prefer
|
||
# environment.systemPackages in your NixOS configuration.
|
||
{home.packages = [customNeovim.neovim];}
|
||
];
|
||
# ...
|
||
};
|
||
};
|
||
};
|
||
}
|
||
</code></pre>
|
||
</div>
|
||
</div><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="ch-module-installation" class="title" >Module Installation </h2> </div> </div></div><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="chapter"> <a href="index.xhtml#ch-nixos-module">NixOS Module</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-hm-module">Home-Manager Module</a> </span></dt> </dl></div><p>The below chapters will describe installing nvf as NixOS and Home-Manager
|
||
modules. Note that those methods are mutually exclusive, and will likely cause
|
||
path collisions if used simultaneously.</p><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="ch-nixos-module" class="title" >NixOS Module </h2> </div> </div></div><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#sec-example-installation-nixos">Example Installation</a> </span></dt> </dl></div><p>The NixOS module allows us to customize the different <code class="literal">vim</code> options from inside
|
||
the NixOS configuration without having to call for the wrapper yourself. It is
|
||
the recommended way to use <span class="strong"><strong>nvf</strong></span> alongside the home-manager module depending
|
||
on your needs.</p><p>To use it, we first add the input flake.</p><pre><code class="programlisting nix">{
|
||
inputs = {
|
||
# Optional, if you intend to follow nvf's obsidian-nvim input
|
||
# you must also add it as a flake input.
|
||
obsidian-nvim.url = "github:epwalsh/obsidian.nvim";
|
||
|
||
# Required, nvf works best and only directly supports flakes
|
||
nvf = {
|
||
url = "github:notashelf/nvf";
|
||
# You can override the input nixpkgs to follow your system's
|
||
# instance of nixpkgs. This is safe to do as nvf does not depend
|
||
# on a binary cache.
|
||
inputs.nixpkgs.follows = "nixpkgs";
|
||
# Optionally, you can also override individual plugins
|
||
# for example:
|
||
inputs.obsidian-nvim.follows = "obsidian-nvim"; # <- this will use the obsidian-nvim from your inputs
|
||
};
|
||
};
|
||
}
|
||
</code></pre><p>Followed by importing the NixOS module somewhere in your configuration.</p><pre><code class="programlisting nix">{
|
||
# assuming nvf is in your inputs and inputs is in the argset
|
||
# see example below
|
||
imports = [ inputs.nvf.nixosModules.default ];
|
||
}
|
||
</code></pre><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-example-installation-nixos" class="title" style="clear: both">Example Installation </h2> </div> </div></div><pre><code class="programlisting nix">{
|
||
inputs = {
|
||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||
nvf.url = "github:notashelf/nvf";
|
||
};
|
||
|
||
outputs = { nixpkgs, nvf, ... }: {
|
||
# ↓ this is your host output in the flake schema
|
||
nixosConfigurations."your-hostname" = nixpkgs.lib.nixosSystem {
|
||
modules = [
|
||
nvf.nixosModules.default # <- this imports the NixOS module that provides the options
|
||
./configuration.nix # <- your host entrypoint, `programs.nvf.*` may be defined here
|
||
];
|
||
};
|
||
};
|
||
}
|
||
</code></pre><p>Once the module is properly imported by your host, you will be able to use the
|
||
<code class="literal">programs.nvf</code> module option anywhere in your configuration in order to
|
||
configure <span class="strong"><strong>nvf</strong></span>.</p><pre><code class="programlisting nix{"> programs.nvf = {
|
||
enable = true;
|
||
# your settings need to go into the settings attribute set
|
||
# most settings are documented in the appendix
|
||
settings = {
|
||
vim.viAlias = false;
|
||
vim.vimAlias = true;
|
||
vim.lsp = {
|
||
enable = true;
|
||
};
|
||
};
|
||
};
|
||
}
|
||
</code></pre><div class="note"><h3 class="title">Note</h3><p><span class="strong"><strong>nvf</strong></span> exposes a lot of options, most of which are not referenced in the
|
||
installation sections of the manual. You may find all available options in the
|
||
<a class="link" href="https://notashelf.github.io/nvf/options" target="_top">appendix</a></p></div>
|
||
</div>
|
||
|
||
</div><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="ch-hm-module" class="title" >Home-Manager Module </h2> </div> </div></div><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#sec-example-installation-hm">Example Installation</a> </span></dt> </dl></div><p>The home-manager module allows us to customize the different <code class="literal">vim</code> options from
|
||
inside the home-manager configuration without having to call for the wrapper
|
||
yourself. It is the recommended way to use <span class="strong"><strong>nvf</strong></span> alongside the NixOS module
|
||
depending on your needs.</p><p>To use it, we first add the input flake.</p><pre><code class="programlisting nix">{
|
||
inputs = {
|
||
# Optional, if you intend to follow nvf's obsidian-nvim input
|
||
# you must also add it as a flake input.
|
||
obsidian-nvim.url = "github:epwalsh/obsidian.nvim";
|
||
|
||
# Required, nvf works best and only directly supports flakes
|
||
nvf = {
|
||
url = "github:notashelf/nvf";
|
||
# You can override the input nixpkgs to follow your system's
|
||
# instance of nixpkgs. This is safe to do as nvf does not depend
|
||
# on a binary cache.
|
||
inputs.nixpkgs.follows = "nixpkgs";
|
||
# Optionally, you can also override individual plugins
|
||
# for example:
|
||
inputs.obsidian-nvim.follows = "obsidian-nvim"; # <- this will use the obsidian-nvim from your inputs
|
||
};
|
||
};
|
||
}
|
||
</code></pre><p>Followed by importing the home-manager module somewhere in your configuration.</p><pre><code class="programlisting nix">{
|
||
# Assuming "nvf" is in your inputs and inputs is in the argument set.
|
||
# See example installation below
|
||
imports = [ inputs.nvf.homeManagerModules.default ];
|
||
}
|
||
</code></pre><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-example-installation-hm" class="title" style="clear: both">Example Installation </h2> </div> </div></div><pre><code class="programlisting nix">{
|
||
inputs = {
|
||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||
home-manager.url = "github:nix-community/home-manager";
|
||
nvf.url = "github:notashelf/nvf";
|
||
};
|
||
|
||
outputs = { nixpkgs, home-manager, nvf, ... }: {
|
||
# ↓ this is your home output in the flake schema, expected by home-manager
|
||
"your-username@your-hostname" = home-manager.lib.homeManagerConfiguration {
|
||
pkgs = nixpkgs.legacyPackages.x86_64-linux;
|
||
modules = [
|
||
nvf.homeManagerModules.default # <- this imports the home-manager module that provides the options
|
||
./home.nix # <- your home entrypoint, `programs.nvf.*` may be defined here
|
||
];
|
||
};
|
||
};
|
||
}
|
||
</code></pre><p>Once the module is properly imported by your host, you will be able to use the
|
||
<code class="literal">programs.nvf</code> module option anywhere in your configuration in order to
|
||
configure <span class="strong"><strong>nvf</strong></span>.</p><pre><code class="programlisting nix{"> programs.nvf = {
|
||
enable = true;
|
||
# your settings need to go into the settings attribute set
|
||
# most settings are documented in the appendix
|
||
settings = {
|
||
vim.viAlias = false;
|
||
vim.vimAlias = true;
|
||
vim.lsp = {
|
||
enable = true;
|
||
};
|
||
};
|
||
};
|
||
}
|
||
</code></pre><div class="note"><h3 class="title">Note</h3><p><span class="strong"><strong>nvf</strong></span> exposes a lot of options, most of which are not referenced in the
|
||
installation sections of the manual. You may find all available options in the
|
||
<a class="link" href="https://notashelf.github.io/nvf/options" target="_top">appendix</a></p></div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div><div class="part"> <div class="titlepage"> <div> <div> <h1 id="ch-configuring" class="title" >Configuring nvf </h1> </div> </div></div><div class="partintro"><p>nvf allows for <span class="emphasis"><em>very</em></span> extensive configuration in Neovim through the Nix module
|
||
interface. The below chapters describe several of the options exposed in nvf for
|
||
your convenience. You might also be interested in the <a class="link" href="index.xhtml#ch-helpful-tips" title="Helpful Tips" >helpful tips section</a> for
|
||
more advanced or unusual configuration options supported by nvf.</p><p>Note that this section does not cover module <span class="emphasis"><em>options</em></span>. For an overview of all
|
||
module options provided by nvf, please visit the <a class="link" href="/nvf/options.html" target="_top">appendix</a></p><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="chapter"> <a href="index.xhtml#ch-custom-package">Custom Neovim Package</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-custom-plugins">Custom Plugins</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-overriding-plugins">Overriding plugins</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-languages">Language Support</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-using-dags">Using DAGs</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-dag-entries">DAG entries in nvf</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#ch-autocmds-augroups">Autocommands and Autogroups</a> </span></dt> </dl></div></div><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="ch-custom-package" class="title" >Custom Neovim Package </h2> </div> </div></div><p>As of v0.5, you may now specify the Neovim package that will be wrapped with
|
||
your configuration. This is done with the <a class="xref" href="options.html#opt-vim.package" ><code class="option">vim.package</code></a> option.</p><pre><code class="programlisting nix">{inputs, pkgs, ...}: {
|
||
# using the neovim-nightly overlay
|
||
vim.package = inputs.neovim-overlay.packages.${pkgs.stdenv.system}.neovim;
|
||
}
|
||
</code></pre><p>The neovim-nightly-overlay always exposes an unwrapped package. If using a
|
||
different source, you are highly recommended to get an “unwrapped” version of
|
||
the neovim package, similar to <code class="literal">neovim-unwrapped</code> in nixpkgs.</p><pre><code class="programlisting nix">{ pkgs, ...}: {
|
||
# using the neovim-nightly overlay
|
||
vim.package = pkgs.neovim-unwrapped;
|
||
}
|
||
</code></pre>
|
||
</div><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="ch-custom-plugins" class="title" >Custom Plugins </h2> </div> </div></div><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#ch-adding-plugins">Adding Plugins</a> </span></dt> </dl></div><p><span class="strong"><strong>nvf</strong></span> exposes a very wide variety of plugins by default, which are consumed by
|
||
module options. This is done for your convenience, and to bundle all necessary
|
||
dependencies into <span class="strong"><strong>nvf</strong></span>’s runtime with full control of versioning, testing and
|
||
dependencies. In the case a plugin you need is <span class="emphasis"><em>not</em></span> available, you may consider
|
||
making a pull request to add the package you’re looking for, or you may add it
|
||
to your configuration locally. The below section describes how new plugins may
|
||
be added to the user’s configuration.</p><div class="section"> <div class="titlepage"> <div> <div> <h2 id="ch-adding-plugins" class="title" style="clear: both">Adding Plugins </h2> </div> </div></div><div class="toc"> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#sec-configuring-plugins">Configuring</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-lazy-method">Lazy Method</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-non-lazy-method">Non-lazy Method</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-legacy-method">Legacy Method</a> </span></dt> </dl></div><p>Per <span class="strong"><strong>nvf</strong></span>’s design choices, there are several ways of adding custom plugins to
|
||
your configuration as you need them. As we aim for extensive configuration, it
|
||
is possible to add custom plugins (from nixpkgs, pinning tools, flake inputs,
|
||
etc.) to your Neovim configuration before they are even implemented in <span class="strong"><strong>nvf</strong></span>
|
||
as a module.</p><p>:::{.info}</p><p>To add a plugin to your runtime, you will need to add it to
|
||
<a class="xref" href="options.html#opt-vim.startPlugins" ><code class="option">vim.startPlugins</code></a> list in your configuration. This is akin to cloning a
|
||
plugin to <code class="literal">~/.config/nvim</code>, but they are only ever placed in the Nix store and
|
||
never exposed to the outside world for purity and full isolation.</p><p>:::</p><p>As you would configure a cloned plugin, you must configure the new plugins that
|
||
you’ve added to <code class="literal">startPlugins.</code> <span class="strong"><strong>nvf</strong></span> provides multiple ways of configuring
|
||
any custom plugins that you might have added to your configuration.</p><div class="section"> <div class="titlepage"> <div> <div> <h3 id="sec-configuring-plugins" class="title" >Configuring </h3> </div> </div></div><p>Just making the plugin to your Neovim configuration available might not always
|
||
be enough., for example, if the plugin requires a setup table. In that case, you
|
||
can write custom Lua configuration using one of</p><div class="itemizedlist"><ul class="itemizedlist compact" style="list-style-type: disc;"><li class="listitem"><p><code class="literal">config.vim.lazy.plugins.*.setupOpts</code></p></li><li class="listitem"><p><code class="literal">config.vim.extraPlugins.*.setup</code></p></li><li class="listitem"><p><code class="literal">config.vim.luaConfigRC</code>.</p></li></ul></div><div class="section"> <div class="titlepage"> <div> <div> <h4 id="ch-vim-lazy-plugins" class="title" >Lazy Plugins </h4> </div> </div></div><p><code class="literal">config.vim.lazy.plugins.*.setupOpts</code> is useful for lazy-loading plugins, and
|
||
uses an extended version of <code class="literal">lz.n's</code> <code class="literal">PluginSpec</code> to expose a familiar
|
||
interface. <code class="literal">setupModule</code> and <code class="literal">setupOpt</code> can be used if the plugin uses a
|
||
<code class="literal">require('module').setup(...)</code> pattern. Otherwise, the <code class="literal">before</code> and <code class="literal">after</code>
|
||
hooks should do what you need.</p><pre><code class="programlisting nix">{
|
||
config.vim.lazy.plugins = {
|
||
aerial.nvim = {
|
||
# ^^^^^^^^^ this name should match the package.pname or package.name
|
||
package = aerial-nvim;
|
||
|
||
setupModule = "aerial";
|
||
setupOpts = {option_name = false;};
|
||
|
||
after = "print('aerial loaded')";
|
||
};
|
||
};
|
||
}
|
||
</code></pre>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h4 id="ch-vim-extra-plugins" class="title" >Standard API </h4> </div> </div></div><p><code class="literal">vim.extraPlugins</code> uses an attribute set, which maps DAG section names to a
|
||
custom type, which has the fields <code class="literal">package</code>, <code class="literal">after</code>, <code class="literal">setup</code>. They allow you to
|
||
set the package of the plugin, the sections its setup code should be after (note
|
||
that the <code class="literal">extraPlugins</code> option has its own DAG scope), and the its setup code
|
||
respectively. For example:</p><pre><code class="programlisting nix">{pkgs, ...}: {
|
||
config.vim.extraPlugins = {
|
||
aerial = {
|
||
package = pkgs.vimPlugins.aerial-nvim;
|
||
setup = "require('aerial').setup {}";
|
||
};
|
||
|
||
harpoon = {
|
||
package = pkgs.vimPlugins.harpoon;
|
||
setup = "require('harpoon').setup {}";
|
||
after = ["aerial"]; # place harpoon configuration after aerial
|
||
};
|
||
};
|
||
}
|
||
</code></pre><div class="section"> <div class="titlepage"> <div> <div> <h5 id="setup-using-luaconfigrc" class="title" >Setup using luaConfigRC </h5> </div> </div></div><p><code class="literal">vim.luaConfigRC</code> also uses an attribute set, but this one is resolved as a DAG
|
||
directly. The attribute names denote the section names, and the values lua code.
|
||
For example:</p><pre><code class="programlisting nix">{
|
||
# This will create a section called "aquarium" in the 'init.lua' with the
|
||
# contents of your custom configuration. By default 'entryAnywhere' is implied
|
||
# in DAGs, so this will be inserted to an arbitrary position. In the case you
|
||
# wish to control the position of this section with more precision, please
|
||
# look into the DAGs section of the manual.
|
||
config.vim.luaConfigRC.aquarium = "vim.cmd('colorscheme aquiarum')";
|
||
}
|
||
</code></pre><div class="note"><h3 class="title">Note</h3><p>One of the <span class="strong"><strong>greatest strengths</strong></span> of <span class="strong"><strong>nvf</strong></span> is the ability to order
|
||
configuration snippets precisely using the <a class="link" href="index.xhtml#ch-using-dags" title="Using DAGs" >DAG system</a>. DAGs
|
||
are a very powerful mechanism that allows specifying positions
|
||
of individual sections of configuration as needed. We provide helper functions
|
||
in the extended library, usually under <code class="literal">inputs.nvf.lib.nvim.dag</code> that you may
|
||
use.</p><p>Please refer to the <a class="link" href="index.xhtml#ch-dag-entries" title="DAG entries in nvf" >DAG section</a> in the nvf manual
|
||
to find out more about the DAG system.</p></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h3 id="sec-lazy-method" class="title" >Lazy Method </h3> </div> </div></div><p>As of version <span class="strong"><strong>0.7</strong></span>, an API is exposed to allow configuring lazy-loaded
|
||
plugins via <code class="literal">lz.n</code> and <code class="literal">lzn-auto-require</code>. Below is a comprehensive example of
|
||
how it may be loaded to lazy-load an arbitrary plugin.</p><pre><code class="programlisting nix">{
|
||
config.vim.lazy.plugins = {
|
||
"aerial.nvim" = {
|
||
package = pkgs.vimPlugins.aerial-nvim;
|
||
setupModule = "aerial";
|
||
setupOpts = {
|
||
option_name = true;
|
||
};
|
||
after = ''
|
||
-- custom lua code to run after plugin is loaded
|
||
print('aerial loaded')
|
||
'';
|
||
|
||
# Explicitly mark plugin as lazy. You don't need this if you define one of
|
||
# the trigger "events" below
|
||
lazy = true;
|
||
|
||
# load on command
|
||
cmd = ["AerialOpen"];
|
||
|
||
# load on event
|
||
event = ["BufEnter"];
|
||
|
||
# load on keymap
|
||
keys = [
|
||
{
|
||
key = "<leader>a";
|
||
action = ":AerialToggle<CR>";
|
||
}
|
||
];
|
||
};
|
||
};
|
||
}
|
||
</code></pre><div class="section"> <div class="titlepage"> <div> <div> <h4 id="sec-lazyfile-event" class="title" >LazyFile event </h4> </div> </div></div><p><span class="strong"><strong>nvf</strong></span> re-implements <code class="literal">LazyFile</code> as a familiar user event to load a plugin when
|
||
a file is opened:</p><pre><code class="programlisting nix">{
|
||
config.vim.lazy.plugins = {
|
||
"aerial.nvim" = {
|
||
package = pkgs.vimPlugins.aerial-nvim;
|
||
event = [{event = "User"; pattern = "LazyFile";}];
|
||
# ...
|
||
};
|
||
};
|
||
}
|
||
</code></pre><p>You can consider the <code class="literal">LazyFile</code> event as an alias to the combination of
|
||
<code class="literal">"BufReadPost"</code>, <code class="literal">"BufNewFile"</code> and <code class="literal">"BufWritePre"</code>, i.e., a list containing all
|
||
three of those events: <code class="literal">["BufReadPost" "BufNewFile" "BufWritePre"]</code></p>
|
||
</div>
|
||
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h3 id="sec-non-lazy-method" class="title" >Non-lazy Method </h3> </div> </div></div><p>As of version <span class="strong"><strong>0.5</strong></span>, we have a more extensive API for configuring plugins that
|
||
should be preferred over the legacy method. This API is available as
|
||
<a class="xref" href="options.html#opt-vim.extraPlugins" ><code class="option">vim.extraPlugins</code></a>. Instead of using DAGs exposed by the library
|
||
<span class="emphasis"><em>directly</em></span>, you may use the extra plugin module as follows:</p><pre><code class="programlisting nix">{pkgs, ...}: {
|
||
config.vim.extraPlugins = {
|
||
aerial = {
|
||
package = pkgs.vimPlugins.aerial-nvim;
|
||
setup = ''
|
||
require('aerial').setup {
|
||
-- some lua configuration here
|
||
}
|
||
'';
|
||
};
|
||
|
||
harpoon = {
|
||
package = pkgs.vimPlugins.harpoon;
|
||
setup = "require('harpoon').setup {}";
|
||
after = ["aerial"];
|
||
};
|
||
};
|
||
}
|
||
</code></pre><p>This provides a level of abstraction over the DAG system for faster iteration.</p>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h3 id="sec-legacy-method" class="title" >Legacy Method </h3> </div> </div></div><p>Prior to version <span class="strong"><strong>0.5</strong></span>, the method of adding new plugins was adding the plugin
|
||
package to <a class="xref" href="options.html#opt-vim.startPlugins" ><code class="option">vim.startPlugins</code></a> and adding its configuration as a DAG under
|
||
one of <code class="literal">vim.configRC</code> or <a class="xref" href="options.html#opt-vim.luaConfigRC" ><code class="option">vim.luaConfigRC</code></a>. While <code class="literal">configRC</code> has been
|
||
deprecated, users who have not yet updated to 0.5 or those who prefer a more
|
||
hands-on approach may choose to use the old method where the load order of the
|
||
plugins is explicitly determined by DAGs without internal abstractions.</p><div class="section"> <div class="titlepage"> <div> <div> <h4 id="sec-adding-new-plugins" class="title" >Adding New Plugins </h4> </div> </div></div><p>To add a plugin not available in <span class="strong"><strong>nvf</strong></span> as a module to your configuration using
|
||
the legacy method, you must add it to <a class="xref" href="options.html#opt-vim.startPlugins" ><code class="option">vim.startPlugins</code></a> in order to make
|
||
it available to Neovim at runtime.</p><pre><code class="programlisting nix">{pkgs, ...}: {
|
||
# Add a Neovim plugin from Nixpkgs to the runtime.
|
||
# This does not need to come explicitly from packages. 'vim.startPlugins'
|
||
# takes a list of *string* (to load internal plugins) or *package* to load
|
||
# a Neovim package from any source.
|
||
vim.startPlugins = [pkgs.vimPlugins.aerial-nvim];
|
||
}
|
||
</code></pre><p>Once the package is available in Neovim’s runtime, you may use the <code class="literal">luaConfigRC</code>
|
||
option to provide configuration as a DAG using the <span class="strong"><strong>nvf</strong></span> extended library in
|
||
order to configure the added plugin,</p><pre><code class="programlisting nix">{inputs, ...}: let
|
||
# This assumes you have an input called 'nvf' in your flake inputs
|
||
# and 'inputs' in your specialArgs. In the case you have passed 'nvf'
|
||
# to specialArgs, the 'inputs' prefix may be omitted.
|
||
inherit (inputs.nvf.lib.nvim.dag) entryAnywhere;
|
||
in {
|
||
# luaConfigRC takes Lua configuration verbatim and inserts it at an arbitrary
|
||
# position by default or if 'entryAnywhere' is used.
|
||
vim.luaConfigRC.aerial-nvim= entryAnywhere ''
|
||
require('aerial').setup {
|
||
-- your configuration here
|
||
}
|
||
'';
|
||
}
|
||
</code></pre>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</div><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="ch-overriding-plugins" class="title" >Overriding plugins </h2> </div> </div></div><p>The <a class="link" href="index.xhtml#sec-additional-plugins" title="Adding Plugins" >additional plugins section</a> details the addition
|
||
of new plugins to nvf under regular circumstances, i.e. while making a pull
|
||
request to the project. You may <span class="emphasis"><em>override</em></span> those plugins in your config
|
||
to change source versions, e.g., to use newer versions of plugins
|
||
that are not yet updated in <span class="strong"><strong>nvf</strong></span>.</p><pre><code class="programlisting nix">vim.pluginOverrides = {
|
||
lazydev-nvim = pkgs.fetchFromGitHub {
|
||
owner = "folke";
|
||
repo = "lazydev.nvim";
|
||
rev = "";
|
||
hash = "";
|
||
};
|
||
# It's also possible to use a flake input
|
||
lazydev-nvim = inputs.lazydev-nvim;
|
||
# Or a local path
|
||
lazydev-nvim = ./lazydev;
|
||
# Or a npins pin... etc
|
||
};
|
||
</code></pre><p>This will override the source for the <code class="literal">neodev.nvim</code> plugin that is used in nvf
|
||
with your own plugin.</p><div class="warning"><h3 class="title">Warning</h3><p>While updating plugin inputs, make sure that any configuration that has been
|
||
deprecated in newer versions is changed in the plugin’s <code class="literal">setupOpts</code>. If you
|
||
depend on a new version, requesting a version bump in the issues section is a
|
||
more reliable option.</p></div>
|
||
</div><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="ch-languages" class="title" >Language Support </h2> </div> </div></div><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#sec-languages-custom-lsp-packages">LSP Custom Packages/Command</a> </span></dt> </dl></div><p>Language specific support means there is a combination of language specific
|
||
plugins, <code class="literal">treesitter</code> support, <code class="literal">nvim-lspconfig</code> language servers, and <code class="literal">null-ls</code>
|
||
integration. This gets you capabilities ranging from autocompletion to
|
||
formatting to diagnostics. The following languages have sections under the
|
||
<code class="literal">vim.languages</code> attribute.</p><div class="itemizedlist"><ul class="itemizedlist compact" style="list-style-type: disc;"><li class="listitem"><p>Rust: <a class="link" href="options.html#opt-vim.languages.rust.enable" >vim.languages.rust.enable</a></p></li><li class="listitem"><p>Nix: <a class="link" href="options.html#opt-vim.languages.nix.enable" >vim.languages.nix.enable</a></p></li><li class="listitem"><p>SQL: <a class="link" href="options.html#opt-vim.languages.sql.enable" >vim.languages.sql.enable</a></p></li><li class="listitem"><p>C/C++: <a class="link" href="options.html#opt-vim.languages.clang.enable" >vim.languages.clang.enable</a></p></li><li class="listitem"><p>Typescript/Javascript: <a class="link" href="options.html#opt-vim.languages.ts.enable" >vim.languages.ts.enable</a></p></li><li class="listitem"><p>Python: <a class="link" href="options.html#opt-vim.languages.python.enable" >vim.languages.python.enable</a>:</p></li><li class="listitem"><p>Zig: <a class="link" href="options.html#opt-vim.languages.zig.enable" >vim.languages.zig.enable</a></p></li><li class="listitem"><p>Markdown: <a class="link" href="options.html#opt-vim.languages.markdown.enable" >vim.languages.markdown.enable</a></p></li><li class="listitem"><p>HTML: <a class="link" href="options.html#opt-vim.languages.html.enable" >vim.languages.html.enable</a></p></li><li class="listitem"><p>Dart: <a class="link" href="options.html#opt-vim.languages.dart.enable" >vim.languages.dart.enable</a></p></li><li class="listitem"><p>Go: <a class="link" href="options.html#opt-vim.languages.go.enable" >vim.languages.go.enable</a></p></li><li class="listitem"><p>Lua: <a class="link" href="options.html#opt-vim.languages.lua.enable" >vim.languages.lua.enable</a></p></li><li class="listitem"><p>PHP: <a class="link" href="options.html#opt-vim.languages.php.enable" >vim.languages.php.enable</a></p></li><li class="listitem"><p>F#: <a class="link" href="options.html#opt-vim.languages.fsharp.enable" >vim.languages.fsharp.enable</a></p></li></ul></div><p>Adding support for more languages, and improving support for existing ones are
|
||
great places where you can contribute with a PR.</p><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-languages-custom-lsp-packages" class="title" style="clear: both">LSP Custom Packages/Command </h2> </div> </div></div><p>One of the strengths of <span class="strong"><strong>nvf</strong></span> is convenient aliases to quickly configure LSP
|
||
servers through the Nix module system. By default the LSP packages for relevant
|
||
language modules will be pulled into the closure. If this is not desirable, you
|
||
may provide <span class="strong"><strong>a custom LSP package</strong></span> (e.g., a Bash script that calls a command)
|
||
or <span class="strong"><strong>a list of strings</strong></span> to be interpreted as the command to launch the language
|
||
server. By using a list of strings, you can use this to skip automatic
|
||
installation of a language server, and instead use the one found in your <code class="literal">$PATH</code>
|
||
during runtime, for example:</p><pre><code class="programlisting nix">vim.languages.java = {
|
||
lsp = {
|
||
enable = true;
|
||
|
||
# This expects 'jdt-language-server' to be in your PATH or in
|
||
# 'vim.extraPackages.' There are no additional checks performed to see
|
||
# if the command provided is valid.
|
||
package = ["jdt-language-server" "-data" "~/.cache/jdtls/workspace"];
|
||
};
|
||
}
|
||
</code></pre>
|
||
</div>
|
||
</div><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="ch-using-dags" class="title" >Using DAGs </h2> </div> </div></div><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#sec-types-dag-entryAnywhere">entryAnywhere</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#ch-types-dag-entryAfter">entryAfter</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#ch-types-dag-entryBefore">entryBefore</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-types-dag-entryBetween">entryBetween</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-types-dag-entriesAnywhere">entriesAnywhere</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-types-dag-entriesAfter">entriesAfter</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-types-dag-entriesBefore">entriesBefore</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-types-dag-entriesBetween">entriesBetween</a> </span></dt> </dl></div><p>We conform to the NixOS options types for the most part, however, a noteworthy
|
||
addition for certain options is the
|
||
<a class="link" href="https://en.wikipedia.org/wiki/Directed_acyclic_graph" target="_top"><span class="strong"><strong>DAG (Directed acyclic graph)</strong></span></a>
|
||
type which is borrowed from home-manager’s extended library. This type is most
|
||
used for topologically sorting strings. The DAG type allows the attribute set
|
||
entries to express dependency relations among themselves. This can, for example,
|
||
be used to control the order of configuration sections in your <code class="literal">luaConfigRC</code>.</p><p>The below section, mostly taken from the
|
||
<a class="link" href="https://raw.githubusercontent.com/nix-community/home-manager/master/docs/manual/writing-modules/types.md" target="_top">home-manager manual</a>
|
||
explains in more detail the overall usage logic of the DAG type.</p><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-types-dag-entryAnywhere" class="title" style="clear: both">entryAnywhere </h2> </div> </div></div><div class="blockquote"><blockquote class="blockquote"><p><code class="literal">lib.dag.entryAnywhere (value: T) : DagEntry<T></code></p></blockquote></div><p>Indicates that <code class="literal">value</code> can be placed anywhere within the DAG. This is also the
|
||
default for plain attribute set entries, that is</p><pre><code class="programlisting nix">foo.bar = {
|
||
a = lib.dag.entryAnywhere 0;
|
||
}
|
||
</code></pre><p>and</p><pre><code class="programlisting nix">foo.bar = {
|
||
a = 0;
|
||
}
|
||
</code></pre><p>are equivalent.</p>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="ch-types-dag-entryAfter" class="title" style="clear: both">entryAfter </h2> </div> </div></div><div class="blockquote"><blockquote class="blockquote"><p><code class="literal">lib.dag.entryAfter (afters: list string) (value: T) : DagEntry<T></code></p></blockquote></div><p>Indicates that <code class="literal">value</code> must be placed <span class="emphasis"><em>after</em></span> each of the attribute names in the
|
||
given list. For example</p><pre><code class="programlisting nix">foo.bar = {
|
||
a = 0;
|
||
b = lib.dag.entryAfter [ "a" ] 1;
|
||
}
|
||
</code></pre><p>would place <code class="literal">b</code> after <code class="literal">a</code> in the graph.</p>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="ch-types-dag-entryBefore" class="title" style="clear: both">entryBefore </h2> </div> </div></div><div class="blockquote"><blockquote class="blockquote"><p><code class="literal">lib.dag.entryBefore (befores: list string) (value: T) : DagEntry<T></code></p></blockquote></div><p>Indicates that <code class="literal">value</code> must be placed <span class="emphasis"><em>before</em></span> each of the attribute names in
|
||
the given list. For example</p><pre><code class="programlisting nix">foo.bar = {
|
||
b = lib.dag.entryBefore [ "a" ] 1;
|
||
a = 0;
|
||
}
|
||
</code></pre><p>would place <code class="literal">b</code> before <code class="literal">a</code> in the graph.</p>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-types-dag-entryBetween" class="title" style="clear: both">entryBetween </h2> </div> </div></div><div class="blockquote"><blockquote class="blockquote"><p><code class="literal">lib.dag.entryBetween (befores: list string) (afters: list string) (value: T) : DagEntry<T></code></p></blockquote></div><p>Indicates that <code class="literal">value</code> must be placed <span class="emphasis"><em>before</em></span> the attribute names in the first
|
||
list and <span class="emphasis"><em>after</em></span> the attribute names in the second list. For example</p><pre><code class="programlisting nix">foo.bar = {
|
||
a = 0;
|
||
c = lib.dag.entryBetween [ "b" ] [ "a" ] 2;
|
||
b = 1;
|
||
}
|
||
</code></pre><p>would place <code class="literal">c</code> before <code class="literal">b</code> and after <code class="literal">a</code> in the graph.</p><p>There are also a set of functions that generate a DAG from a list. These are
|
||
convenient when you just want to have a linear list of DAG entries, without
|
||
having to manually enter the relationship between each entry. Each of these
|
||
functions take a <code class="literal">tag</code> as argument and the DAG entries will be named
|
||
<code class="literal">${tag}-${index}</code>.</p>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-types-dag-entriesAnywhere" class="title" style="clear: both">entriesAnywhere </h2> </div> </div></div><div class="blockquote"><blockquote class="blockquote"><p><code class="literal">lib.dag.entriesAnywhere (tag: string) (values: [T]) : Dag<T></code></p></blockquote></div><p>Creates a DAG with the given values with each entry labeled using the given tag.
|
||
For example</p><pre><code class="programlisting nix">foo.bar = lib.dag.entriesAnywhere "a" [ 0 1 ];
|
||
</code></pre><p>is equivalent to</p><pre><code class="programlisting nix">foo.bar = {
|
||
a-0 = 0;
|
||
a-1 = lib.dag.entryAfter [ "a-0" ] 1;
|
||
}
|
||
</code></pre>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-types-dag-entriesAfter" class="title" style="clear: both">entriesAfter </h2> </div> </div></div><div class="blockquote"><blockquote class="blockquote"><p><code class="literal">lib.dag.entriesAfter (tag: string) (afters: list string) (values: [T]) : Dag<T></code></p></blockquote></div><p>Creates a DAG with the given values with each entry labeled using the given tag.
|
||
The list of values are placed are placed <span class="emphasis"><em>after</em></span> each of the attribute names in
|
||
<code class="literal">afters</code>. For example</p><pre><code class="programlisting nix">foo.bar =
|
||
{ b = 0; } // lib.dag.entriesAfter "a" [ "b" ] [ 1 2 ];
|
||
</code></pre><p>is equivalent to</p><pre><code class="programlisting nix">foo.bar = {
|
||
b = 0;
|
||
a-0 = lib.dag.entryAfter [ "b" ] 1;
|
||
a-1 = lib.dag.entryAfter [ "a-0" ] 2;
|
||
}
|
||
</code></pre>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-types-dag-entriesBefore" class="title" style="clear: both">entriesBefore </h2> </div> </div></div><div class="blockquote"><blockquote class="blockquote"><p><code class="literal">lib.dag.entriesBefore (tag: string) (befores: list string) (values: [T]) : Dag<T></code></p></blockquote></div><p>Creates a DAG with the given values with each entry labeled using the given tag.
|
||
The list of values are placed <span class="emphasis"><em>before</em></span> each of the attribute names in <code class="literal">befores</code>.
|
||
For example</p><pre><code class="programlisting nix">foo.bar =
|
||
{ b = 0; } // lib.dag.entriesBefore "a" [ "b" ] [ 1 2 ];
|
||
</code></pre><p>is equivalent to</p><pre><code class="programlisting nix">foo.bar = {
|
||
b = 0;
|
||
a-0 = 1;
|
||
a-1 = lib.dag.entryBetween [ "b" ] [ "a-0" ] 2;
|
||
}
|
||
</code></pre>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-types-dag-entriesBetween" class="title" style="clear: both">entriesBetween </h2> </div> </div></div><div class="blockquote"><blockquote class="blockquote"><p><code class="literal">lib.dag.entriesBetween (tag: string) (befores: list string) (afters: list string) (values: [T]) : Dag<T></code></p></blockquote></div><p>Creates a DAG with the given values with each entry labeled using the given tag.
|
||
The list of values are placed <span class="emphasis"><em>before</em></span> each of the attribute names in <code class="literal">befores</code>
|
||
and <span class="emphasis"><em>after</em></span> each of the attribute names in <code class="literal">afters</code>. For example</p><pre><code class="programlisting nix">foo.bar =
|
||
{ b = 0; c = 3; } // lib.dag.entriesBetween "a" [ "b" ] [ "c" ] [ 1 2 ];
|
||
</code></pre><p>is equivalent to</p><pre><code class="programlisting nix">foo.bar = {
|
||
b = 0;
|
||
c = 3;
|
||
a-0 = lib.dag.entryAfter [ "c" ] 1;
|
||
a-1 = lib.dag.entryBetween [ "b" ] [ "a-0" ] 2;
|
||
}
|
||
</code></pre>
|
||
</div>
|
||
|
||
</div><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="ch-dag-entries" class="title" >DAG entries in nvf </h2> </div> </div></div><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#ch-vim-luaconfigrc"><code class="literal">vim.luaConfigRC</code> (top-level DAG)</a> </span></dt> </dl></div><p>From the previous chapter, it should be clear that DAGs are useful, because you
|
||
can add code that relies on other code. However, if you don’t know what the
|
||
entries are called, it’s hard to do that, so here is a list of the internal
|
||
entries in nvf:</p><div class="section"> <div class="titlepage"> <div> <div> <h2 id="ch-vim-luaconfigrc" class="title" style="clear: both"><code class="literal">vim.luaConfigRC</code> (top-level DAG) </h2> </div> </div></div><div class="orderedlist"><ol class="orderedlist compact" type="1"><li class="listitem"><p>(<code class="literal">luaConfigPre</code>) - not a part of the actual DAG, instead, it’s simply
|
||
inserted before the rest of the DAG</p></li><li class="listitem"><p><code class="literal">globalsScript</code> - used to set globals defined in <code class="literal">vim.globals</code></p></li><li class="listitem"><p><code class="literal">basic</code> - used to set basic configuration options</p></li><li class="listitem"><p><code class="literal">optionsScript</code> - used to set options defined in <code class="literal">vim.o</code></p></li><li class="listitem"><p><code class="literal">theme</code> (this is simply placed before <code class="literal">pluginConfigs</code> and <code class="literal">lazyConfigs</code>,
|
||
meaning that surrounding entries don’t depend on it) - used to set up the
|
||
theme, which has to be done before other plugins</p></li><li class="listitem"><p><code class="literal">lazyConfigs</code> - <code class="literal">lz.n</code> and <code class="literal">lzn-auto-require</code> configs. If <code class="literal">vim.lazy.enable</code>
|
||
is false, this will contain each plugin’s config instead.</p></li><li class="listitem"><p><code class="literal">pluginConfigs</code> - the result of the nested <code class="literal">vim.pluginRC</code> (internal option,
|
||
see the <a class="link" href="/index.xhtml#ch-custom-plugins" target="_top">Custom Plugins</a> page for adding your
|
||
own plugins) DAG, used to set up internal plugins</p></li><li class="listitem"><p><code class="literal">extraPluginConfigs</code> - the result of <code class="literal">vim.extraPlugins</code>, which is not a
|
||
direct DAG, but is converted to, and resolved as one internally</p></li><li class="listitem"><p><code class="literal">mappings</code> - the result of <code class="literal">vim.maps</code></p></li></ol></div>
|
||
</div>
|
||
|
||
</div><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="ch-autocmds-augroups" class="title" >Autocommands and Autogroups </h2> </div> </div></div><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#sec-vim-augroups">Autogroups (<code class="literal">vim.augroups</code>)</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-vim-autocmds">Autocommands (<code class="literal">vim.autocmds</code>)</a> </span></dt> </dl></div><p>This module allows you to declaratively configure Neovim autocommands and
|
||
autogroups within your Nix configuration.</p><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-vim-augroups" class="title" style="clear: both">Autogroups (<code class="literal">vim.augroups</code>) </h2> </div> </div></div><p>Autogroups (<code class="literal">augroup</code>) organize related autocommands. This allows them to be
|
||
managed collectively, such as clearing them all at once to prevent duplicates.
|
||
Each entry in the list is a submodule with the following options:</p><div class="informaltable"><table class="informaltable" border="1"><colgroup><col align="left" /><col align="left" /><col align="left" /><col align="left" /><col align="left" /></colgroup><thead><tr><th align="left">Option</th><th align="left">Type</th><th align="left">Default</th><th align="left">Description</th><th align="left">Example</th></tr></thead><tbody><tr><td align="left"><code class="literal">enable</code></td><td align="left"><code class="literal">bool</code></td><td align="left"><code class="literal">true</code></td><td align="left">Enables or disables this autogroup definition.</td><td align="left"><code class="literal">true</code></td></tr><tr><td align="left"><code class="literal">name</code></td><td align="left"><code class="literal">str</code></td><td align="left"><span class="emphasis"><em>None</em></span></td><td align="left"><span class="strong"><strong>Required.</strong></span> The unique name for the autogroup.</td><td align="left"><code class="literal">"MyFormatGroup"</code></td></tr><tr><td align="left"><code class="literal">clear</code></td><td align="left"><code class="literal">bool</code></td><td align="left"><code class="literal">true</code></td><td align="left">Clears any existing autocommands within this group before adding new ones defined in <code class="literal">vim.autocmds</code>.</td><td align="left"><code class="literal">true</code></td></tr></tbody></table></div><p><span class="strong"><strong>Example:</strong></span></p><pre><code class="programlisting nix">{
|
||
vim.augroups = [
|
||
{
|
||
name = "MyCustomAuGroup";
|
||
clear = true; # Clear previous autocommands in this group on reload
|
||
}
|
||
{
|
||
name = "Formatting";
|
||
# clear defaults to true
|
||
}
|
||
];
|
||
}
|
||
</code></pre>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-vim-autocmds" class="title" style="clear: both">Autocommands (<code class="literal">vim.autocmds</code>) </h2> </div> </div></div><p>Autocommands (<code class="literal">autocmd</code>) trigger actions based on events happening within Neovim
|
||
(e.g., saving a file, entering a buffer). Each entry in the list is a submodule
|
||
with the following options:</p><div class="informaltable"><table class="informaltable" border="1"><colgroup><col align="left" /><col align="left" /><col align="left" /><col align="left" /><col align="left" /></colgroup><thead><tr><th align="left">Option</th><th align="left">Type</th><th align="left">Default</th><th align="left">Description</th><th align="left">Example</th></tr></thead><tbody><tr><td align="left"><code class="literal">enable</code></td><td align="left"><code class="literal">bool</code></td><td align="left"><code class="literal">true</code></td><td align="left">Enables or disables this autocommand definition.</td><td align="left"><code class="literal">true</code></td></tr><tr><td align="left"><code class="literal">event</code></td><td align="left"><code class="literal">nullOr (listOf str)</code></td><td align="left"><code class="literal">null</code></td><td align="left"><span class="strong"><strong>Required.</strong></span> List of Neovim events that trigger this autocommand (e.g., <code class="literal">BufWritePre</code>, <code class="literal">FileType</code>).</td><td align="left"><code class="literal">[ "BufWritePre" ]</code></td></tr><tr><td align="left"><code class="literal">pattern</code></td><td align="left"><code class="literal">nullOr (listOf str)</code></td><td align="left"><code class="literal">null</code></td><td align="left">List of file patterns (globs) to match against (e.g., <code class="literal">*.py</code>, <code class="literal">*</code>). If <code class="literal">null</code>, matches all files for the given event.</td><td align="left"><code class="literal">[ "*.lua", "*.nix" ]</code></td></tr><tr><td align="left"><code class="literal">callback</code></td><td align="left"><code class="literal">nullOr luaInline</code></td><td align="left"><code class="literal">null</code></td><td align="left">A Lua function to execute when the event triggers. Use <code class="literal">lib.nvim.types.luaInline</code> or <code class="literal">lib.options.literalExpression "mkLuaInline '''...'''"</code>. <span class="strong"><strong>Cannot be used with <code class="literal">command</code>.</strong></span></td><td align="left"><code class="literal">lib.nvim.types.luaInline "function() print('File saved!') end"</code></td></tr><tr><td align="left"><code class="literal">command</code></td><td align="left"><code class="literal">nullOr str</code></td><td align="left"><code class="literal">null</code></td><td align="left">A Vimscript command to execute when the event triggers. <span class="strong"><strong>Cannot be used with <code class="literal">callback</code>.</strong></span></td><td align="left"><code class="literal">"echo 'File saved!'"</code></td></tr><tr><td align="left"><code class="literal">group</code></td><td align="left"><code class="literal">nullOr str</code></td><td align="left"><code class="literal">null</code></td><td align="left">The name of an <code class="literal">augroup</code> (defined in <code class="literal">vim.augroups</code>) to associate this autocommand with.</td><td align="left"><code class="literal">"MyCustomAuGroup"</code></td></tr><tr><td align="left"><code class="literal">desc</code></td><td align="left"><code class="literal">nullOr str</code></td><td align="left"><code class="literal">null</code></td><td align="left">A description for the autocommand (useful for introspection).</td><td align="left"><code class="literal">"Format buffer on save"</code></td></tr><tr><td align="left"><code class="literal">once</code></td><td align="left"><code class="literal">bool</code></td><td align="left"><code class="literal">false</code></td><td align="left">If <code class="literal">true</code>, the autocommand runs only once and then automatically removes itself.</td><td align="left"><code class="literal">false</code></td></tr><tr><td align="left"><code class="literal">nested</code></td><td align="left"><code class="literal">bool</code></td><td align="left"><code class="literal">false</code></td><td align="left">If <code class="literal">true</code>, allows this autocommand to trigger other autocommands.</td><td align="left"><code class="literal">false</code></td></tr></tbody></table></div><div class="warning"><h3 class="title">Warning</h3><p>You cannot define both <code class="literal">callback</code> (for Lua functions) and <code class="literal">command</code> (for
|
||
Vimscript) for the same autocommand. Choose one.</p></div><p><span class="strong"><strong>Examples:</strong></span></p><pre><code class="programlisting nix">{ lib, ... }:
|
||
{
|
||
vim.augroups = [ { name = "UserSetup"; } ];
|
||
|
||
vim.autocmds = [
|
||
# Example 1: Using a Lua callback
|
||
{
|
||
event = [ "BufWritePost" ];
|
||
pattern = [ "*.lua" ];
|
||
group = "UserSetup";
|
||
desc = "Notify after saving Lua file";
|
||
callback = lib.nvim.types.luaInline ''
|
||
function()
|
||
vim.notify("Lua file saved!", vim.log.levels.INFO)
|
||
end
|
||
'';
|
||
}
|
||
|
||
# Example 2: Using a Vim command
|
||
{
|
||
event = [ "FileType" ];
|
||
pattern = [ "markdown" ];
|
||
group = "UserSetup";
|
||
desc = "Set spellcheck for Markdown";
|
||
command = "setlocal spell";
|
||
}
|
||
|
||
# Example 3: Autocommand without a specific group
|
||
{
|
||
event = [ "BufEnter" ];
|
||
pattern = [ "*.log" ];
|
||
desc = "Disable line numbers in log files";
|
||
command = "setlocal nonumber";
|
||
# No 'group' specified
|
||
}
|
||
|
||
# Example 4: Using Lua for callback
|
||
{
|
||
event = [ "BufWinEnter" ];
|
||
pattern = [ "*" ];
|
||
desc = "Simple greeting on entering a buffer window";
|
||
callback = lib.generators.mkLuaInline ''
|
||
function(args)
|
||
print("Entered buffer: " .. args.buf)
|
||
end
|
||
'';
|
||
|
||
# Run only once per session trigger
|
||
once = true;
|
||
}
|
||
];
|
||
}
|
||
</code></pre><p>These definitions are automatically translated into the necessary Lua code to
|
||
configure <code class="literal">vim.api.nvim_create_augroup</code> and <code class="literal">vim.api.nvim_create_autocmd</code> when
|
||
Neovim starts.</p>
|
||
</div>
|
||
|
||
</div>
|
||
</div><div class="part"> <div class="titlepage"> <div> <div> <h1 id="ch-helpful-tips" class="title" >Helpful Tips </h1> </div> </div></div><div class="partintro"><p>This section provides helpful tips that may be considered “unorthodox” or “too
|
||
advanced” for some users. We will cover basic debugging steps, offline
|
||
documentation, configuring <span class="strong"><strong>nvf</strong></span> with pure Lua and using custom plugin sources
|
||
in <span class="strong"><strong>nvf</strong></span> in this section. For general configuration tips, please see previous
|
||
chapters.</p><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="chapter"> <a href="index.xhtml#sec-debugging-nvf">Debugging nvf</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#sec-offline-documentation">Offline Documentation</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#sec-pure-lua-config">Pure Lua Configuration</a> </span></dt><dt> <span class="chapter"> <a href="index.xhtml#sec-plugin-sources">Adding Plugins From Different Sources</a> </span></dt> </dl></div></div><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="sec-debugging-nvf" class="title" >Debugging nvf </h2> </div> </div></div><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#sec-accessing-config">Accessing <code class="literal">neovimConfig</code></a> </span></dt> </dl></div><p>There may be instances where the your Nix configuration evaluates to invalid
|
||
Lua, or times when you will be asked to provide your built Lua configuration for
|
||
easier debugging by nvf maintainers. nvf provides two helpful utilities out of
|
||
the box.</p><p><span class="strong"><strong>nvf-print-config</strong></span> and <span class="strong"><strong>nvf-print-config-path</strong></span> will be bundled with nvf as
|
||
lightweight utilities to help you view or share your built configuration when
|
||
necessary.</p><p>To view your configuration with syntax highlighting, you may use the
|
||
<a class="link" href="https://github.com/sharkdp/bat" target="_top">bat pager</a>.</p><pre><code class="programlisting bash">nvf-print-config | bat --language=lua
|
||
</code></pre><p>Alternatively, <code class="literal">cat</code> or <code class="literal">less</code> may also be used.</p><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-accessing-config" class="title" style="clear: both">Accessing <code class="literal">neovimConfig</code> </h2> </div> </div></div><p>It is also possible to access the configuration for the wrapped package. The
|
||
<span class="emphasis"><em>built</em></span> Neovim package will contain a <code class="literal">neovimConfig</code> attribute in its
|
||
<code class="literal">passthru</code>.</p>
|
||
</div>
|
||
|
||
</div><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="sec-offline-documentation" class="title" >Offline Documentation </h2> </div> </div></div><p>The manpages provided by nvf contains an offline version of the option search
|
||
normally available at <a class="link" href="https://notashelf.github.io/nvf/options.html" target="_top">https://notashelf.github.io/nvf/options.html</a>. You may
|
||
use the <code class="literal">man 5 nvf</code> command to view option documentation from the comfort of
|
||
your terminal.</p><p>Note that this is only available for NixOS and Home-Manager module
|
||
installations.</p>
|
||
</div><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="sec-pure-lua-config" class="title" >Pure Lua Configuration </h2> </div> </div></div><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#sec-pure-nvf-runtime">Pure Runtime Directory</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-impure-absolute-dir">Impure Absolute Directory</a> </span></dt> </dl></div><p>We recognize that you might not always want to configure your setup purely in
|
||
Nix, sometimes doing things in Lua is simply the “superior” option. In such a
|
||
case you might want to configure your Neovim instance using Lua, and nothing but
|
||
Lua. It is also possible to mix Lua and Nix configurations.</p><p>Pure Lua or hybrid Lua/Nix configurations can be achieved in two different ways.
|
||
<span class="emphasis"><em>Purely</em></span>, by modifying Neovim’s runtime directory or <span class="emphasis"><em>impurely</em></span> by placing Lua
|
||
configuration in a directory found in <code class="literal">$HOME</code>. For your convenience, this
|
||
section will document both methods as they can be used.</p><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-pure-nvf-runtime" class="title" style="clear: both">Pure Runtime Directory </h2> </div> </div></div><p>As of 0.6, nvf allows you to modify Neovim’s runtime path to suit your needs.
|
||
One of the ways the new runtime option is to add a configuration <span class="strong"><strong>located
|
||
relative to your <code class="literal">flake.nix</code></strong></span>, which must be version controlled in pure flakes
|
||
manner.</p><pre><code class="programlisting nix">{
|
||
# Let us assume we are in the repository root, i.e., the same directory as the
|
||
# flake.nix. For the sake of the argument, we will assume that the Neovim lua
|
||
# configuration is in a nvim/ directory relative to flake.nix.
|
||
vim = {
|
||
additionalRuntimePaths = [
|
||
# This will be added to Neovim's runtime paths. Conceptually, this behaves
|
||
# very similarly to ~/.config/nvim but you may not place a top-level
|
||
# init.lua to be able to require it directly.
|
||
./nvim
|
||
];
|
||
};
|
||
}
|
||
</code></pre><p>This will add the <code class="literal">nvim</code> directory, or rather, the <span class="emphasis"><em>store path</em></span> that will be
|
||
realised after your flake gets copied to the Nix store, to Neovim’s runtime
|
||
directory. You may now create a <code class="literal">lua/myconfig</code> directory within this nvim
|
||
directory, and call it with <a class="xref" href="options.html#opt-vim.luaConfigRC" ><code class="option">vim.luaConfigRC</code></a>.</p><pre><code class="programlisting nix">{pkgs, ...}: {
|
||
vim = {
|
||
additionalRuntimePaths = [
|
||
# You can list more than one file here.
|
||
./nvim-custom-1
|
||
|
||
# To make sure list items are ordered, use lib.mkBefore or lib.mkAfter
|
||
# Simply placing list items in a given order will **not** ensure that
|
||
# this list will be deterministic.
|
||
./nvim-custom-2
|
||
];
|
||
|
||
startPlugins = [pkgs.vimPlugins.gitsigns];
|
||
|
||
# Neovim supports in-line syntax highlighting for multi-line strings.
|
||
# Simply place the filetype in a /* comment */ before the line.
|
||
luaConfigRC.myconfig = /* lua */ ''
|
||
-- Call the Lua module from ./nvim/lua/myconfig
|
||
require("myconfig")
|
||
|
||
-- Any additional Lua configuration that you might want *after* your own
|
||
-- configuration. For example, a plugin setup call.
|
||
require('gitsigns').setup({})
|
||
'';
|
||
};
|
||
}
|
||
</code></pre>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-impure-absolute-dir" class="title" style="clear: both">Impure Absolute Directory </h2> </div> </div></div><p>As of <a class="link" href="https://github.com/neovim/neovim/pull/22128" target="_top">Neovim 0.9</a>, <code class="varname">$NVIM_APPNAME</code> is a variable expected by Neovim to
|
||
decide on the configuration directory. nvf sets this variable as <code class="literal">"nvf"</code>,
|
||
meaning <code class="literal">~/.config/nvf</code> will be regarded as <span class="emphasis"><em>the</em></span> configuration directory by
|
||
Neovim, similar to how <code class="literal">~/.config/nvim</code> behaves in regular installations. This
|
||
allows some degree of Lua configuration, backed by our low-level wrapper
|
||
<a class="link" href="https://github.com/Gerg-L/mnw" target="_top">mnw</a>. Creating a <code class="literal">lua/</code> directory located in
|
||
<code class="literal">$NVIM_APPNAME</code> (“nvf” by default) and placing your configuration in, e.g.,
|
||
<code class="literal">~/.config/nvf/lua/myconfig</code> will allow you to <code class="literal">require</code> it as a part of the Lua
|
||
module system through nvf’s module system.</p><p>Let’s assume your <code class="literal">~/.config/nvf/lua/myconfig/init.lua</code> consists of the
|
||
following:</p><pre><code class="programlisting lua">-- init.lua
|
||
vim.keymap.set("n", " ", "<Nop>", { silent = true, remap = false })
|
||
vim.g.mapleader = " "
|
||
</code></pre><p>The following Nix configuration via <a class="xref" href="options.html#opt-vim.luaConfigRC" ><code class="option">vim.luaConfigRC</code></a> will allow loading
|
||
this</p><pre><code class="programlisting nix">{
|
||
# The attribute name "myconfig-dir" here is arbitrary. It is required to be
|
||
# a *named* attribute by the DAG system, but the name is entirely up to you.
|
||
vim.luaConfigRC.myconfig-dir = ''
|
||
require("myconfig")
|
||
|
||
-- Any additional Lua
|
||
'';
|
||
}
|
||
</code></pre><p>After you load your custom configuration, you may use an <code class="literal">init.lua</code> located in
|
||
your custom configuration directory to configure Neovim exactly as you would
|
||
without a wrapper like nvf. If you want to place your <code class="literal">require</code> call in a
|
||
specific position (i.e., before or after options you set in nvf) the
|
||
<a class="link" href="https://notashelf.github.io/nvf/index.xhtml#ch-using-dags" target="_top">DAG system</a> will let you place your configuration in a location of your
|
||
choosing.</p>
|
||
</div>
|
||
|
||
</div><div class="chapter"> <div class="titlepage"> <div> <div> <h2 id="sec-plugin-sources" class="title" >Adding Plugins From Different Sources </h2> </div> </div></div><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#ch-plugins-from-nixpkgs">Nixpkgs & Friends</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#ch-plugins-from-source">Building Your Own Plugins</a> </span></dt> </dl></div><p><span class="strong"><strong>nvf</strong></span> attempts to avoid depending on Nixpkgs for Neovim plugins. For the most
|
||
part, this is accomplished by defining each plugin’s source and building them
|
||
from source.</p><p>To define plugin sources, we use <a class="link" href="https://github.com/andir/npins" target="_top">npins</a> and pin each plugin source using
|
||
builtin fetchers. You are not bound by this restriction. In your own
|
||
configuration, any kind of fetcher or plugin source is fine.</p><div class="section"> <div class="titlepage"> <div> <div> <h2 id="ch-plugins-from-nixpkgs" class="title" style="clear: both">Nixpkgs & Friends </h2> </div> </div></div><p><code class="literal">vim.startPlugins</code> and <code class="literal">vim.optPlugins</code> options take either a <span class="strong"><strong>string</strong></span>, in
|
||
which case a plugin from nvf’s internal plugins registry will be used, or a
|
||
<span class="strong"><strong>package</strong></span>. If your plugin does not require any setup, or ordering for it s
|
||
configuration, then it is possible to add it to <code class="literal">vim.startPlugins</code> to load it on
|
||
startup.</p><pre><code class="programlisting nix">{pkgs, ...}: {
|
||
# Aerial does require some setup. In the case you pass a plugin that *does*
|
||
# require manual setup, then you must also call the setup function.
|
||
vim.startPlugins = [pkgs.vimPlugins.aerial-nvim];
|
||
}
|
||
</code></pre><p>This will fetch aerial.nvim from nixpkgs, and add it to Neovim’s runtime path to
|
||
be loaded manually. Although for plugins that require manual setup, you are
|
||
encouraged to use <a class="link" href="https://notashelf.github.io/nvf/options.html#opt-vim.extraPlugins" target="_top"><code class="literal">vim.extraPlugins</code></a>.</p><pre><code class="programlisting nix">{
|
||
vim.extraPlugins = {
|
||
aerial = {
|
||
package = pkgs.vimPlugins.aerial-nvim;
|
||
setup = "require('aerial').setup {}";
|
||
};
|
||
};
|
||
}
|
||
</code></pre><p>More details on the extraPlugins API is documented in the
|
||
<a class="link" href="https://notashelf.github.io/nvf/index.xhtml#ch-custom-plugins" target="_top">custom plugins section</a>.</p>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="ch-plugins-from-source" class="title" style="clear: both">Building Your Own Plugins </h2> </div> </div></div><p>In the case a plugin is not available in Nixpkgs, or the Nixpkgs package is
|
||
outdated (or, more likely, broken) it is possible to build the plugins from
|
||
source using a tool, such as <a class="link" href="https://github.com/andir/npins" target="_top">npins</a>. You may also use your <span class="emphasis"><em>flake inputs</em></span> as
|
||
sources.</p><p>Example using plugin inputs:</p><pre><code class="programlisting nix">{
|
||
# In your flake.nix
|
||
inputs = {
|
||
aerial-nvim = {
|
||
url = "github:stevearc/aerial.nvim"
|
||
flake = false;
|
||
};
|
||
};
|
||
|
||
# Make sure that 'inputs' is properly propagated into Nvf, for example, through
|
||
# specialArgs.
|
||
outputs = { ... };
|
||
}
|
||
</code></pre><p>In the case, you may use the input directly for the plugin’s source attribute in
|
||
<code class="literal">buildVimPlugin</code>.</p><pre><code class="programlisting nix"># Make sure that 'inputs' is properly propagated! It will be missing otherwise
|
||
# and the resulting errors might be too obscure.
|
||
{inputs, ...}: let
|
||
aerial-from-source = pkgs.vimUtils.buildVimPlugin {
|
||
name = "aerial-nvim";
|
||
src = inputs.aerial-nvim;
|
||
};
|
||
in {
|
||
vim.extraPlugins = {
|
||
aerial = {
|
||
package = aerial-from-source;
|
||
setup = "require('aerial').setup {}";
|
||
};
|
||
};
|
||
}
|
||
</code></pre><p>Alternatively, if you do not want to keep track of the source using flake inputs
|
||
or npins, you may call <code class="literal">fetchFromGitHub</code> (or other fetchers) directly. An
|
||
example would look like this.</p><pre><code class="programlisting nix">regexplainer = buildVimPlugin {
|
||
name = "nvim-regexplainer";
|
||
src = fetchFromGitHub {
|
||
owner = "bennypowers";
|
||
repo = "nvim-regexplainer";
|
||
rev = "4250c8f3c1307876384e70eeedde5149249e154f";
|
||
hash = "sha256-15DLbKtOgUPq4DcF71jFYu31faDn52k3P1x47GL3+b0=";
|
||
};
|
||
|
||
# The 'buildVimPlugin' imposes some "require checks" on all plugins build from
|
||
# source. Failing tests, if they are not relevant, can be disabled using the
|
||
# 'nvimSkipModule' argument to the 'buildVimPlugin' function.
|
||
nvimSkipModule = [
|
||
"regexplainer"
|
||
"regexplainer.buffers.init"
|
||
"regexplainer.buffers.popup"
|
||
"regexplainer.buffers.register"
|
||
"regexplainer.buffers.shared"
|
||
"regexplainer.buffers.split"
|
||
"regexplainer.component.descriptions"
|
||
"regexplainer.component.init"
|
||
"regexplainer.renderers.narrative.init"
|
||
"regexplainer.renderers.narrative.narrative"
|
||
"regexplainer.renderers.init"
|
||
"regexplainer.utils.defer"
|
||
"regexplainer.utils.init"
|
||
"regexplainer.utils.treesitter"
|
||
];
|
||
}
|
||
</code></pre>
|
||
</div>
|
||
|
||
</div>
|
||
</div><div class="chapter"> <div class="titlepage"> <div> <div> <h1 id="ch-hacking" class="title" >Hacking nvf </h1> </div> </div></div><div class="toc"> <p><strong>Table of Contents</strong></p> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#sec-contrib-getting-started">Getting Started</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-guidelines">Guidelines</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-testing-changes">Testing Changes</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-keybinds">Keybinds</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-additional-plugins">Adding Plugins</a> </span></dt> </dl></div><p>nvf is designed for the developer as much as it is designed for the end-user. We
|
||
would like for any contributor to be able to propagate their changes, or add new
|
||
features to the project with minimum possible friction. As such, below are the
|
||
guides and guidelines written to streamline the contribution process and to
|
||
ensure that your valuable input integrates into nvf’s development as seamlessly
|
||
as possible without leaving any question marks in your head.</p><p>This section is directed mainly towards those who wish to contribute code into
|
||
the project. If you instead wish to report a bug, or discuss a potential new
|
||
feature implementation (which you do not wish to implement yourself) first look
|
||
among the already <a class="link" href="https://github.com/notashelf/nvf/issues" target="_top">open issues</a> and if no matching issue exists you may open a
|
||
<a class="link" href="https://github.com/notashelf/nvf/issues/new" target="_top">new issue</a> and describe your problem/request.</p><p>While creating an issue, please try to include as much information as you can,
|
||
ideally also include relevant context in which an issue occurs or a feature
|
||
should be implemented. If you wish to make a contribution, but feel stuck -
|
||
please do not be afraid to submit a pull request, we will help you get it in.</p><div class="section"> <div class="titlepage"> <div> <div> <h1 id="sec-contrib-getting-started" class="title" style="clear: both">Getting Started </h1> </div> </div></div><p>You, naturally, would like to start by forking the repository to get started. If
|
||
you are new to Git and GitHub, do have a look at GitHub’s
|
||
<a class="link" href="https://help.github.com/articles/fork-a-repo/" target="_top">Fork a repo guide</a> for
|
||
instructions on how you can do this. Once you have a fork of <span class="strong"><strong>nvf</strong></span>, you should
|
||
create a separate branch based on the most recent <code class="literal">main</code> branch. Give your
|
||
branch a reasonably descriptive name (e.g. <code class="literal">feature/debugger</code> or
|
||
<code class="literal">fix/pesky-bug</code>) and you are ready to work on your changes</p><p>Implement your changes and commit them to the newly created branch and when you
|
||
are happy with the result, and positive that it fulfills our
|
||
<a class="link" href="index.xhtml#sec-guidelines" title="Guidelines" >Contributing Guidelines</a>, push the branch to GitHub and
|
||
<a class="link" href="https://help.github.com/articles/creating-a-pull-request" target="_top">create a pull request</a>.
|
||
The default pull request template available on the <span class="strong"><strong>nvf</strong></span> repository will guide
|
||
you through the rest of the process, and we’ll gently nudge you in the correct
|
||
direction if there are any mistakes.</p>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h1 id="sec-guidelines" class="title" style="clear: both">Guidelines </h1> </div> </div></div><div class="toc"> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#sec-guidelines-documentation">Adding Documentation</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-guidelines-formatting">Formatting Code</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-guidelines-commit-message-style">Formatting Commits</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-guidelines-commit-style">Commit Style</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-guidelines-ex-commit-message">Example Commit</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-guidelines-code-style">Code Style</a> </span></dt> </dl></div><p>If your contribution tightly follows the guidelines, then there is a good chance
|
||
it will be merged without too much trouble. Some of the guidelines will be
|
||
strictly enforced, others will remain as gentle nudges towards the correct
|
||
direction. As we have no automated system enforcing those guidelines, please try
|
||
to double check your changes before making your pull request in order to avoid
|
||
“faulty” code slipping by.</p><p>If you are uncertain how these rules affect the change you would like to make
|
||
then feel free to start a discussion in the
|
||
<a class="link" href="https://github.com/NotAShelf/nvf/discussions" target="_top">discussions tab</a> ideally (but not
|
||
necessarily) before you start developing.</p><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-guidelines-documentation" class="title" style="clear: both">Adding Documentation </h2> </div> </div></div><p>Almost all changes warrant updates to the documentation: at the very least, you
|
||
must update the changelog. Both the manual and module options use
|
||
<a class="link" href="https://github.com/NixOS/nixpkgs/blob/master/doc/README.md#syntax" target="_top">Nixpkgs Flavoured Markdown</a>.</p><p>The HTML version of this manual containing both the module option descriptions
|
||
and the documentation of <span class="strong"><strong>nvf</strong></span> (such as this page) can be generated and opened
|
||
by typing the following in a shell within a clone of the <span class="strong"><strong>nvf</strong></span> Git repository:</p><pre><code class="programlisting console">$ nix build .#docs-html
|
||
$ xdg-open $PWD/result/share/doc/nvf/index.html
|
||
</code></pre>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-guidelines-formatting" class="title" style="clear: both">Formatting Code </h2> </div> </div></div><p>Make sure your code is formatted as described in
|
||
<a class="link" href="index.xhtml#sec-guidelines-code-style" title="Code Style" >code-style section</a>. To maintain consistency
|
||
throughout the project you are encouraged to browse through existing code and
|
||
adopt its style also in new code.</p>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-guidelines-commit-message-style" class="title" style="clear: both">Formatting Commits </h2> </div> </div></div><p>Similar to <a class="link" href="index.xhtml#sec-guidelines-code-style" title="Code Style" >code style guidelines</a> we encourage a
|
||
consistent commit message format as described in
|
||
<a class="link" href="index.xhtml#sec-guidelines-commit-style" title="Commit Style" >commit style guidelines</a>.</p>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-guidelines-commit-style" class="title" style="clear: both">Commit Style </h2> </div> </div></div><p>The commits in your pull request should be reasonably self-contained. Which
|
||
means each and every commit in a pull request should make sense both on its own
|
||
and in general context. That is, a second commit should not resolve an issue
|
||
that is introduced in an earlier commit. In particular, you will be asked to
|
||
amend any commit that introduces syntax errors or similar problems even if they
|
||
are fixed in a later commit.</p><p>The commit messages should follow the
|
||
<a class="link" href="https://chris.beams.io/posts/git-commit/#seven-rule" target="_top">seven rules</a>, except for
|
||
“Capitalize the subject line”. We also ask you to include the affected code
|
||
component or module in the first line. A commit message ideally, but not
|
||
necessarily, follow the given template from home-manager’s own documentation</p><pre><code class="programlisting"> {component}: {description}
|
||
|
||
{long description}
|
||
</code></pre><p>where <code class="literal">{component}</code> refers to the code component (or module) your change
|
||
affects, <code class="literal">{description}</code> is a very brief description of your change, and
|
||
<code class="literal">{long description}</code> is an optional clarifying description. As a rare exception,
|
||
if there is no clear component, or your change affects many components, then the
|
||
<code class="literal">{component}</code> part is optional. See
|
||
<a class="link" href="index.xhtml#sec-guidelines-ex-commit-message" title="Example Commit" >example commit message</a> for a commit message
|
||
that fulfills these requirements.</p>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-guidelines-ex-commit-message" class="title" style="clear: both">Example Commit </h2> </div> </div></div><p>The commit
|
||
<a class="link" href="https://github.com/nix-community/home-manager/commit/69f8e47e9e74c8d3d060ca22e18246b7f7d988ef" target="_top">69f8e47e9e74c8d3d060ca22e18246b7f7d988ef</a>
|
||
in home-manager contains the following commit message.</p><pre><code class="programlisting">starship: allow running in Emacs if vterm is used
|
||
|
||
The vterm buffer is backed by libvterm and can handle Starship prompts
|
||
without issues.
|
||
</code></pre><p>Similarly, if you are contributing to <span class="strong"><strong>nvf</strong></span>, you would include the scope of
|
||
the commit followed by the description:</p><pre><code class="programlisting">languages/ruby: init module
|
||
|
||
Adds a language module for Ruby, adds appropriate formatters and Treesitter grammars
|
||
</code></pre><p>Long description can be omitted if the change is too simple to warrant it. A
|
||
minor fix in spelling or a formatting change does not warrant long description,
|
||
however, a module addition or removal does as you would like to provide the
|
||
relevant context, i.e. the reasoning behind it, for your commit.</p><p>Finally, when adding a new module, say <code class="literal">modules/foo.nix</code>, we use the fixed
|
||
commit format <code class="literal">foo: add module</code>. You can, of course, still include a long
|
||
description if you wish.</p><p>In case of nested modules, i.e <code class="literal">modules/languages/java.nix</code> you are recommended
|
||
to contain the parent as well - for example <code class="literal">languages/java: some major change</code>.</p>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-guidelines-code-style" class="title" style="clear: both">Code Style </h2> </div> </div></div><div class="section"> <div class="titlepage"> <div> <div> <h3 id="sec-code-style-treewide" class="title" >Treewide </h3> </div> </div></div><p>Keep lines at a reasonable width, ideally 80 characters or less. This also
|
||
applies to string literals and module descriptions and documentation.</p>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h3 id="sec-code-style-nix" class="title" >Nix </h3> </div> </div></div><p><span class="strong"><strong>nvf</strong></span> is formatted by the <a class="link" href="https://github.com/kamadorueda/alejandra" target="_top">alejandra</a> tool and the formatting is checked in
|
||
the pull request and push workflows. Run the <code class="literal">nix fmt</code> command inside the
|
||
project repository before submitting your pull request.</p><p>While Alejandra is mostly opinionated on how code looks after formatting,
|
||
certain changes are done at the user’s discretion based on how the original code
|
||
was structured.</p><p>Please use one line code for attribute sets that contain only one subset. For
|
||
example:</p><pre><code class="programlisting nix"># parent modules should always be unfolded
|
||
# which means module = { value = ... } instead of module.value = { ... }
|
||
module = {
|
||
value = mkEnableOption "some description" // { default = true; }; # merges can be done inline where possible
|
||
|
||
# same as parent modules, unfold submodules
|
||
subModule = {
|
||
# this is an option that contains more than one nested value
|
||
# Note: try to be careful about the ordering of `mkOption` arguments.
|
||
# General rule of thumb is to order from least to most likely to change.
|
||
# This is, for most cases, type < default < description.
|
||
# Example, if present, would be between default and description
|
||
someOtherValue = mkOption {
|
||
type = lib.types.bool;
|
||
default = true;
|
||
description = "Some other description";
|
||
};
|
||
};
|
||
}
|
||
</code></pre><p>If you move a line down after the merge operator, Alejandra will automatically
|
||
unfold the whole merged attrset for you, which we <span class="strong"><strong>do not</strong></span> want.</p><pre><code class="programlisting nix">module = {
|
||
key = mkEnableOption "some description" // {
|
||
default = true; # we want this to be inline
|
||
}; # ...
|
||
}
|
||
</code></pre><p>For lists, it is mostly up to your own discretion how you want to format them,
|
||
but please try to unfold lists if they contain multiple items and especially if
|
||
they are to include comments.</p><pre><code class="programlisting nix"># this is ok
|
||
acceptableList = [
|
||
item1 # comment
|
||
item2
|
||
item3 # some other comment
|
||
item4
|
||
];
|
||
|
||
# this is not ok
|
||
listToBeAvoided = [item1 item2 /* comment */ item3 item4];
|
||
|
||
# this is ok
|
||
acceptableList = [item1 item2];
|
||
|
||
# this is also ok if the list is expected to contain more elements
|
||
acceptableList= [
|
||
item1
|
||
item2
|
||
# more items if needed...
|
||
];
|
||
</code></pre>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h1 id="sec-testing-changes" class="title" style="clear: both">Testing Changes </h1> </div> </div></div><p>Once you have made your changes, you will need to test them thoroughly. If it is
|
||
a module, add your module option to <code class="literal">configuration.nix</code> (located in the root of
|
||
this project) inside <code class="literal">neovimConfiguration</code>. Enable it, and then run the maximal
|
||
configuration with <code class="literal">nix run .#maximal -Lv</code> to check for build errors. If neovim
|
||
opens in the current directory without any error messages (you can check the
|
||
output of <code class="literal">:messages</code> inside neovim to see if there are any errors), then your
|
||
changes are good to go. Open your pull request, and it will be reviewed as soon
|
||
as possible.</p><p>If it is not a new module, but a change to an existing one, then make sure the
|
||
module you have changed is enabled in the maximal configuration by editing
|
||
<code class="literal">configuration.nix</code>, and then run it with <code class="literal">nix run .#maximal -Lv</code>. Same
|
||
procedure as adding a new module will apply here.</p>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h1 id="sec-keybinds" class="title" style="clear: both">Keybinds </h1> </div> </div></div><div class="toc"> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#sec-custom-key-mappings">Custom Key Mappings Support for a Plugin</a> </span></dt> </dl></div><p>As of 0.4, there exists an API for writing your own keybinds and a couple of
|
||
useful utility functions are available in the
|
||
<a class="link" href="https://github.com/NotAShelf/nvf/tree/main/lib" target="_top">extended standard library</a>. The
|
||
following section contains a general overview to how you may utilize said
|
||
functions.</p><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-custom-key-mappings" class="title" style="clear: both">Custom Key Mappings Support for a Plugin </h2> </div> </div></div><p>To set a mapping, you should define it in <code class="literal">vim.keymaps</code>.</p><p>An example, simple keybinding, can look like this:</p><pre><code class="programlisting nix">{
|
||
vim.keymaps = [
|
||
{
|
||
key = "<leader>wq";
|
||
mode = ["n"];
|
||
action = ":wq<CR>";
|
||
silent = true;
|
||
desc = "Save file and quit";
|
||
}
|
||
];
|
||
}
|
||
</code></pre><p>There are many settings available in the options. Please refer to the
|
||
<a class="link" href="https://notashelf.github.io/nvf/options.html#opt-vim.keymaps" target="_top">documentation</a> to
|
||
see a list of them.</p><p><span class="strong"><strong>nvf</strong></span> provides a helper function, so that you don’t have to write the
|
||
mapping attribute sets every time:</p><div class="itemizedlist"><ul class="itemizedlist compact" style="list-style-type: disc;"><li class="listitem"><p><code class="literal">mkKeymap</code>, which mimics neovim’s <code class="literal">vim.keymap.set</code> function</p></li></ul></div><p>You can read the source code of some modules to see them in action, but the
|
||
usage should look something like this:</p><pre><code class="programlisting nix"># plugindefinition.nix
|
||
{lib, ...}: let
|
||
inherit (lib.options) mkEnableOption;
|
||
inherit (lib.nvim.binds) mkMappingOption;
|
||
in {
|
||
options.vim.plugin = {
|
||
enable = mkEnableOption "Enable plugin";
|
||
|
||
# Mappings should always be inside an attrset called mappings
|
||
mappings = {
|
||
workspaceDiagnostics = mkMappingOption "Workspace diagnostics [trouble]" "<leader>lwd";
|
||
documentDiagnostics = mkMappingOption "Document diagnostics [trouble]" "<leader>ld";
|
||
lspReferences = mkMappingOption "LSP References [trouble]" "<leader>lr";
|
||
quickfix = mkMappingOption "QuickFix [trouble]" "<leader>xq";
|
||
locList = mkMappingOption "LOCList [trouble]" "<leader>xl";
|
||
symbols = mkMappingOption "Symbols [trouble]" "<leader>xs";
|
||
};
|
||
}
|
||
</code></pre><pre><code class="programlisting nix"># config.nix
|
||
{
|
||
config,
|
||
lib,
|
||
options,
|
||
...
|
||
}: let
|
||
inherit (lib.modules) mkIf;
|
||
inherit (lib.nvim.binds) mkKeymap;
|
||
|
||
cfg = config.vim.plugin;
|
||
|
||
keys = cfg.mappings;
|
||
inherit (options.vim.lsp.trouble) mappings;
|
||
in {
|
||
config = mkIf cfg.enable {
|
||
vim.keymaps = [
|
||
(mkKeymap "n" keys.workspaceDiagnostics "<cmd>Trouble toggle diagnostics<CR>" {desc = mappings.workspaceDiagnostics.description;})
|
||
(mkKeymap "n" keys.documentDiagnostics "<cmd>Trouble toggle diagnostics filter.buf=0<CR>" {desc = mappings.documentDiagnostics.description;})
|
||
(mkKeymap "n" keys.lspReferences "<cmd>Trouble toggle lsp_references<CR>" {desc = mappings.lspReferences.description;})
|
||
(mkKeymap "n" keys.quickfix "<cmd>Trouble toggle quickfix<CR>" {desc = mappings.quickfix.description;})
|
||
(mkKeymap "n" keys.locList "<cmd>Trouble toggle loclist<CR>" {desc = mappings.locList.description;})
|
||
(mkKeymap "n" keys.symbols "<cmd>Trouble toggle symbols<CR>" {desc = mappings.symbols.description;})
|
||
];
|
||
};
|
||
}
|
||
</code></pre><div class="note"><h3 class="title">Note</h3><p>If you have come across a plugin that has an API that doesn’t seem to easily
|
||
allow custom keybindings, don’t be scared to implement a draft PR. We’ll help
|
||
you get it done.</p></div>
|
||
</div>
|
||
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h1 id="sec-additional-plugins" class="title" style="clear: both">Adding Plugins </h1> </div> </div></div><div class="toc"> <dl class="toc"> <dt> <span class="section"> <a href="index.xhtml#sec-modular-setup-options">Modular setup options</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-details-of-toluaobject">Details of toLuaObject</a> </span></dt><dt> <span class="section"> <a href="index.xhtml#sec-lazy-plugins">Lazy plugins</a> </span></dt> </dl></div><p>To add a new Neovim plugin, use <code class="literal">npins</code></p><p>Use:</p><p><code class="literal">nix-shell -p npins</code> or <code class="literal">nix shell nixpkgs#npins</code></p><p>Then run:</p><p><code class="literal">npins add --name <plugin name> github <owner> <repo> -b <branch></code></p><p>Be sure to replace any non-alphanumeric characters with <code class="literal">-</code> for <code class="literal">--name</code></p><p>For example</p><p><code class="literal">npins add --name lazydev-nvim github folke lazydev.nvim -b main</code></p><p>You can now reference this plugin as a <span class="strong"><strong>string</strong></span>.</p><pre><code class="programlisting nix">config.vim.startPlugins = ["lazydev-nvim"];
|
||
</code></pre><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-modular-setup-options" class="title" style="clear: both">Modular setup options </h2> </div> </div></div><p>Most plugins is initialized with a call to <code class="literal">require('plugin').setup({...})</code>.</p><p>We use a special function that lets you easily add support for such setup
|
||
options in a modular way: <code class="literal">mkPluginSetupOption</code>.</p><p>Once you have added the source of the plugin as shown above, you can define the
|
||
setup options like this:</p><pre><code class="programlisting nix"># in modules/.../your-plugin/your-plugin.nix
|
||
|
||
{lib, ...}:
|
||
let
|
||
inherit (lib.types) bool int;
|
||
inherit (lib.nvim.types) mkPluginSetupOption;
|
||
in {
|
||
options.vim.your-plugin = {
|
||
setupOpts = mkPluginSetupOption "plugin name" {
|
||
enable_feature_a = mkOption {
|
||
type = bool;
|
||
default = false;
|
||
# ...
|
||
};
|
||
|
||
number_option = mkOption {
|
||
type = int;
|
||
default = 3;
|
||
# ...
|
||
};
|
||
};
|
||
};
|
||
}
|
||
</code></pre><pre><code class="programlisting nix"># in modules/.../your-plugin/config.nix
|
||
{lib, config, ...}:
|
||
let
|
||
cfg = config.vim.your-plugin;
|
||
in {
|
||
vim.luaConfigRC = lib.nvim.dag.entryAnywhere ''
|
||
require('plugin-name').setup(${lib.nvim.lua.toLuaObject cfg.setupOpts})
|
||
'';
|
||
}
|
||
</code></pre><p>This above config will result in this lua script:</p><pre><code class="programlisting lua">require('plugin-name').setup({
|
||
enable_feature_a = false,
|
||
number_option = 3,
|
||
})
|
||
</code></pre><p>Now users can set any of the pre-defined option field, and can also add their
|
||
own fields!</p><pre><code class="programlisting nix"># in user's config
|
||
{
|
||
vim.your-plugin.setupOpts = {
|
||
enable_feature_a = true;
|
||
number_option = 4;
|
||
another_field = "hello";
|
||
size = { # nested fields work as well
|
||
top = 10;
|
||
};
|
||
};
|
||
}
|
||
</code></pre>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-details-of-toluaobject" class="title" style="clear: both">Details of toLuaObject </h2> </div> </div></div><p>As you’ve seen above, <code class="literal">toLuaObject</code> is used to convert our nix attrSet
|
||
<code class="literal">cfg.setupOpts</code>, into a lua table. Here are some rules of the conversion:</p><div class="orderedlist"><ol class="orderedlist compact" type="1"><li class="listitem"><p>nix <code class="literal">null</code> converts to lua <code class="literal">nil</code></p></li><li class="listitem"><p>number and strings convert to their lua counterparts</p></li><li class="listitem"><p>nix attrSet/list convert into lua tables</p></li><li class="listitem"><p>you can write raw lua code using <code class="literal">lib.generators.mkLuaInline</code>. This function
|
||
is part of nixpkgs.</p></li></ol></div><p>Example:</p><pre><code class="programlisting nix">vim.your-plugin.setupOpts = {
|
||
on_init = lib.generators.mkLuaInline ''
|
||
function()
|
||
print('we can write lua!')
|
||
end
|
||
'';
|
||
}
|
||
</code></pre>
|
||
</div><div class="section"> <div class="titlepage"> <div> <div> <h2 id="sec-lazy-plugins" class="title" style="clear: both">Lazy plugins </h2> </div> </div></div><p>If the plugin can be lazy-loaded, <code class="literal">vim.lazy.plugins</code> should be used to add it.
|
||
Lazy plugins are managed by <code class="literal">lz.n</code>.</p><pre><code class="programlisting nix"># in modules/.../your-plugin/config.nix
|
||
{lib, config, ...}:
|
||
let
|
||
cfg = config.vim.your-plugin;
|
||
in {
|
||
vim.lazy.plugins.your-plugin = {
|
||
# instead of vim.startPlugins, use this:
|
||
package = "your-plugin";
|
||
|
||
# if your plugin uses the `require('your-plugin').setup{...}` pattern
|
||
setupModule = "your-plugin";
|
||
inherit (cfg) setupOpts;
|
||
|
||
# events that trigger this plugin to be loaded
|
||
event = ["DirChanged"];
|
||
cmd = ["YourPluginCommand"];
|
||
|
||
# keymaps
|
||
keys = [
|
||
# we'll cover this in detail in the keymaps section
|
||
{
|
||
key = "<leader>d";
|
||
mode = "n";
|
||
action = ":YourPluginCommand";
|
||
}
|
||
];
|
||
};
|
||
;
|
||
}
|
||
</code></pre><p>This results in the following lua code:</p><pre><code class="programlisting lua">require('lz.n').load({
|
||
{
|
||
"name-of-your-plugin",
|
||
after = function()
|
||
require('your-plugin').setup({--[[ your setupOpts ]]})
|
||
end,
|
||
|
||
event = {"DirChanged"},
|
||
cmd = {"YourPluginCommand"},
|
||
keys = {
|
||
{"<leader>d", ":YourPluginCommand", mode = {"n"}},
|
||
},
|
||
}
|
||
})
|
||
</code></pre><p>A full list of options can be found
|
||
[here](https://notashelf.github.io/nvf/options.html#opt-vim.lazy.plugins</p>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="navfooter">
|
||
<hr />
|
||
<table width="100%" summary="Navigation footer">
|
||
<tr>
|
||
<td width="40%" align="left"> </td>
|
||
<td width="20%" align="center"> </td>
|
||
<td width="40%" align="right"> <a accesskey="n" href="quirks.html">Next</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td width="40%" align="left" valign="top"> </td>
|
||
<td width="20%" align="center"> </td>
|
||
<td width="40%" align="right" valign="top"> Appendix A. Known Issues and Quirks</td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
</body>
|
||
</html> |