diff --git a/configuration.nix b/configuration.nix index ac0ad32b..424d7173 100644 --- a/configuration.nix +++ b/configuration.nix @@ -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; diff --git a/docs/manual/hacking/additional-plugins.md b/docs/manual/hacking/additional-plugins.md index 1f7ba778..0ed252c7 100644 --- a/docs/manual/hacking/additional-plugins.md +++ b/docs/manual/hacking/additional-plugins.md @@ -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 github -b -``` +`npins add --name github -b ` -::: {.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 = "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 diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index c4ad963c..e18c95fe 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -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`. diff --git a/flake/pkgs/by-name/avante-nvim/package.nix b/flake/avante-nvim/default.nix similarity index 72% rename from flake/pkgs/by-name/avante-nvim/package.nix rename to flake/avante-nvim/default.nix index 4f8cdd9d..0d128bae 100644 --- a/flake/pkgs/by-name/avante-nvim/package.nix +++ b/flake/avante-nvim/default.nix @@ -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 = [ diff --git a/flake/pkgs/by-name/blink-cmp/package.nix b/flake/blink/default.nix similarity index 100% rename from flake/pkgs/by-name/blink-cmp/package.nix rename to flake/blink/default.nix diff --git a/flake/packages.nix b/flake/packages.nix index 7d39afcb..5161b34f 100644 --- a/flake/packages.nix +++ b/flake/packages.nix @@ -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; + }; }; } diff --git a/modules/plugins/utility/default.nix b/modules/plugins/utility/default.nix index 79d7d924..8069b6c1 100644 --- a/modules/plugins/utility/default.nix +++ b/modules/plugins/utility/default.nix @@ -26,6 +26,5 @@ ./wakatime ./yanky-nvim ./yazi-nvim - ./undotree ]; } diff --git a/modules/plugins/utility/undotree/config.nix b/modules/plugins/utility/undotree/config.nix deleted file mode 100644 index d954d49f..00000000 --- a/modules/plugins/utility/undotree/config.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ - vim.lazy.plugins.undotree = { - package = "undotree"; - cmd = [ - "UndotreeToggle" - "UndotreeShow" - "UndotreeHide" - "UndotreePersistUndo" - "UndotreeFocus" - ]; - }; -} diff --git a/modules/plugins/utility/undotree/default.nix b/modules/plugins/utility/undotree/default.nix deleted file mode 100644 index 012d8454..00000000 --- a/modules/plugins/utility/undotree/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ - imports = [ - ./undotree.nix - ./config.nix - ]; -} diff --git a/modules/plugins/utility/undotree/undotree.nix b/modules/plugins/utility/undotree/undotree.nix deleted file mode 100644 index 70846737..00000000 --- a/modules/plugins/utility/undotree/undotree.nix +++ /dev/null @@ -1,7 +0,0 @@ -{lib, ...}: let - inherit (lib.options) mkEnableOption; -in { - options.vim.utility.undotree = { - enable = mkEnableOption "undo history visualizer for Vim [undotree]"; - }; -} diff --git a/npins/sources.json b/npins/sources.json index 3c3bc3c3..00dcea83 100644 --- a/npins/sources.json +++ b/npins/sources.json @@ -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": {