Compare commits

..

No commits in common. "0115325759fca0d5991d06cd7ba3b6f141eca36e" and "da1fed218b2dda294190e004da4d5bec7d43ec34" have entirely different histories.

11 changed files with 110 additions and 273 deletions

View file

@ -43,7 +43,7 @@ isMaximal: {
# This section does not include a comprehensive list of available language modules.
# To list all available language module options, please visit the nvf manual.
languages = {
enableFormat = true;
enableFormat = true; #
enableTreesitter = true;
enableExtraDiagnostics = true;
@ -194,7 +194,7 @@ isMaximal: {
leetcode-nvim.enable = isMaximal;
multicursors.enable = isMaximal;
smart-splits.enable = isMaximal;
undotree.enable = isMaximal;
motion = {
hop.enable = true;
leap.enable = true;

View file

@ -1,92 +1,25 @@
# Adding Plugins {#sec-additional-plugins}
There are two methods for adding new Neovim plugins to **nvf**. npins is the
faster option that should be preferred if the plugin consists of pure Lua or
Vimscript code. In which case there is no building required, and we can easily
handle the copying of plugin files. Alternative method, which is required when
plugins try to build their own libraries (e.g., in Rust or C) that need to be
built with Nix to function correctly.
To add a new Neovim plugin, use `npins`
## With npins {#sec-npins-for-plugins}
Use:
npins is the standard method of adding new plugins to **nvf**. You simply need
the repository URL for the plugin, and can add it as a source to be built
automatically with one command. To add a new Neovim plugin, use `npins`. For
example:
```bash
nix-shell -p npins # or nix shell nixpkgs#npins if using flakes
```
`nix-shell -p npins` or `nix shell nixpkgs#npins`
Then run:
```bash
npins add --name <plugin name> github <owner> <repo> -b <branch>
```
`npins add --name <plugin name> github <owner> <repo> -b <branch>`
::: {.note}
Be sure to replace any non-alphanumeric characters with `-` for `--name`
Be sure to replace any non-alphanumeric characters with `-` for `--name`. For
example
For example
```bash
npins add --name lazydev-nvim github folke lazydev.nvim -b main
```
`npins add --name lazydev-nvim github folke lazydev.nvim -b main`
:::
Once the `npins` command is done, you can start referencing the plugin as a
**string**.
You can now reference this plugin as a **string**.
```nix
{
config.vim.startPlugins = ["lazydev-nvim"];
}
```
## Packaging Complex Plugins {#sec-pkgs-for-plugins}
[blink.cmp]: https://github.com/Saghen/blink.cmp
Some plugins require additional packages to be built and substituted to function
correctly. For example [blink.cmp] requires its own fuzzy matcher library, built
with Rust, to be installed or else defaults to a much slower Lua implementation.
In the Blink documentation, you are advised to build with `cargo` but that is
not ideal since we are leveraging the power of Nix. In this case the ideal
solution is to write a derivation for the plugin.
We use `buildRustPackage` to build the library from the repository root, and
copy everything in the `postInstall` phase.
```nix
postInstall = ''
cp -r {lua,plugin} "$out"
mkdir -p "$out/doc"
cp 'doc/'*'.txt' "$out/doc/"
mkdir -p "$out/target"
mv "$out/lib" "$out/target/release"
'';
```
In a similar fashion, you may utilize `stdenv.mkDerivation` and other Nixpkgs
builders to build your library from source, and copy the relevant files and Lua
plugin files in the `postInstall` phase. Do note, however, that you still need
to fetch the plugin sources somehow. npins is, once again, the recommended
option to fetch the plugin sources. Refer to the previous section on how to use
npins to add a new plugin.
Plugins built from source must go into the `flake/pkgs/by-name` overlay. It will
automatically create flake outputs for individual packages. Lastly, you must add
your package to the plugin builder (`pluginBuilders`) function manually in
`modules/wrapper/build/config.nix`. Once done, you may refer to your plugin as a
**string**.
```nix
{
config.vim.startPlugins = ["blink-cmp"];
}
config.vim.startPlugins = ["lazydev-nvim"];
```
## Modular setup options {#sec-modular-setup-options}
@ -137,7 +70,7 @@ in {
}
```
This above config will result in this Lua script:
This above config will result in this lua script:
```lua
require('plugin-name').setup({
@ -168,41 +101,23 @@ own fields!
As you've seen above, `toLuaObject` is used to convert our nix attrSet
`cfg.setupOpts`, into a lua table. Here are some rules of the conversion:
1. Nix `null` converts to lua `nil`
2. Number and strings convert to their lua counterparts
3. Nix attribute sets (`{}`) and lists (`[]`) convert into Lua dictionaries and
tables respectively. Here is an example of Nix -> Lua conversion.
- `{foo = "bar"}` -> `{["foo"] = "bar"}`
- `["foo" "bar"]` -> `{"foo", "bar"}`
4. You can write raw Lua code using `lib.generators.mkLuaInline`. This function
is part of nixpkgs, and is accessible without relying on **nvf**'s extended
library.
- `mkLuaInline "function add(a, b) return a + b end"` will yield the
following result:
1. nix `null` converts to lua `nil`
2. number and strings convert to their lua counterparts
3. nix attrSet/list convert into lua tables
4. you can write raw lua code using `lib.generators.mkLuaInline`. This function
is part of nixpkgs.
```nix
{
_type = "lua-inline";
expr = "function add(a, b) return a + b end";
}
```
Example:
The above expression will be interpreted as a Lua expression in the final
config. Without the `mkLuaInline` function, you will only receive a string
literal. You can use it to feed plugin configuration tables Lua functions
that return specific values as expected by the plugins.
```nix
{
vim.your-plugin.setupOpts = {
on_init = lib.generators.mkLuaInline ''
function()
print('we can write lua!')
end
'';
};
}
```
```nix
vim.your-plugin.setupOpts = {
on_init = lib.generators.mkLuaInline ''
function()
print('we can write lua!')
end
'';
}
```
## Lazy plugins {#sec-lazy-plugins}
@ -211,24 +126,25 @@ Lazy plugins are managed by `lz.n`.
```nix
# in modules/.../your-plugin/config.nix
{config, ...}: let
{lib, config, ...}:
let
cfg = config.vim.your-plugin;
in {
vim.lazy.plugins.your-plugin = {
# Instead of vim.startPlugins, use this:
# instead of vim.startPlugins, use this:
package = "your-plugin";
# ıf your plugin uses the `require('your-plugin').setup{...}` pattern
# if your plugin uses the `require('your-plugin').setup{...}` pattern
setupModule = "your-plugin";
inherit (cfg) setupOpts;
# Events that trigger this plugin to be loaded
# events that trigger this plugin to be loaded
event = ["DirChanged"];
cmd = ["YourPluginCommand"];
# Plugin Keymaps
# keymaps
keys = [
# We'll cover this in detail in the 'keybinds' section
# we'll cover this in detail in the keymaps section
{
key = "<leader>d";
mode = "n";
@ -236,6 +152,7 @@ in {
}
];
};
;
}
```
@ -246,9 +163,7 @@ require('lz.n').load({
{
"name-of-your-plugin",
after = function()
require('your-plugin').setup({
--[[ your setupOpts ]]--
})
require('your-plugin').setup({--[[ your setupOpts ]]})
end,
event = {"DirChanged"},
@ -260,7 +175,5 @@ require('lz.n').load({
})
```
[`vim.lazy.plugins` spec]: https://notashelf.github.io/nvf/options.html#opt-vim.lazy.plugins
A full list of options can be found in the [`vim.lazy.plugins` spec] on the
rendered manual.
A full list of options can be found
[here](https://notashelf.github.io/nvf/options.html#opt-vim.lazy.plugins

View file

@ -37,7 +37,6 @@
[snacks.nvim]: https://github.com/folke/snacks.nvim
[oil.nvim]: https://github.com/stevearc/oil.nvim
[hunk.nvim]: https://github.com/julienvincent/hunk.nvim
[undotree]: https://github.com/mbbill/undotree
- Add [typst-preview.nvim] under
`languages.typst.extensions.typst-preview-nvim`.

View file

@ -1,5 +1,4 @@
{
pins,
openssl,
pkg-config,
rustPlatform,
@ -7,17 +6,11 @@
vimUtils,
makeWrapper,
pkgs,
version,
src,
...
}: let
# From npins
pin = pins.avante-nvim;
version = pin.branch;
src = pkgs.fetchFromGitHub {
inherit (pin.repository) owner repo;
rev = pin.revision;
sha256 = pin.hash;
};
inherit version src;
avante-nvim-lib = rustPlatform.buildRustPackage {
pname = "avante-nvim-lib";
inherit version src;
@ -55,9 +48,10 @@ in
ext = stdenv.hostPlatform.extensions.sharedLibrary;
in ''
mkdir -p $out/build
for lib in avante_repo_map avante_templates avante_tokenizers avante_html2md; do
ln -s ${avante-nvim-lib}/lib/lib$lib${ext} $out/build/$$lib${ext}
done
ln -s ${avante-nvim-lib}/lib/libavante_repo_map${ext} $out/build/avante_repo_map${ext}
ln -s ${avante-nvim-lib}/lib/libavante_templates${ext} $out/build/avante_templates${ext}
ln -s ${avante-nvim-lib}/lib/libavante_tokenizers${ext} $out/build/avante_tokenizers${ext}
ln -s ${avante-nvim-lib}/lib/libavante_html2md${ext} $out/build/avante_html2md${ext}
'';
nvimSkipModules = [

View file

@ -9,114 +9,84 @@
lib,
...
}: let
inherit (lib.customisation) makeScope;
inherit (lib.attrsets) isDerivation isAttrs concatMapAttrs;
inherit (lib.strings) concatStringsSep;
inherit (lib.filesystem) packagesFromDirectoryRecursive;
# Entrypoint for nvf documentation and relevant packages.
docs = import ../docs {inherit pkgs inputs lib;};
# Helper function for creating demo configurations for nvf
# TODO: make this more generic.
buildPkg = maximal:
(args.config.flake.lib.nvim.neovimConfiguration {
inherit pkgs;
modules = [(import ../configuration.nix maximal)];
}).neovim;
# This constructs a by-name overlay similar to the one found in Nixpkgs.
# The goal is to automatically discover and packages found in pkgs/by-name
# as long as they have a 'package.nix' in the package directory. We also
# pass 'inputs' and 'pins' to all packages in the 'callPackage' scope, therefore
# they are always available in the relevant 'package.nix' files.
# ---
# The logic is borrowed from drupol/pkgs-by-name-for-flake-parts, available
# under the MIT license.
flattenPkgs = separator: path: value:
if isDerivation value
then {
${concatStringsSep separator path} = value;
}
else if isAttrs value
then concatMapAttrs (name: flattenPkgs separator (path ++ [name])) value
else
# Ignore the functions which makeScope returns
{};
inputsScope = makeScope pkgs.newScope (_: {
inherit inputs;
inherit (self) pins;
});
scopeFromDirectory = directory:
packagesFromDirectoryRecursive {
inherit directory;
inherit (inputsScope) newScope callPackage;
};
legacyPackages = scopeFromDirectory ./pkgs/by-name;
in {
packages =
(flattenPkgs "/" [] legacyPackages)
// {
inherit (docs.manual) htmlOpenTool;
packages = {
blink-cmp = pkgs.callPackage ./blink {};
avante-nvim = let
pin = self.pins.avante-nvim;
in
pkgs.callPackage ./avante-nvim {
version = pin.branch;
src = pkgs.fetchFromGitHub {
inherit (pin.repository) owner repo;
rev = pin.revision;
sha256 = pin.hash;
};
pins = self.pins;
};
# Documentation
docs = docs.manual.html;
docs-html = docs.manual.html;
docs-manpages = docs.manPages;
docs-json = docs.options.json;
docs-linkcheck = let
site = config.packages.docs;
in
pkgs.testers.lycheeLinkCheck {
inherit site;
inherit (docs.manual) htmlOpenTool;
# Documentation
docs = docs.manual.html;
docs-html = docs.manual.html;
docs-manpages = docs.manPages;
docs-json = docs.options.json;
docs-linkcheck = let
site = config.packages.docs;
in
pkgs.testers.lycheeLinkCheck {
inherit site;
remap = {
"https://notashelf.github.io/nvf/" = site;
};
extraConfig = {
exclude = [];
include_mail = true;
include_verbatim = true;
};
remap = {
"https://notashelf.github.io/nvf/" = site;
};
# Helper utility for building the HTML manual and opening it in the
# browser with $BROWSER or using xdg-open as a fallback tool.
# Adapted from Home-Manager, available under the MIT license.
docs-html-wrapped = let
xdg-open = lib.getExe' pkgs.xdg-utils "xdg-open";
docs-html = docs.manual.html + /share/doc/nvf;
in
pkgs.writeShellScriptBin "docs-html-wrapped" ''
set -euo pipefail
extraConfig = {
exclude = [];
include_mail = true;
include_verbatim = true;
};
};
if [[ ! -v BROWSER || -z $BROWSER ]]; then
for candidate in xdg-open open w3m; do
BROWSER="$(type -P $candidate || true)"
if [[ -x $BROWSER ]]; then
break;
fi
done
fi
# Helper utility for building the HTML manual and opening it in the
# browser with $BROWSER or using xdg-open as a fallback tool.
# Adapted from Home-Manager, available under the MIT license.
docs-html-wrapped = let
xdg-open = lib.getExe' pkgs.xdg-utils "xdg-open";
docs-html = docs.manual.html + /share/doc/nvf;
in
pkgs.writeShellScriptBin "docs-html-wrapped" ''
set -euo pipefail
if [[ ! -v BROWSER || -z $BROWSER ]]; then
echo "$0: unable to start a web browser; please set \$BROWSER"
echo "$0: Trying xdg-open as a fallback"
${xdg-open} ${docs-html}/index.xhtml
else
echo "\$BROWSER is set. Attempting to open manual"
exec "$BROWSER" "${docs-html}/index.xhtml"
fi
'';
if [[ ! -v BROWSER || -z $BROWSER ]]; then
for candidate in xdg-open open w3m; do
BROWSER="$(type -P $candidate || true)"
if [[ -x $BROWSER ]]; then
break;
fi
done
fi
# Exposed neovim configurations
nix = buildPkg false;
maximal = buildPkg true;
default = config.packages.nix;
};
if [[ ! -v BROWSER || -z $BROWSER ]]; then
echo "$0: unable to start a web browser; please set \$BROWSER"
echo "$0: Trying xdg-open as a fallback"
${xdg-open} ${docs-html}/index.xhtml
else
echo "\$BROWSER is set. Attempting to open manual"
exec "$BROWSER" "${docs-html}/index.xhtml"
fi
'';
# Exposed neovim configurations
nix = buildPkg false;
maximal = buildPkg true;
default = config.packages.nix;
};
};
}

View file

@ -26,6 +26,5 @@
./wakatime
./yanky-nvim
./yazi-nvim
./undotree
];
}

View file

@ -1,12 +0,0 @@
{
vim.lazy.plugins.undotree = {
package = "undotree";
cmd = [
"UndotreeToggle"
"UndotreeShow"
"UndotreeHide"
"UndotreePersistUndo"
"UndotreeFocus"
];
};
}

View file

@ -1,6 +0,0 @@
{
imports = [
./undotree.nix
./config.nix
];
}

View file

@ -1,7 +0,0 @@
{lib, ...}: let
inherit (lib.options) mkEnableOption;
in {
options.vim.utility.undotree = {
enable = mkEnableOption "undo history visualizer for Vim [undotree]";
};
}

View file

@ -2497,19 +2497,6 @@
"url": "https://github.com/chomosuke/typst-preview.nvim/archive/dea4525d5420b7c32eebda7de15a6beb9d6574fa.tar.gz",
"hash": "0y658l2ibq0x4cwa4rl3lab7aw4ba68xcrdnxp81p2rsk0d60qq4"
},
"undotree": {
"type": "Git",
"repository": {
"type": "GitHub",
"owner": "mbbill",
"repo": "undotree"
},
"branch": "master",
"submodules": false,
"revision": "28f2f54a34baff90ea6f4a735ef1813ad875c743",
"url": "https://github.com/mbbill/undotree/archive/28f2f54a34baff90ea6f4a735ef1813ad875c743.tar.gz",
"hash": "0k9qfp64rbwy1lc62x0vkwfl3qlx8633lfbhqxkf64yqwi81ysp5"
},
"vim-dirtytalk": {
"type": "Git",
"repository": {