Compare commits

..

10 Commits

Author SHA1 Message Date
Pei Yang Ching e9f27760b3 switch to other hacky array-table syntax 2024-07-17 12:55:25 +02:00
Pei Yang Ching b5201df699 wrap lazy init code in function 2024-07-17 12:55:25 +02:00
Ching Pei Yang 2bbda8aa51 flake: update lz.n 2024-07-17 12:55:25 +02:00
Ching Pei Yang d61341e1e9 lib: add lznPluginTableType 2024-07-17 12:55:25 +02:00
Ching Pei Yang 2da519eebb lib: export lznPluginType 2024-07-17 12:55:25 +02:00
Ching Pei Yang 780d207fa3 lz.n: load lz.n 2024-07-17 12:55:25 +02:00
Ching Pei Yang 4923191b42 lz.n: add basic lazy.plugins option 2024-07-17 12:55:25 +02:00
Pei Yang Ching 47cff4a8d4 lib: add basic lz.n plugin spec type 2024-07-17 12:55:25 +02:00
Pei Yang Ching 71c17cd843 add lazy module skeleton 2024-07-17 12:55:25 +02:00
Pei Yang Ching 6fb524a256 flake: add lz.n plugin 2024-07-17 12:55:25 +02:00
86 changed files with 484 additions and 503 deletions

View File

@ -5,5 +5,4 @@ configuring/custom-package.md
configuring/custom-plugins.md configuring/custom-plugins.md
configuring/languages.md configuring/languages.md
configuring/dags.md configuring/dags.md
configuring/dag-entries.md
``` ```

View File

@ -1,38 +1,16 @@
# Configuring {#sec-configuring-plugins} # Configuring {#sec-configuring-plugins}
Just making the plugin to your Neovim configuration available might not always Just making the plugin to your Neovim configuration available might not always
be enough. In that case, you can write custom lua config using either be enough. In that case, you can write custom vimscript or lua config, using
`config.vim.extraPlugins` (which has the `setup` field) or either `config.vim.configRC` or `config.vim.luaConfigRC` respectively. Both of
`config.vim.luaConfigRC`. The first option uses an attribute set, which maps DAG these options are attribute sets, and you need to give the configuration you're
section names to a custom type, which has the fields `package`, `after`, adding some name, like this:
`setup`. They allow you to set the package of the plugin, the sections its setup
code should be after (note that the `extraPlugins` option has its own DAG
scope), and the its setup code respectively. For example:
```nix
config.vim.extraPlugins = with pkgs.vimPlugins; {
aerial = {
package = aerial-nvim;
setup = "require('aerial').setup {}";
};
harpoon = {
package = harpoon;
setup = "require('harpoon').setup {}";
after = ["aerial"]; # place harpoon configuration after aerial
};
}
```
The second option 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:
```nix ```nix
{ {
# this will create an "aquarium" section in your init.lua with the contents of your custom config # this will create an "aquarium" section in your init.vim with the contents of your custom config
# which will be *appended* to the rest of your configuration, inside your init.vim # which will be *appended* to the rest of your configuration, inside your init.vim
config.vim.luaConfigRC.aquarium = "vim.cmd('colorscheme aquiarum')"; config.vim.configRC.aquarium = "colorscheme aquiarum";
} }
``` ```

View File

@ -1,20 +0,0 @@
# DAG entries in nvf {#ch-dag-entries}
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:
`vim.luaConfigRC` (top-level DAG):
1. (`luaConfigPre`) - not a part of the actual DAG, instead, it's simply
inserted before the rest of the DAG
2. `globalsScript` - used to set globals defined in `vim.globals`
3. `basic` - used to set basic configuration options
4. `theme` - used to set up the theme, which has to be done before other plugins
5. `pluginConfigs` - the result of the nested `vim.pluginRC` (internal option,
see the [Custom Plugins](/index.xhtml#ch-custom-plugins) page for adding your own
plugins) DAG, used to set up internal plugins
6. `extraPluginConfigs` - the result of `vim.extraPlugins`, which is not a
direct DAG, but is converted to, and resolved as one internally
7. `mappings` - the result of `vim.maps`

View File

@ -7,7 +7,7 @@ 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 used for topologically sorting strings. The DAG type allows the attribute set
entries to express dependency relations among themselves. This can, for entries to express dependency relations among themselves. This can, for
example, be used to control the order of configuration sections in your example, be used to control the order of configuration sections in your
`luaConfigRC`. `configRC` or `luaConfigRC`.
The below section, mostly taken from the [home-manager The below section, mostly taken from the [home-manager
manual](https://raw.githubusercontent.com/nix-community/home-manager/master/docs/manual/writing-modules/types.md) manual](https://raw.githubusercontent.com/nix-community/home-manager/master/docs/manual/writing-modules/types.md)

View File

@ -2,28 +2,6 @@
Release notes for release 0.7 Release notes for release 0.7
## Breaking Changes and Migration Guide {#sec-breaking-changes-and-migration-guide-0-7}
In v0.7 we are removing `vim.configRC` in favor of making `vim.luaConfigRC` the
top-level DAG, and thereby making the entire configuration Lua based. This
change introduces a few breaking changes:
[DAG entries in nvf manual]: /index.xhtml#ch-dag-entries
- `vim.configRC` has been removed, which means that you have to convert all of
your custom vimscript-based configuration to Lua. As for how to do that, you
will have to consult the Neovim documentation and your search engine.
- After migrating your Vimscript-based configuration to Lua, you might not be
able to use the same entry names in `vim.luaConfigRC`, because those have also
slightly changed. See the new [DAG entries in nvf manual] for more details.
**Why?**
Neovim being an aggressive refactor of Vim, is designed to be mainly Lua based;
making good use of its extensive Lua API. Additionally, Vimscript is slow and
brings unnecessary performance overhead while working with different
configuration formats.
## Changelog {#sec-release-0.7-changelog} ## Changelog {#sec-release-0.7-changelog}
[ItsSorae](https://github.com/ItsSorae): [ItsSorae](https://github.com/ItsSorae):
@ -34,8 +12,8 @@ configuration formats.
[frothymarrow](https://github.com/frothymarrow): [frothymarrow](https://github.com/frothymarrow):
- Modified type for - Modified type for
[](#opt-vim.visuals.fidget-nvim.setupOpts.progress.display.overrides) from [vim.visuals.fidget-nvim.setupOpts.progress.display.overrides](#opt-vim.visuals.fidget-nvim.setupOpts.progress.display.overrides)
`anything` to a `submodule` for better type checking. from `anything` to a `submodule` for better type checking.
- Fix null `vim.lsp.mappings` generating an error and not being filtered out. - Fix null `vim.lsp.mappings` generating an error and not being filtered out.
@ -43,32 +21,25 @@ configuration formats.
group for `Normal`, `NormalFloat`, `LineNr`, `SignColumn` and optionally group for `Normal`, `NormalFloat`, `LineNr`, `SignColumn` and optionally
`NvimTreeNormal` to `none`. `NvimTreeNormal` to `none`.
- Fix [](#opt-vim.ui.smartcolumn.setupOpts.custom_colorcolumn) using the wrong - Fix
type `int` instead of the expected type `string`. [vim.ui.smartcolumn.setupOpts.custom_colorcolumn](#opt-vim.ui.smartcolumn.setupOpts.custom_colorcolumn)
using the wrong type `int` instead of the expected type `string`.
- Fix unused src and version attributes in `buildPlug`.
[horriblename](https://github.com/horriblename): [horriblename](https://github.com/horriblename):
- Fix broken treesitter-context keybinds in visual mode - Fix broken treesitter-context keybinds in visual mode
- Deprecate use of `__empty` to define empty tables in Lua. Empty attrset are no - Deprecate use of `__empty` to define empty tables in lua. Empty attrset are no
longer filtered and thus should be used instead. longer filtered and thus should be used instead.
- Add dap-go for better dap configurations - Add dap-go for better dap configurations
- Make noice.nvim customizable - Make noice.nvim customizable
[rust-tools.nvim]: https://github.com/simrat39/rust-tools.nvim
[rustaceanvim]: https://github.com/mrcjkb/rustaceanvim
- Switch from [rust-tools.nvim] to the more feature-packed [rustaceanvim]. This
switch entails a whole bunch of new features and options, so you are
recommended to go through rustacean.nvim's README to take a closer look at its
features and usage
[jacekpoz](https://github.com/jacekpoz): [jacekpoz](https://github.com/jacekpoz):
[ocaml-lsp]: https://github.com/ocaml/ocaml-lsp - Add [ocaml-lsp](https://github.com/ocaml/ocaml-lsp) support.
- Add [ocaml-lsp] support - Fix Emac typo
- Fix "Emac" typo
[diniamo](https://github.com/diniamo): [diniamo](https://github.com/diniamo):
@ -90,7 +61,6 @@ configuration formats.
plugin's options can now be found under `indentBlankline.setupOpts`, the plugin's options can now be found under `indentBlankline.setupOpts`, the
previous iteration of the module also included out of place/broken options, previous iteration of the module also included out of place/broken options,
which have been removed for the time being. These are: which have been removed for the time being. These are:
- `listChar` - this was already unused - `listChar` - this was already unused
- `fillChar` - this had nothing to do with the plugin, please configure it - `fillChar` - this had nothing to do with the plugin, please configure it
yourself by adding `vim.opt.listchars:append({ space = '<char>' })` to your yourself by adding `vim.opt.listchars:append({ space = '<char>' })` to your
@ -99,22 +69,9 @@ configuration formats.
yourself by adding `vim.opt.listchars:append({ eol = '<char>' })` to your yourself by adding `vim.opt.listchars:append({ eol = '<char>' })` to your
lua configuration lua configuration
[Neovim documentation on `vim.cmd`]: https://neovim.io/doc/user/lua.html#vim.cmd()
- Make Neovim's configuration file entirely Lua based. This comes with a few
breaking changes:
- `vim.configRC` has been removed. You will need to migrate your entries to
Neovim-compliant Lua code, and add them to `vim.luaConfigRC` instead.
Existing vimscript configurations may be preserved in `vim.cmd` functions.
Please see [Neovim documentation on `vim.cmd`]
- `vim.luaScriptRC` is now the top-level DAG, and the internal `vim.pluginRC`
has been introduced for setting up internal plugins. See the "DAG entries in
nvf" manual page for more information.
[NotAShelf](https://github.com/notashelf): [NotAShelf](https://github.com/notashelf):
[ts-error-translator.nvim]: https://github.com/dmmulroy/ts-error-translator.nvim [ts-error-translator.nvim]: https://github.com/dmmulroy/ts-error-translator.nvim
[credo]: https://github.com/rrrene/credo
- Add `deno fmt` as the default Markdown formatter. This will be enabled - Add `deno fmt` as the default Markdown formatter. This will be enabled
automatically if you have autoformatting enabled, but can be disabled manually automatically if you have autoformatting enabled, but can be disabled manually
@ -125,8 +82,8 @@ configuration formats.
- Refactor `programs.languages.elixir` to use lspconfig and none-ls for LSP and - Refactor `programs.languages.elixir` to use lspconfig and none-ls for LSP and
formatter setups respectively. Diagnostics support is considered, and may be formatter setups respectively. Diagnostics support is considered, and may be
added once the [credo] linter has been added to nixpkgs. A pull request is added once the [credo](https://github.com/rrrene/credo) linter has been added
currently open. to nixpkgs. A pull request is currently open.
- Remove vim-tidal and friends. - Remove vim-tidal and friends.
@ -139,11 +96,3 @@ configuration formats.
- Add [neo-tree.nvim] as an alternative file-tree plugin. It will be available - Add [neo-tree.nvim] as an alternative file-tree plugin. It will be available
under `vim.filetree.neo-tree`, similar to nvimtree. under `vim.filetree.neo-tree`, similar to nvimtree.
- Add `print-nvf-config` & `print-nvf-config-path` helper scripts to Neovim
closure. Both of those scripts have been automatically added to your PATH upon
using neovimConfig or `programs.nvf.enable`.
- `print-nvf-config` will display your `init.lua`, in full.
- `print-nvf-config-path` will display the path to _a clone_ of your
`init.lua`. This is not the path used by the Neovim wrapper, but an
identical clone.

View File

@ -69,11 +69,11 @@
}, },
"mnw": { "mnw": {
"locked": { "locked": {
"lastModified": 1721440413, "lastModified": 1720927281,
"narHash": "sha256-PF/FbgCUZ6mQrKp28G2YoVDlSThBy8AxIT9d2Ju3kTY=", "narHash": "sha256-4Z2FtCuL0lT+sM2gb1JMcXOUkeYrWeYZjjs1HuVTlOs=",
"owner": "Gerg-L", "owner": "Gerg-L",
"repo": "mnw", "repo": "mnw",
"rev": "4ea225024677e7c3a96080af8624fd3aa5dfa1b6", "rev": "302b18ddb8498aa9a7e0c01f7026e49d545e6898",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -129,11 +129,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1721016451, "lastModified": 1720571246,
"narHash": "sha256-Cypl9ORr5UjtBsbjXMTJRepTe362yNVrPrntUvHiTaw=", "narHash": "sha256-nkUXwunTck+hNMt2wZuYRN+jf2ySRjKTzI0fo5TDH78=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "a14c5d651cee9ed70f9cd9e83f323f1e531002db", "rev": "16e401f01842c5bb2499e78c1fe227f939c0c474",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -1500,19 +1500,19 @@
"type": "github" "type": "github"
} }
}, },
"plugin-rustaceanvim": { "plugin-rust-tools": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1720595685, "lastModified": 1704259376,
"narHash": "sha256-Mx8pB9ECjFpbfmZPuXfpwoE5pUZ363M53f27ht7MBmA=", "narHash": "sha256-kFane5ze7VDiOzF7jdmXkr50XQsNvdb+a9HQtybEVE0=",
"owner": "mrcjkb", "owner": "simrat39",
"repo": "rustaceanvim", "repo": "rust-tools.nvim",
"rev": "047f9c9d8cd2861745eb9de6c1570ee0875aa795", "rev": "676187908a1ce35ffcd727c654ed68d851299d3e",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "mrcjkb", "owner": "simrat39",
"repo": "rustaceanvim", "repo": "rust-tools.nvim",
"type": "github" "type": "github"
} }
}, },
@ -1913,7 +1913,7 @@
"plugin-project-nvim": "plugin-project-nvim", "plugin-project-nvim": "plugin-project-nvim",
"plugin-registers": "plugin-registers", "plugin-registers": "plugin-registers",
"plugin-rose-pine": "plugin-rose-pine", "plugin-rose-pine": "plugin-rose-pine",
"plugin-rustaceanvim": "plugin-rustaceanvim", "plugin-rust-tools": "plugin-rust-tools",
"plugin-scrollbar-nvim": "plugin-scrollbar-nvim", "plugin-scrollbar-nvim": "plugin-scrollbar-nvim",
"plugin-smartcolumn": "plugin-smartcolumn", "plugin-smartcolumn": "plugin-smartcolumn",
"plugin-sqls-nvim": "plugin-sqls-nvim", "plugin-sqls-nvim": "plugin-sqls-nvim",

View File

@ -25,8 +25,7 @@
flake = { flake = {
lib = { lib = {
inherit (lib) nvim; inherit (lib) nvim neovimConfiguration;
inherit (lib.nvim) neovimConfiguration;
}; };
homeManagerModules = { homeManagerModules = {
@ -171,8 +170,8 @@
flake = false; flake = false;
}; };
plugin-rustaceanvim = { plugin-rust-tools = {
url = "github:mrcjkb/rustaceanvim"; url = "github:simrat39/rust-tools.nvim";
flake = false; flake = false;
}; };

View File

@ -8,10 +8,10 @@
# - the addition of the function `entryBefore` indicating a "wanted # - the addition of the function `entryBefore` indicating a "wanted
# by" relationship. # by" relationship.
{lib}: let {lib}: let
inherit (builtins) isAttrs attrValues attrNames elem all head tail length toJSON isString; inherit (builtins) isAttrs attrValues attrNames elem all head tail length;
inherit (lib.attrsets) filterAttrs mapAttrs; inherit (lib.attrsets) filterAttrs mapAttrs;
inherit (lib.lists) toposort; inherit (lib.lists) toposort;
inherit (lib.nvim.dag) empty isEntry entryBetween entryAfter entriesBetween entryAnywhere topoSort; inherit (lib.nvim.dag) empty isEntry entryBetween entryAfter entriesBetween;
in { in {
empty = {}; empty = {};
@ -147,22 +147,8 @@ in {
${section.data} ${section.data}
''; '';
resolveDag = { mkVimrcSection = section: ''
name, " SECTION: ${section.name}
dag, ${section.data}
mapResult, '';
}: let
# When the value is a string, default it to dag.entryAnywhere
finalDag = mapAttrs (_: value:
if isString value
then entryAnywhere value
else value)
dag;
sortedDag = topoSort finalDag;
result =
if sortedDag ? result
then mapResult sortedDag.result
else abort ("Dependency cycle in ${name}: " + toJSON sortedDag);
in
result;
} }

View File

@ -11,5 +11,6 @@
languages = import ./languages.nix {inherit lib;}; languages = import ./languages.nix {inherit lib;};
lists = import ./lists.nix {inherit lib;}; lists = import ./lists.nix {inherit lib;};
lua = import ./lua.nix {inherit lib;}; lua = import ./lua.nix {inherit lib;};
vim = import ./vim.nix;
neovimConfiguration = import ./configuration.nix {inherit inputs lib;}; neovimConfiguration = import ./configuration.nix {inherit inputs lib;};
} }

View File

@ -5,6 +5,16 @@
inherit (lib.strings) concatStringsSep concatMapStringsSep stringToCharacters concatLines; inherit (lib.strings) concatStringsSep concatMapStringsSep stringToCharacters concatLines;
inherit (lib.trivial) boolToString warn; inherit (lib.trivial) boolToString warn;
in rec { in rec {
wrapLuaConfig = {
luaBefore ? "",
luaConfig,
luaAfter ? "",
}: ''
lua << EOF
${concatLines [luaBefore luaConfig luaAfter]}
EOF
'';
# Convert a null value to lua's nil # Convert a null value to lua's nil
nullString = value: nullString = value:
if value == null if value == null

26
lib/vim.nix Normal file
View File

@ -0,0 +1,26 @@
let
inherit (builtins) isInt isBool toJSON toString;
in rec {
# yes? no.
yesNo = value:
if value
then "yes"
else "no";
# convert a boolean to a vim compliant boolean string
mkVimBool = val:
if val
then "1"
else "0";
# convert a literal value to a vim compliant value
valToVim = val:
if (isInt val)
then (toString val)
else
(
if (isBool val)
then (mkVimBool val)
else (toJSON val)
);
}

View File

@ -36,19 +36,11 @@ inputs: {
buildPlug = {pname, ...} @ attrs: let buildPlug = {pname, ...} @ attrs: let
src = getAttr ("plugin-" + pname) inputs; src = getAttr ("plugin-" + pname) inputs;
in in
pkgs.stdenvNoCC.mkDerivation ({ pkgs.runCommand "${pname}-${src.shortRev or src.shortDirtyRev or "dirty"}" attrs
inherit src; ''
version = src.shortRev or src.shortDirtyRev or "dirty"; mkdir -p $out
installPhase = '' cp -r ${src}/. $out
runHook preInstall '';
mkdir -p $out
cp -r . $out
runHook postInstall
'';
}
// attrs);
noBuildPlug = {pname, ...} @ attrs: let noBuildPlug = {pname, ...} @ attrs: let
input = getAttr ("plugin-" + pname) inputs; input = getAttr ("plugin-" + pname) inputs;
@ -106,42 +98,16 @@ inputs: {
neovim = vimOptions.package; neovim = vimOptions.package;
plugins = concatLists [builtStartPlugins builtOptPlugins]; plugins = concatLists [builtStartPlugins builtOptPlugins];
appName = "nvf"; appName = "nvf";
initViml = vimOptions.builtConfigRC;
extraBinPath = vimOptions.extraPackages; extraBinPath = vimOptions.extraPackages;
initLua = vimOptions.builtLuaConfigRC;
luaFiles = vimOptions.extraLuaFiles;
inherit (vimOptions) viAlias vimAlias withRuby withNodeJs withPython3; inherit (vimOptions) viAlias vimAlias withRuby withNodeJs withPython3;
inherit extraLuaPackages extraPython3Packages; inherit extraLuaPackages extraPython3Packages;
}; };
# Additional helper scripts for printing and displaying nvf configuration
# in your commandline.
printConfig = pkgs.writers.writeDashBin "print-nvf-config" ''
cat << EOF
${vimOptions.builtLuaConfigRC}
EOF
'';
printConfigPath = pkgs.writers.writeDashBin "print-nvf-config-path" ''
realpath ${pkgs.writeTextFile {
name = "nvf-init.lua";
text = vimOptions.builtLuaConfigRC;
}}
'';
in { in {
inherit (module) options config; inherit (module) options config;
inherit (module._module.args) pkgs; inherit (module._module.args) pkgs;
# Expose wrapped neovim-package for userspace # expose wrapped neovim-package
# or module consumption. neovim = neovim-wrapped;
neovim = pkgs.symlinkJoin {
name = "nvf-with-helpers";
paths = [neovim-wrapped printConfig printConfigPath];
postBuild = "echo helpers added";
meta = {
description = "Wrapped version of Neovim with additional helper scripts";
mainProgram = "nvim";
};
};
} }

View File

@ -5,17 +5,16 @@
}: let }: let
inherit (lib.options) mkOption literalExpression; inherit (lib.options) mkOption literalExpression;
inherit (lib.strings) optionalString; inherit (lib.strings) optionalString;
inherit (lib.types) enum bool str int; inherit (lib.types) enum bool str int nullOr;
inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.dag) entryAfter;
inherit (lib.nvim.lua) toLuaObject;
cfg = config.vim; cfg = config.vim;
in { in {
options.vim = { options.vim = {
leaderKey = mkOption { leaderKey = mkOption {
type = str; type = nullOr str;
default = " "; default = null;
description = "The leader key used for `<leader>` mappings"; description = "The leader key to be used internally";
}; };
colourTerm = mkOption { colourTerm = mkOption {
@ -54,6 +53,12 @@ in {
description = "Enable syntax highlighting"; description = "Enable syntax highlighting";
}; };
mapLeaderSpace = mkOption {
type = bool;
default = true;
description = "Map the space key to leader key";
};
useSystemClipboard = mkOption { useSystemClipboard = mkOption {
type = bool; type = bool;
default = false; default = false;
@ -160,110 +165,117 @@ in {
}; };
}; };
config.vim.luaConfigRC.basic = entryAfter ["globalsScript"] '' config.vim.configRC.basic = entryAfter ["globalsScript"] ''
-- Settings that are set for everything " Settings that are set for everything
vim.o.encoding = "utf-8" set encoding=utf-8
vim.o.hidden = true set hidden
vim.opt.shortmess:append("c") set shortmess+=c
vim.o.expandtab = true set expandtab
vim.o.mouse = ${toLuaObject cfg.mouseSupport} set mouse=${cfg.mouseSupport}
vim.o.tabstop = ${toLuaObject cfg.tabWidth} set tabstop=${toString cfg.tabWidth}
vim.o.shiftwidth = ${toLuaObject cfg.tabWidth} set shiftwidth=${toString cfg.tabWidth}
vim.o.softtabstop = ${toLuaObject cfg.tabWidth} set softtabstop=${toString cfg.tabWidth}
vim.o.cmdheight = ${toLuaObject cfg.cmdHeight} set cmdheight=${toString cfg.cmdHeight}
vim.o.updatetime = ${toLuaObject cfg.updateTime} set updatetime=${toString cfg.updateTime}
vim.o.tm = ${toLuaObject cfg.mapTimeout} set tm=${toString cfg.mapTimeout}
vim.o.cursorlineopt = ${toLuaObject cfg.cursorlineOpt} set cursorlineopt=${toString cfg.cursorlineOpt}
vim.o.scrolloff = ${toLuaObject cfg.scrollOffset} set scrolloff=${toString cfg.scrollOffset}
vim.g.mapleader = ${toLuaObject cfg.leaderKey}
vim.g.maplocalleader = ${toLuaObject cfg.leaderKey}
${optionalString cfg.splitBelow '' ${optionalString cfg.splitBelow ''
vim.o.splitbelow = true set splitbelow
''} ''}
${optionalString cfg.splitRight '' ${optionalString cfg.splitRight ''
vim.o.splitright = true set splitright
''} ''}
${optionalString cfg.showSignColumn '' ${optionalString cfg.showSignColumn ''
vim.o.signcolumn = "yes" set signcolumn=yes
''} ''}
${optionalString cfg.autoIndent '' ${optionalString cfg.autoIndent ''
vim.o.autoindent = true set autoindent
''} ''}
${optionalString cfg.preventJunkFiles '' ${optionalString cfg.preventJunkFiles ''
vim.o.swapfile = false set noswapfile
vim.o.backup = false set nobackup
vim.o.writebackup = false set nowritebackup
''} ''}
${optionalString (cfg.bell == "none") '' ${optionalString (cfg.bell == "none") ''
vim.o.errorbells = false set noerrorbells
vim.o.visualbell = false set novisualbell
''} ''}
${optionalString (cfg.bell == "on") '' ${optionalString (cfg.bell == "on") ''
vim.o.visualbell = false set novisualbell
''} ''}
${optionalString (cfg.bell == "visual") '' ${optionalString (cfg.bell == "visual") ''
vim.o.errorbells = false set noerrorbells
''} ''}
${optionalString (cfg.lineNumberMode == "relative") '' ${optionalString (cfg.lineNumberMode == "relative") ''
vim.o.relativenumber = true set relativenumber
''} ''}
${optionalString (cfg.lineNumberMode == "number") '' ${optionalString (cfg.lineNumberMode == "number") ''
vim.o.number = true set number
''} ''}
${optionalString (cfg.lineNumberMode == "relNumber") '' ${optionalString (cfg.lineNumberMode == "relNumber") ''
vim.o.number = true set number relativenumber
vim.o.relativenumber = true
''} ''}
${optionalString cfg.useSystemClipboard '' ${optionalString cfg.useSystemClipboard ''
vim.opt.clipboard:append("unnamedplus") set clipboard+=unnamedplus
''}
${optionalString cfg.mapLeaderSpace ''
let mapleader=" "
let maplocalleader=" "
''} ''}
${optionalString cfg.syntaxHighlighting '' ${optionalString cfg.syntaxHighlighting ''
vim.cmd("syntax on") syntax on
''} ''}
${optionalString (!cfg.wordWrap) '' ${optionalString (!cfg.wordWrap) ''
vim.o.wrap = false set nowrap
''} ''}
${optionalString cfg.hideSearchHighlight '' ${optionalString cfg.hideSearchHighlight ''
vim.o.hlsearch = false set nohlsearch
vim.o.incsearch = true set incsearch
''} ''}
${optionalString cfg.colourTerm '' ${optionalString cfg.colourTerm ''
vim.o.termguicolors = true set termguicolors
set t_Co=256
''} ''}
${optionalString (!cfg.enableEditorconfig) '' ${optionalString (!cfg.enableEditorconfig) ''
vim.g.editorconfig = false let g:editorconfig = v:false
''}
${optionalString (cfg.leaderKey != null) ''
let mapleader = "${toString cfg.leaderKey}"
''} ''}
${optionalString (cfg.searchCase == "ignore") '' ${optionalString (cfg.searchCase == "ignore") ''
vim.o.smartcase = false set nosmartcase
vim.o.ignorecase = true set ignorecase
''} ''}
${optionalString (cfg.searchCase == "smart") '' ${optionalString (cfg.searchCase == "smart") ''
vim.o.smartcase = true set smartcase
vim.o.ignorecase = true set ignorecase
''} ''}
${optionalString (cfg.searchCase == "sensitive") '' ${optionalString (cfg.searchCase == "sensitive") ''
vim.o.smartcase = false set nosmartcase
vim.o.ignorecase = false set noignorecase
''} ''}
''; '';
} }

View File

@ -9,26 +9,32 @@
in { in {
config = { config = {
vim.maps = { vim.maps = {
normal = mkIf cfg.disableArrows { normal =
"<up>" = { mkIf cfg.disableArrows {
action = "<nop>"; "<up>" = {
action = "<nop>";
noremap = false; noremap = false;
}; };
"<down>" = { "<down>" = {
action = "<nop>"; action = "<nop>";
noremap = false; noremap = false;
};
"<left>" = {
action = "<nop>";
noremap = false;
};
"<right>" = {
action = "<nop>";
noremap = false;
};
}
// mkIf cfg.mapLeaderSpace {
"<space>" = {
action = "<nop>";
};
}; };
"<left>" = {
action = "<nop>";
noremap = false;
};
"<right>" = {
action = "<nop>";
noremap = false;
};
};
insert = mkIf cfg.disableArrows { insert = mkIf cfg.disableArrows {
"<up>" = { "<up>" = {

View File

@ -33,7 +33,7 @@ in {
startPlugins = [ startPlugins = [
"chatgpt" "chatgpt"
]; ];
pluginRC.chagpt = entryAnywhere '' luaConfigRC.chagpt = entryAnywhere ''
require("chatgpt").setup(${toLuaObject cfg.setupOpts}) require("chatgpt").setup(${toLuaObject cfg.setupOpts})
''; '';
maps.normal = mkMerge [ maps.normal = mkMerge [

View File

@ -34,7 +34,7 @@ in {
"copilot-cmp" "copilot-cmp"
]; ];
vim.pluginRC.copilot = entryAnywhere '' vim.luaConfigRC.copilot = entryAnywhere ''
require("copilot").setup(${toLuaObject cfg.setupOpts}) require("copilot").setup(${toLuaObject cfg.setupOpts})
${lib.optionalString cfg.cmp.enable '' ${lib.optionalString cfg.cmp.enable ''

View File

@ -12,7 +12,7 @@ in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim.startPlugins = ["nvim-autopairs"]; vim.startPlugins = ["nvim-autopairs"];
vim.pluginRC.autopairs = entryAnywhere '' vim.luaConfigRC.autopairs = entryAnywhere ''
require("nvim-autopairs").setup({ map_cr = ${boolToString (!config.vim.autocomplete.enable)} }) require("nvim-autopairs").setup({ map_cr = ${boolToString (!config.vim.autocomplete.enable)} })
''; '';
}; };

View File

@ -41,7 +41,7 @@ in {
(mkBinding cfg.mappings.toggleSelectedBlock "<Plug>(comment_toggle_blockwise_visual)" mappings.toggleSelectedBlock.description) (mkBinding cfg.mappings.toggleSelectedBlock "<Plug>(comment_toggle_blockwise_visual)" mappings.toggleSelectedBlock.description)
]; ];
vim.pluginRC.comment-nvim = entryAnywhere '' vim.luaConfigRC.comment-nvim = entryAnywhere ''
require('Comment').setup({ require('Comment').setup({
mappings = { basic = false, extra = false, }, mappings = { basic = false, extra = false, },
}) })

View File

@ -186,7 +186,7 @@ in {
# TODO: alternative snippet engines to vsnip # TODO: alternative snippet engines to vsnip
# https://github.com/hrsh7th/nvim-cmp/blob/main/doc/cmp.txt#L82 # https://github.com/hrsh7th/nvim-cmp/blob/main/doc/cmp.txt#L82
vim.pluginRC.completion = mkIf (cfg.type == "nvim-cmp") (dagPlacement '' vim.luaConfigRC.completion = mkIf (cfg.type == "nvim-cmp") (dagPlacement ''
local nvim_cmp_menu_map = function(entry, vim_item) local nvim_cmp_menu_map = function(entry, vim_item)
-- name for each source -- name for each source
vim_item.menu = ({ vim_item.menu = ({

View File

@ -16,7 +16,7 @@ in {
# the entire credit for this dashboard configuration to https://github.com/Rishabh672003 # the entire credit for this dashboard configuration to https://github.com/Rishabh672003
# honestly, excellent work # honestly, excellent work
vim.pluginRC.alpha = entryAnywhere '' vim.luaConfigRC.alpha = entryAnywhere ''
local alpha = require("alpha") local alpha = require("alpha")
local plenary_path = require("plenary.path") local plenary_path = require("plenary.path")
local dashboard = require("alpha.themes.dashboard") local dashboard = require("alpha.themes.dashboard")

View File

@ -13,7 +13,7 @@ in {
"dashboard-nvim" "dashboard-nvim"
]; ];
vim.pluginRC.dashboard-nvim = entryAnywhere '' vim.luaConfigRC.dashboard-nvim = entryAnywhere ''
require("dashboard").setup{} require("dashboard").setup{}
''; '';
}; };

View File

@ -5,6 +5,7 @@
... ...
}: let }: let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.nvim.vim) mkVimBool;
cfg = config.vim.dashboard.startify; cfg = config.vim.dashboard.startify;
in { in {
@ -22,28 +23,28 @@ in {
else cfg.customFooter; else cfg.customFooter;
"startify_bookmarks" = cfg.bookmarks; "startify_bookmarks" = cfg.bookmarks;
"startify_lists" = cfg.lists; "startify_lists" = cfg.lists;
"startify_change_to_dir" = cfg.changeToDir; "startify_change_to_dir" = mkVimBool cfg.changeToDir;
"startify_change_to_vcs_root" = cfg.changeToVCRoot; "startify_change_to_vcs_root" = mkVimBool cfg.changeToVCRoot;
"startify_change_cmd" = cfg.changeDirCmd; "startify_change_cmd" = cfg.changeDirCmd;
"startify_skiplist" = cfg.skipList; "startify_skiplist" = cfg.skipList;
"startify_update_oldfiles" = cfg.updateOldFiles; "startify_update_oldfiles" = mkVimBool cfg.updateOldFiles;
"startify_session_autoload" = cfg.sessionAutoload; "startify_session_autoload" = mkVimBool cfg.sessionAutoload;
"startify_commands" = cfg.commands; "startify_commands" = cfg.commands;
"startify_files_number" = cfg.filesNumber; "startify_files_number" = cfg.filesNumber;
"startify_custom_indices" = cfg.customIndices; "startify_custom_indices" = cfg.customIndices;
"startify_disable_at_vimenter" = cfg.disableOnStartup; "startify_disable_at_vimenter" = mkVimBool cfg.disableOnStartup;
"startify_enable_unsafe" = cfg.unsafe; "startify_enable_unsafe" = mkVimBool cfg.unsafe;
"startify_padding_left" = cfg.paddingLeft; "startify_padding_left" = cfg.paddingLeft;
"startify_use_env" = cfg.useEnv; "startify_use_env" = mkVimBool cfg.useEnv;
"startify_session_before_save" = cfg.sessionBeforeSave; "startify_session_before_save" = cfg.sessionBeforeSave;
"startify_session_persistence" = cfg.sessionPersistence; "startify_session_persistence" = mkVimBool cfg.sessionPersistence;
"startify_session_delete_buffers" = cfg.sessionDeleteBuffers; "startify_session_delete_buffers" = mkVimBool cfg.sessionDeleteBuffers;
"startify_session_dir" = cfg.sessionDir; "startify_session_dir" = cfg.sessionDir;
"startify_skiplist_server" = cfg.skipListServer; "startify_skiplist_server" = cfg.skipListServer;
"startify_session_remove_lines" = cfg.sessionRemoveLines; "startify_session_remove_lines" = cfg.sessionRemoveLines;
"startify_session_savevars" = cfg.sessionSavevars; "startify_session_savevars" = cfg.sessionSavevars;
"startify_session_savecmds" = cfg.sessionSavecmds; "startify_session_savecmds" = cfg.sessionSavecmds;
"startify_session_sort" = cfg.sessionSort; "startify_session_sort" = mkVimBool cfg.sessionSort;
}; };
}; };
} }

View File

@ -18,7 +18,7 @@ in {
(mkIf cfg.enable { (mkIf cfg.enable {
vim.startPlugins = ["nvim-dap"]; vim.startPlugins = ["nvim-dap"];
vim.pluginRC = vim.luaConfigRC =
{ {
# TODO customizable keymaps # TODO customizable keymaps
nvim-dap = entryAnywhere '' nvim-dap = entryAnywhere ''
@ -51,7 +51,7 @@ in {
(mkIf (cfg.enable && cfg.ui.enable) { (mkIf (cfg.enable && cfg.ui.enable) {
vim.startPlugins = ["nvim-dap-ui" "nvim-nio"]; vim.startPlugins = ["nvim-dap-ui" "nvim-nio"];
vim.pluginRC.nvim-dap-ui = entryAfter ["nvim-dap"] ('' vim.luaConfigRC.nvim-dap-ui = entryAfter ["nvim-dap"] (''
local dapui = require("dapui") local dapui = require("dapui")
dapui.setup() dapui.setup()
'' ''

View File

@ -20,7 +20,7 @@ in {
"neo-tree-nvim" "neo-tree-nvim"
]; ];
pluginRC.neo-tree = entryAnywhere '' luaConfigRC.neo-tree = entryAnywhere ''
require("neo-tree").setup(${toLuaObject cfg.setupOpts}) require("neo-tree").setup(${toLuaObject cfg.setupOpts})
''; '';
}; };

View File

@ -29,7 +29,7 @@ in {
"<leader>t" = "+NvimTree"; "<leader>t" = "+NvimTree";
}; };
vim.pluginRC.nvimtreelua = entryAnywhere '' vim.luaConfigRC.nvimtreelua = entryAnywhere ''
${ ${
optionalString cfg.setupOpts.disable_netrw '' optionalString cfg.setupOpts.disable_netrw ''
-- disable netrew completely -- disable netrew completely

View File

@ -69,7 +69,7 @@ in {
"<leader>g" = "+Gitsigns"; "<leader>g" = "+Gitsigns";
}; };
pluginRC.gitsigns = entryAnywhere '' luaConfigRC.gitsigns = entryAnywhere ''
require('gitsigns').setup{} require('gitsigns').setup{}
''; '';
}; };

View File

@ -12,7 +12,7 @@
inherit (lib.modules) mkIf mkMerge; inherit (lib.modules) mkIf mkMerge;
inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.lua) expToLua;
inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.types) mkGrammarOption;
inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.dag) entryAnywhere;
packageToCmd = package: defaultCmd: packageToCmd = package: defaultCmd:
if isList cfg.lsp.package if isList cfg.lsp.package
@ -141,7 +141,7 @@ in {
config = mkIf cfg.enable (mkMerge [ config = mkIf cfg.enable (mkMerge [
(mkIf cfg.cHeader { (mkIf cfg.cHeader {
vim.pluginRC.c-header = entryAfter ["basic"] "vim.g.c_syntax_for_h = 1"; vim.configRC.c-header = entryAnywhere "let g:c_syntax_for_h = 1";
}) })
(mkIf cfg.treesitter.enable { (mkIf cfg.treesitter.enable {

View File

@ -140,7 +140,7 @@ in {
then ["flutter-tools-patched"] then ["flutter-tools-patched"]
else ["flutter-tools"]; else ["flutter-tools"];
vim.pluginRC.flutter-tools = entryAnywhere '' vim.luaConfigRC.flutter-tools = entryAnywhere ''
require('flutter-tools').setup { require('flutter-tools').setup {
lsp = { lsp = {
color = { -- show the derived colours for dart variables color = { -- show the derived colours for dart variables

View File

@ -113,7 +113,7 @@ in {
(mkIf cfg.elixir-tools.enable { (mkIf cfg.elixir-tools.enable {
vim.startPlugins = ["elixir-tools"]; vim.startPlugins = ["elixir-tools"];
vim.pluginRC.elixir-tools = entryAnywhere '' vim.luaConfigRC.elixir-tools = entryAnywhere ''
local elixir-tools = require("elixir") local elixir-tools = require("elixir")
local elixirls = require("elixir-tools.elixirls") local elixirls = require("elixir-tools.elixirls")

View File

@ -102,7 +102,7 @@ in {
(mkIf cfg.dap.enable { (mkIf cfg.dap.enable {
vim = { vim = {
startPlugins = ["nvim-dap-go"]; startPlugins = ["nvim-dap-go"];
pluginRC.nvim-dap-go = entryAfter ["nvim-dap"] '' luaConfigRC.nvim-dap-go = entryAfter ["nvim-dap"] ''
require('dap-go').setup { require('dap-go').setup {
delve = { delve = {
path = '${getExe cfg.dap.package}', path = '${getExe cfg.dap.package}',

View File

@ -36,7 +36,7 @@ in {
grammars = [cfg.treesitter.package]; grammars = [cfg.treesitter.package];
}; };
pluginRC.html-autotag = mkIf cfg.treesitter.autotagHtml (entryAnywhere '' luaConfigRC.html-autotag = mkIf cfg.treesitter.autotagHtml (entryAnywhere ''
require('nvim-ts-autotag').setup() require('nvim-ts-autotag').setup()
''); '');
}; };

View File

@ -61,7 +61,7 @@ in {
(mkIf cfg.lsp.neodev.enable { (mkIf cfg.lsp.neodev.enable {
vim.startPlugins = ["neodev-nvim"]; vim.startPlugins = ["neodev-nvim"];
vim.pluginRC.neodev = entryBefore ["lua-lsp"] '' vim.luaConfigRC.neodev = entryBefore ["lua-lsp"] ''
require("neodev").setup({}) require("neodev").setup({})
''; '';
}) })

View File

@ -11,6 +11,7 @@
inherit (lib.strings) optionalString; inherit (lib.strings) optionalString;
inherit (lib.types) enum either listOf package str; inherit (lib.types) enum either listOf package str;
inherit (lib.nvim.types) mkGrammarOption diagnostics; inherit (lib.nvim.types) mkGrammarOption diagnostics;
inherit (lib.nvim.dag) entryAnywhere;
inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.lua) expToLua;
inherit (lib.nvim.languages) diagnosticsToLua; inherit (lib.nvim.languages) diagnosticsToLua;
@ -175,16 +176,8 @@ in {
config = mkIf cfg.enable (mkMerge [ config = mkIf cfg.enable (mkMerge [
{ {
vim.pluginRC.nix = '' vim.configRC.nix = entryAnywhere ''
vim.api.nvim_create_autocmd("FileType", { autocmd filetype nix setlocal tabstop=2 shiftwidth=2 softtabstop=2
pattern = "nix",
callback = function(opts)
local bo = vim.bo[opts.buf]
bo.tabstop = 2
bo.shiftwidth = 2
bo.softtabstop = 2
end
})
''; '';
} }

View File

@ -102,7 +102,7 @@ in {
startPlugins = ["crates-nvim"]; startPlugins = ["crates-nvim"];
lsp.null-ls.enable = mkIf cfg.crates.codeActions true; lsp.null-ls.enable = mkIf cfg.crates.codeActions true;
autocomplete.sources = {"crates" = "[Crates]";}; autocomplete.sources = {"crates" = "[Crates]";};
pluginRC.rust-crates = entryAnywhere '' luaConfigRC.rust-crates = entryAnywhere ''
require('crates').setup { require('crates').setup {
null_ls = { null_ls = {
enabled = ${boolToString cfg.crates.codeActions}, enabled = ${boolToString cfg.crates.codeActions},
@ -125,61 +125,72 @@ in {
(mkIf (cfg.lsp.enable || cfg.dap.enable) { (mkIf (cfg.lsp.enable || cfg.dap.enable) {
vim = { vim = {
startPlugins = ["rustaceanvim"]; startPlugins = ["rust-tools"] ++ optionals cfg.dap.enable [cfg.dap.package];
luaConfigRC.rustaceanvim = entryAnywhere '' lsp.lspconfig = {
vim.g.rustaceanvim = { enable = true;
${optionalString cfg.lsp.enable '' sources.rust-lsp = ''
-- LSP local rt = require('rust-tools')
tools = { rust_on_attach = function(client, bufnr)
hover_actions = { default_on_attach(client, bufnr)
replace_builtin_hover = false local opts = { noremap=true, silent=true, buffer = bufnr }
vim.keymap.set("n", "<leader>ris", rt.inlay_hints.set, opts)
vim.keymap.set("n", "<leader>riu", rt.inlay_hints.unset, opts)
vim.keymap.set("n", "<leader>rr", rt.runnables.runnables, opts)
vim.keymap.set("n", "<leader>rp", rt.parent_module.parent_module, opts)
vim.keymap.set("n", "<leader>rm", rt.expand_macro.expand_macro, opts)
vim.keymap.set("n", "<leader>rc", rt.open_cargo_toml.open_cargo_toml, opts)
vim.keymap.set("n", "<leader>rg", function() rt.crate_graph.view_crate_graph("x11", nil) end, opts)
${optionalString cfg.dap.enable ''
vim.keymap.set("n", "<leader>rd", ":RustDebuggables<cr>", opts)
vim.keymap.set(
"n", "${config.vim.debugger.nvim-dap.mappings.continue}",
function()
local dap = require("dap")
if dap.status() == "" then
vim.cmd "RustDebuggables"
else
dap.continue()
end
end,
opts
)
''}
end
local rustopts = {
tools = {
autoSetHints = true,
hover_with_actions = false,
inlay_hints = {
only_current_line = false,
}
}, },
}, server = {
server = { capabilities = capabilities,
cmd = ${ on_attach = rust_on_attach,
cmd = ${
if isList cfg.lsp.package if isList cfg.lsp.package
then expToLua cfg.lsp.package then expToLua cfg.lsp.package
else ''{"${cfg.lsp.package}/bin/rust-analyzer"}'' else ''{"${cfg.lsp.package}/bin/rust-analyzer"}''
}, },
on_attach = function(client, bufnr) settings = {
default_on_attach(client, bufnr) ${cfg.lsp.opts}
local opts = { noremap=true, silent=true, buffer = bufnr } }
vim.keymap.set("n", "<leader>rr", ":RustLsp runnables<CR>", opts)
vim.keymap.set("n", "<leader>rp", ":RustLsp parentModule<CR>", opts)
vim.keymap.set("n", "<leader>rm", ":RustLsp expandMacro<CR>", opts)
vim.keymap.set("n", "<leader>rc", ":RustLsp openCargo", opts)
vim.keymap.set("n", "<leader>rg", ":RustLsp crateGraph x11", opts)
${optionalString cfg.dap.enable ''
vim.keymap.set("n", "<leader>rd", ":RustLsp debuggables<cr>", opts)
vim.keymap.set(
"n", "${config.vim.debugger.nvim-dap.mappings.continue}",
function()
local dap = require("dap")
if dap.status() == "" then
vim.cmd "RustLsp debuggables"
else
dap.continue()
end
end,
opts
)
''}
end
},
''}
${optionalString cfg.dap.enable ''
dap = {
adapter = {
type = "executable",
command = "${cfg.dap.package}/bin/lldb-vscode",
name = "rustacean_lldb",
}, },
},
''} ${optionalString cfg.dap.enable ''
} dap = {
''; adapter = {
type = "executable",
command = "${cfg.dap.package}/bin/lldb-vscode",
name = "rt_lldb",
},
},
''}
}
rt.setup(rustopts)
'';
};
}; };
}) })
]); ]);

View File

@ -192,7 +192,7 @@ in {
(mkIf cfg.extensions."ts-error-translator".enable { (mkIf cfg.extensions."ts-error-translator".enable {
vim.startPlugins = ["ts-error-translator"]; vim.startPlugins = ["ts-error-translator"];
vim.pluginRC.ts-error-translator = entryAnywhere '' vim.luaConfigRC.ts-error-translator = entryAnywhere ''
require("ts-error-translator").setup(${toLuaObject cfg.extensions.ts-error-translator.setupOpts}) require("ts-error-translator").setup(${toLuaObject cfg.extensions.ts-error-translator.setupOpts})
''; '';
}) })

View File

@ -27,7 +27,7 @@ in {
autocomplete.sources = {"nvim_lsp" = "[LSP]";}; autocomplete.sources = {"nvim_lsp" = "[LSP]";};
pluginRC.lsp-setup = '' luaConfigRC.lsp-setup = ''
vim.g.formatsave = ${boolToString cfg.formatOnSave}; vim.g.formatsave = ${boolToString cfg.formatOnSave};
local attach_keymaps = function(client, bufnr) local attach_keymaps = function(client, bufnr)

View File

@ -12,7 +12,7 @@ in {
vim = { vim = {
startPlugins = ["nvim-lightbulb"]; startPlugins = ["nvim-lightbulb"];
pluginRC.lightbulb = entryAnywhere '' luaConfigRC.lightbulb = entryAnywhere ''
vim.api.nvim_command('autocmd CursorHold,CursorHoldI * lua require\'nvim-lightbulb\'.update_lightbulb()') vim.api.nvim_command('autocmd CursorHold,CursorHoldI * lua require\'nvim-lightbulb\'.update_lightbulb()')
-- Enable trouble diagnostics viewer -- Enable trouble diagnostics viewer

View File

@ -20,7 +20,7 @@ in {
handler_opts.border = config.vim.ui.borders.plugins.lsp-signature.style; handler_opts.border = config.vim.ui.borders.plugins.lsp-signature.style;
}; };
pluginRC.lsp-signature = entryAnywhere '' luaConfigRC.lsp-signature = entryAnywhere ''
-- Enable lsp signature viewer -- Enable lsp signature viewer
require("lsp_signature").setup(${toLuaObject cfg.lspSignature.setupOpts}) require("lsp_signature").setup(${toLuaObject cfg.lspSignature.setupOpts})
''; '';

View File

@ -17,7 +17,7 @@ in {
startPlugins = ["nvim-lspconfig"]; startPlugins = ["nvim-lspconfig"];
pluginRC.lspconfig = entryAfter ["lsp-setup"] '' luaConfigRC.lspconfig = entryAfter ["lsp-setup"] ''
local lspconfig = require('lspconfig') local lspconfig = require('lspconfig')
${ ${
@ -29,7 +29,7 @@ in {
}; };
} }
{ {
vim.pluginRC = mapAttrs (_: v: (entryAfter ["lspconfig"] v)) cfg.lspconfig.sources; vim.luaConfigRC = mapAttrs (_: v: (entryAfter ["lspconfig"] v)) cfg.lspconfig.sources;
} }
]); ]);
} }

View File

@ -10,7 +10,7 @@
in { in {
config = mkIf (cfg.enable && cfg.lspkind.enable) { config = mkIf (cfg.enable && cfg.lspkind.enable) {
vim.startPlugins = ["lspkind"]; vim.startPlugins = ["lspkind"];
vim.pluginRC.lspkind = entryAnywhere '' vim.luaConfigRC.lspkind = entryAnywhere ''
local lspkind = require'lspkind' local lspkind = require'lspkind'
local lspkind_opts = { local lspkind_opts = {
mode = '${cfg.lspkind.mode}' mode = '${cfg.lspkind.mode}'

View File

@ -10,7 +10,7 @@
in { in {
config = mkIf (cfg.enable && cfg.lsplines.enable) { config = mkIf (cfg.enable && cfg.lsplines.enable) {
vim.startPlugins = ["lsp-lines"]; vim.startPlugins = ["lsp-lines"];
vim.pluginRC.lsplines = entryAfter ["lspconfig"] '' vim.luaConfigRC.lsplines = entryAfter ["lspconfig"] ''
require("lsp_lines").setup() require("lsp_lines").setup()
vim.diagnostic.config({ vim.diagnostic.config({

View File

@ -41,7 +41,7 @@ in {
]; ];
}; };
pluginRC.lspsaga = entryAnywhere '' luaConfigRC.lspsaga = entryAnywhere ''
require('lspsaga').init_lsp_saga({ require('lspsaga').init_lsp_saga({
${optionalString config.vim.ui.borders.plugins.lspsaga.enable '' ${optionalString config.vim.ui.borders.plugins.lspsaga.enable ''
border_style = '${config.vim.ui.borders.plugins.lspsaga.style}', border_style = '${config.vim.ui.borders.plugins.lspsaga.style}',

View File

@ -22,7 +22,7 @@ in {
# since it will hook into LSPs to receive information # since it will hook into LSPs to receive information
lsp.enable = true; lsp.enable = true;
pluginRC = { luaConfigRC = {
# early setup for null-ls # early setup for null-ls
null_ls-setup = entryAnywhere '' null_ls-setup = entryAnywhere ''
local null_ls = require("null-ls") local null_ls = require("null-ls")
@ -46,7 +46,7 @@ in {
}; };
} }
{ {
vim.pluginRC = mapAttrs (_: v: (entryBetween ["null_ls"] ["null_ls-setup"] v)) cfg.null-ls.sources; vim.luaConfigRC = mapAttrs (_: v: (entryBetween ["null_ls"] ["null_ls-setup"] v)) cfg.null-ls.sources;
} }
]); ]);
} }

View File

@ -23,7 +23,7 @@ in {
"<leader>c" = "+CodeAction"; "<leader>c" = "+CodeAction";
}; };
pluginRC.code-action-menu = entryAnywhere '' luaConfigRC.code-action-menu = entryAnywhere ''
-- border configuration -- border configuration
vim.g.code_action_menu_window_border = '${config.vim.ui.borders.plugins.code-action-menu.style}' vim.g.code_action_menu_window_border = '${config.vim.ui.borders.plugins.code-action-menu.style}'

View File

@ -19,7 +19,7 @@ in {
lsp.enable = true; lsp.enable = true;
startPlugins = ["nvim-docs-view"]; startPlugins = ["nvim-docs-view"];
pluginRC.nvim-docs-view = entryAnywhere '' luaConfigRC.nvim-docs-view = entryAnywhere ''
require("docs-view").setup ${toLuaObject cfg.setupOpts} require("docs-view").setup ${toLuaObject cfg.setupOpts}
''; '';

View File

@ -32,7 +32,7 @@ in {
"<leader>lw" = "Workspace"; "<leader>lw" = "Workspace";
}; };
pluginRC.trouble = entryAnywhere '' luaConfigRC.trouble = entryAnywhere ''
-- Enable trouble diagnostics viewer -- Enable trouble diagnostics viewer
require("trouble").setup {} require("trouble").setup {}
''; '';

View File

@ -31,7 +31,7 @@ in {
"<leader>m" = "+Minimap"; "<leader>m" = "+Minimap";
}; };
pluginRC.codewindow = entryAnywhere '' luaConfigRC.codewindow = entryAnywhere ''
local codewindow = require('codewindow') local codewindow = require('codewindow')
codewindow.setup({ codewindow.setup({
exclude_filetypes = { 'NvimTree', 'orgagenda', 'Alpha'}, exclude_filetypes = { 'NvimTree', 'orgagenda', 'Alpha'},

View File

@ -25,7 +25,7 @@ in {
"<leader>o" = "+Notes"; "<leader>o" = "+Notes";
}; };
pluginRC.mind-nvim = entryAnywhere '' luaConfigRC.mind-nvim = entryAnywhere ''
require'mind'.setup() require'mind'.setup()
''; '';
}; };

View File

@ -22,7 +22,7 @@ in {
"<leader>o" = "+Notes"; "<leader>o" = "+Notes";
}; };
pluginRC.obsidian = entryAnywhere '' luaConfigRC.obsidian = entryAnywhere ''
require("obsidian").setup(${toLuaObject cfg.setupOpts}) require("obsidian").setup(${toLuaObject cfg.setupOpts})
''; '';
}; };

View File

@ -21,7 +21,7 @@ in {
"<leader>o" = "+Notes"; "<leader>o" = "+Notes";
}; };
pluginRC.orgmode = entryAnywhere '' luaConfigRC.orgmode = entryAnywhere ''
-- Treesitter configuration -- Treesitter configuration
require('nvim-treesitter.configs').setup { require('nvim-treesitter.configs').setup {

View File

@ -24,7 +24,7 @@ in {
(mkIf config.vim.lsp.trouble.enable (mkBinding cfg.mappings.trouble ":TodoTrouble<CR>" mappings.trouble.description)) (mkIf config.vim.lsp.trouble.enable (mkBinding cfg.mappings.trouble ":TodoTrouble<CR>" mappings.trouble.description))
]; ];
pluginRC.todo-comments = '' luaConfigRC.todo-comments = ''
require('todo-comments').setup(${toLuaObject cfg.setupOpts}) require('todo-comments').setup(${toLuaObject cfg.setupOpts})
''; '';
}; };

View File

@ -14,7 +14,7 @@ in {
"project-nvim" "project-nvim"
]; ];
vim.pluginRC.project-nvim = entryAnywhere '' vim.luaConfigRC.project-nvim = entryAnywhere ''
require('project_nvim').setup(${toLuaObject cfg.setupOpts}) require('project_nvim').setup(${toLuaObject cfg.setupOpts})
''; '';
}; };

View File

@ -12,7 +12,7 @@ in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim.startPlugins = ["neocord"]; vim.startPlugins = ["neocord"];
vim.pluginRC.neocord = entryAnywhere '' vim.luaConfigRC.neocord = entryAnywhere ''
-- Description of each option can be found in https://github.com/IogaMaster/neocord#lua -- Description of each option can be found in https://github.com/IogaMaster/neocord#lua
require("neocord").setup(${toLuaObject cfg.setupOpts}) require("neocord").setup(${toLuaObject cfg.setupOpts})
''; '';

View File

@ -28,7 +28,7 @@ in {
# TODO: load_current_dir_session # TODO: load_current_dir_session
]; ];
pluginRC.nvim-session-manager = entryAnywhere '' luaConfigRC.nvim-session-manager = entryAnywhere ''
local Path = require('plenary.path') local Path = require('plenary.path')
local sm = require('session_manager.config') local sm = require('session_manager.config')
require('session_manager').setup(${toLuaObject cfg.setupOpts}) require('session_manager').setup(${toLuaObject cfg.setupOpts})

View File

@ -14,7 +14,7 @@ in {
# vim-dirtytalk doesn't have any setup # vim-dirtytalk doesn't have any setup
# but we would like to append programming to spelllang # but we would like to append programming to spelllang
# as soon as possible while the plugin is enabled # as soon as possible while the plugin is enabled
pluginRC.vim-dirtytalk = entryAfter ["basic"] '' luaConfigRC.vim-dirtytalk = entryAfter ["basic"] ''
-- append programming to spelllang -- append programming to spelllang
vim.opt.spelllang:append("programming") vim.opt.spelllang:append("programming")
''; '';

View File

@ -35,7 +35,7 @@ in {
vim = { vim = {
startPlugins = ["lualine"]; startPlugins = ["lualine"];
pluginRC.lualine = entryAnywhere '' luaConfigRC.lualine = entryAnywhere ''
local lualine = require('lualine') local lualine = require('lualine')
lualine.setup ${toLuaObject cfg.setupOpts} lualine.setup ${toLuaObject cfg.setupOpts}
''; '';

View File

@ -39,7 +39,7 @@ in {
"<leader>bsi" = "BufferLineSortById"; "<leader>bsi" = "BufferLineSortById";
}; };
pluginRC.nvimBufferline = entryAnywhere '' luaConfigRC.nvimBufferline = entryAnywhere ''
require("bufferline").setup(${toLuaObject cfg.setupOpts}) require("bufferline").setup(${toLuaObject cfg.setupOpts})
''; '';
}; };

View File

@ -23,7 +23,7 @@ in {
maps.normal = mkBinding cfg.mappings.open "<Cmd>execute v:count . \"ToggleTerm\"<CR>" "Toggle terminal"; maps.normal = mkBinding cfg.mappings.open "<Cmd>execute v:count . \"ToggleTerm\"<CR>" "Toggle terminal";
pluginRC.toggleterm = entryAnywhere '' luaConfigRC.toggleterm = entryAnywhere ''
require("toggleterm").setup(${toLuaObject cfg.setupOpts}) require("toggleterm").setup(${toLuaObject cfg.setupOpts})
''; '';
}; };
@ -35,7 +35,7 @@ in {
vim.startPlugins = optionals (cfg.lazygit.package != null) [ vim.startPlugins = optionals (cfg.lazygit.package != null) [
cfg.lazygit.package cfg.lazygit.package
]; ];
vim.pluginRC.toggleterm-lazygit = entryAfter ["toggleterm"] '' vim.luaConfigRC.toggleterm-lazygit = entryAfter ["toggleterm"] ''
local terminal = require 'toggleterm.terminal' local terminal = require 'toggleterm.terminal'
local lazygit = terminal.Terminal:new({ local lazygit = terminal.Terminal:new({
cmd = '${ cmd = '${

View File

@ -7,10 +7,10 @@
inherit (lib.attrsets) attrNames; inherit (lib.attrsets) attrNames;
inherit (lib.types) bool lines enum; inherit (lib.types) bool lines enum;
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.dag) entryBefore;
cfg = config.vim.theme; cfg = config.vim.theme;
supportedThemes = import ./supported-themes.nix { supported_themes = import ./supported_themes.nix {
inherit lib config; inherit lib config;
}; };
in { in {
@ -21,12 +21,12 @@ in {
}; };
name = mkOption { name = mkOption {
type = enum (attrNames supportedThemes); type = enum (attrNames supported_themes);
description = "Supported themes can be found in `supportedThemes.nix`"; description = "Supported themes can be found in `supported_themes.nix`";
}; };
style = mkOption { style = mkOption {
type = enum supportedThemes.${cfg.name}.styles; type = enum supported_themes.${cfg.name}.styles;
description = "Specific style for theme if it supports it"; description = "Specific style for theme if it supports it";
}; };
@ -45,9 +45,11 @@ in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim = { vim = {
startPlugins = [cfg.name]; startPlugins = [cfg.name];
luaConfigRC.theme = entryAfter ["basic"] '' configRC.theme = entryBefore ["luaScript"] ''
lua << EOF
${cfg.extraConfig} ${cfg.extraConfig}
${supportedThemes.${cfg.name}.setup {inherit (cfg) style transparent;}} ${supported_themes.${cfg.name}.setup (with cfg; {inherit style transparent;})}
EOF
''; '';
}; };
}; };

View File

@ -37,18 +37,18 @@ in {
}; };
# For some reason treesitter highlighting does not work on start if this is set before syntax on # For some reason treesitter highlighting does not work on start if this is set before syntax on
pluginRC.treesitter-fold = mkIf cfg.fold (entryBefore ["basic"] '' configRC.treesitter-fold = mkIf cfg.fold (entryBefore ["basic"] ''
-- This is required by treesitter-context to handle folds " This is required by treesitter-context to handle folds
vim.o.foldmethod = "expr" set foldmethod=expr
vim.o.foldexpr = "nvim_treesitter#foldexpr()" set foldexpr=nvim_treesitter#foldexpr()
-- This is optional, but is set rather as a sane default. " This is optional, but is set rather as a sane default.
-- If unset, opened files will be folded by automatically as " If unset, opened files will be folded by automatically as
-- the files are opened " the files are opened
vim.o.foldenable = false set nofoldenable
''); '');
pluginRC.treesitter = entryAfter ["basic"] '' luaConfigRC.treesitter = entryAfter ["basic"] ''
require('nvim-treesitter.configs').setup { require('nvim-treesitter.configs').setup {
-- Disable imperative treesitter options that would attempt to fetch -- Disable imperative treesitter options that would attempt to fetch
-- grammars into the read-only Nix store. To add additional grammars here -- grammars into the read-only Nix store. To add additional grammars here

View File

@ -16,7 +16,7 @@ in {
# set up treesitter-context after Treesitter. The ordering # set up treesitter-context after Treesitter. The ordering
# should not matter, but there is no harm in doing this # should not matter, but there is no harm in doing this
pluginRC.treesitter-context = entryAfter ["treesitter"] '' luaConfigRC.treesitter-context = entryAfter ["treesitter"] ''
require("treesitter-context").setup(${toLuaObject cfg.setupOpts}) require("treesitter-context").setup(${toLuaObject cfg.setupOpts})
''; '';
}; };

View File

@ -78,7 +78,7 @@ in {
}; };
}; };
vim.pluginRC.breadcrumbs = entryAfter ["lspconfig"] '' vim.luaConfigRC.breadcrumbs = entryAfter ["lspconfig"] ''
${optionalString (cfg.source == "nvim-navic") '' ${optionalString (cfg.source == "nvim-navic") ''
local navic = require("nvim-navic") local navic = require("nvim-navic")

View File

@ -14,7 +14,7 @@ in {
"nvim-colorizer-lua" "nvim-colorizer-lua"
]; ];
vim.pluginRC.colorizer = entryAnywhere '' vim.luaConfigRC.colorizer = entryAnywhere ''
require('colorizer').setup(${toLuaObject cfg.setupOpts}) require('colorizer').setup(${toLuaObject cfg.setupOpts})
''; '';
}; };

View File

@ -11,7 +11,7 @@ in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim.startPlugins = ["vim-illuminate"]; vim.startPlugins = ["vim-illuminate"];
vim.pluginRC.vim-illuminate = entryAnywhere '' vim.luaConfigRC.vim-illuminate = entryAnywhere ''
require('illuminate').configure({ require('illuminate').configure({
filetypes_denylist = { filetypes_denylist = {
'dirvish', 'dirvish',

View File

@ -14,7 +14,7 @@ in {
"modes-nvim" "modes-nvim"
]; ];
vim.pluginRC.modes-nvim = entryAnywhere '' vim.luaConfigRC.modes-nvim = entryAnywhere ''
require('modes').setup(${toLuaObject cfg.setupOpts}) require('modes').setup(${toLuaObject cfg.setupOpts})
''; '';
}; };

View File

@ -23,7 +23,7 @@ in {
treesitter.grammars = optionals tscfg.addDefaultGrammars defaultGrammars; treesitter.grammars = optionals tscfg.addDefaultGrammars defaultGrammars;
pluginRC.noice-nvim = entryAnywhere '' luaConfigRC.noice-nvim = entryAnywhere ''
require("noice").setup(${toLuaObject cfg.setupOpts}) require("noice").setup(${toLuaObject cfg.setupOpts})
''; '';
}; };

View File

@ -13,7 +13,7 @@ in {
vim = { vim = {
startPlugins = ["nvim-notify"]; startPlugins = ["nvim-notify"];
pluginRC.nvim-notify = entryAnywhere '' luaConfigRC.nvim-notify = entryAnywhere ''
require('notify').setup(${toLuaObject cfg.setupOpts}) require('notify').setup(${toLuaObject cfg.setupOpts})
-- required to fix offset_encoding errors -- required to fix offset_encoding errors

View File

@ -13,7 +13,7 @@ in {
vim = { vim = {
startPlugins = ["smartcolumn"]; startPlugins = ["smartcolumn"];
pluginRC.smartcolumn = entryAnywhere '' luaConfigRC.smartcolumn = entryAnywhere ''
require("smartcolumn").setup(${toLuaObject cfg.setupOpts}) require("smartcolumn").setup(${toLuaObject cfg.setupOpts})
''; '';
}; };

View File

@ -11,7 +11,7 @@ in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim.startPlugins = ["cheatsheet-nvim"]; vim.startPlugins = ["cheatsheet-nvim"];
vim.pluginRC.cheaetsheet-nvim = entryAnywhere '' vim.luaConfigRC.cheaetsheet-nvim = entryAnywhere ''
require('cheatsheet').setup({}) require('cheatsheet').setup({})
''; '';
}; };

View File

@ -13,7 +13,7 @@ in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim.startPlugins = ["which-key"]; vim.startPlugins = ["which-key"];
vim.pluginRC.whichkey = entryAnywhere '' vim.luaConfigRC.whichkey = entryAnywhere ''
local wk = require("which-key") local wk = require("which-key")
wk.setup ({ wk.setup ({
key_labels = { key_labels = {

View File

@ -13,7 +13,7 @@ in {
"ccc" "ccc"
]; ];
vim.pluginRC.ccc = entryAnywhere '' vim.luaConfigRC.ccc = entryAnywhere ''
local ccc = require("ccc") local ccc = require("ccc")
ccc.setup { ccc.setup {
highlighter = { highlighter = {

View File

@ -25,7 +25,7 @@ in {
}) })
]; ];
vim.pluginRC.gesture-nvim = entryAnywhere '' vim.luaConfigRC.gesture-nvim = entryAnywhere ''
vim.opt.mouse = "a" vim.opt.mouse = "a"
local gesture = require("gesture") local gesture = require("gesture")

View File

@ -14,7 +14,7 @@ in {
"dressing-nvim" "dressing-nvim"
]; ];
vim.pluginRC.icon-picker = entryAnywhere '' vim.luaConfigRC.icon-picker = entryAnywhere ''
require("icon-picker").setup({ require("icon-picker").setup({
disable_legacy_commands = true disable_legacy_commands = true
}) })

View File

@ -19,7 +19,7 @@ in {
"magick" "magick"
]; ];
pluginRC.image-nvim = entryAnywhere '' luaConfigRC.image-nvim = entryAnywhere ''
require("image").setup( require("image").setup(
${toLuaObject cfg.setupOpts} ${toLuaObject cfg.setupOpts}
) )

View File

@ -19,7 +19,7 @@ in {
vim.maps.normal = mkSetBinding mappings.hop "<cmd> HopPattern<CR>"; vim.maps.normal = mkSetBinding mappings.hop "<cmd> HopPattern<CR>";
vim.pluginRC.hop-nvim = entryAnywhere '' vim.luaConfigRC.hop-nvim = entryAnywhere ''
require('hop').setup() require('hop').setup()
''; '';
}; };

View File

@ -37,7 +37,7 @@ in {
(mkBinding cfg.mappings.leapFromWindow "<Plug>(leap-from-window)" "Leap from window") (mkBinding cfg.mappings.leapFromWindow "<Plug>(leap-from-window)" "Leap from window")
]; ];
vim.pluginRC.leap-nvim = entryAnywhere '' vim.luaConfigRC.leap-nvim = entryAnywhere ''
require('leap').opts = { require('leap').opts = {
max_phase_one_targets = nil, max_phase_one_targets = nil,
highlight_unlabeled_phase_one_targets = false, highlight_unlabeled_phase_one_targets = false,

View File

@ -25,7 +25,7 @@ in {
"<leader>pm" = "+Preview Markdown"; "<leader>pm" = "+Preview Markdown";
}; };
vim.pluginRC.glow = entryAnywhere '' vim.luaConfigRC.glow = entryAnywhere ''
require('glow').setup({ require('glow').setup({
glow_path = "${pkgs.glow}/bin/glow" glow_path = "${pkgs.glow}/bin/glow"
}); });

View File

@ -4,23 +4,25 @@
lib, lib,
... ...
}: let }: let
inherit (lib.strings) stringLength concatMapStringsSep; inherit (lib.strings) optionalString stringLength concatMapStringsSep;
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.nvim.vim) mkVimBool;
inherit (lib.nvim.dag) entryAnywhere;
cfg = config.vim.utility.preview.markdownPreview; cfg = config.vim.utility.preview.markdownPreview;
in { in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim.startPlugins = [pkgs.vimPlugins.markdown-preview-nvim]; vim.startPlugins = [pkgs.vimPlugins.markdown-preview-nvim];
vim.globals = { vim.configRC.markdown-preview = entryAnywhere ''
mkdp_auto_start = cfg.autoStart; let g:mkdp_auto_start = ${mkVimBool cfg.autoStart}
mkdp_auto_close = cfg.autoClose; let g:mkdp_auto_close = ${mkVimBool cfg.autoClose}
mkdp_refresh_slow = cfg.lazyRefresh; let g:mkdp_refresh_slow = ${mkVimBool cfg.lazyRefresh}
mkdp_filetypes = [(concatMapStringsSep ", " (x: "'" + x + "'") cfg.filetypes)]; let g:mkdp_filetypes = [${concatMapStringsSep ", " (x: "'" + x + "'") cfg.filetypes}]
mkdp_command_for_global = cfg.alwaysAllowPreview; let g:mkdp_command_for_global = ${mkVimBool cfg.alwaysAllowPreview}
mkdp_open_to_the_world = cfg.broadcastServer; let g:mkdp_open_to_the_world = ${mkVimBool cfg.broadcastServer}
mkdp_open_ip = mkIf (stringLength cfg.customIP > 0) cfg.customIP; ${optionalString (stringLength cfg.customIP > 0) "let g:mkdp_open_ip = '${cfg.customIP}'"}
mkdp_port = mkIf (stringLength cfg.customPort > 0) cfg.customPort; ${optionalString (stringLength cfg.customPort > 0) "let g:mkdp_port = '${cfg.customPort}'"}
}; '';
}; };
} }

View File

@ -18,7 +18,7 @@ in {
"nvim-surround" "nvim-surround"
]; ];
pluginRC.surround = entryAnywhere '' luaConfigRC.surround = entryAnywhere ''
require('nvim-surround').setup() require('nvim-surround').setup()
''; '';

View File

@ -65,7 +65,7 @@ in {
"<leader>fvc" = "Commits"; "<leader>fvc" = "Commits";
}; };
vim.pluginRC.telescope = entryAnywhere '' vim.luaConfigRC.telescope = entryAnywhere ''
local telescope = require('telescope') local telescope = require('telescope')
telescope.setup(${toLuaObject cfg.setupOpts}) telescope.setup(${toLuaObject cfg.setupOpts})

View File

@ -5,14 +5,21 @@
... ...
}: let }: let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.nvim.dag) entryAnywhere;
cfg = config.vim.utility.vim-wakatime; cfg = config.vim.utility.vim-wakatime;
in { in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim.startPlugins = [pkgs.vimPlugins.vim-wakatime]; vim.startPlugins = [
pkgs.vimPlugins.vim-wakatime
];
vim.pluginRC.vim-wakatime = mkIf (cfg.cli-package != null) '' vim.configRC.vim-wakatime = entryAnywhere ''
vim.g.wakatime_CLIPath = "${cfg.cli-package}" ${
if cfg.cli-package == null
then ""
else ''let g:wakatime_CLIPath = "${cfg.cli-package}"''
}
''; '';
}; };
} }

View File

@ -14,14 +14,14 @@ in {
config = mkIf cfg.enable (mkMerge [ config = mkIf cfg.enable (mkMerge [
(mkIf cfg.indentBlankline.enable { (mkIf cfg.indentBlankline.enable {
vim.startPlugins = ["indent-blankline"]; vim.startPlugins = ["indent-blankline"];
vim.pluginRC.indent-blankline = entryAnywhere '' vim.luaConfigRC.indent-blankline = entryAnywhere ''
require("ibl").setup(${toLuaObject cfg.indentBlankline.setupOpts}) require("ibl").setup(${toLuaObject cfg.indentBlankline.setupOpts})
''; '';
}) })
(mkIf cfg.cursorline.enable { (mkIf cfg.cursorline.enable {
vim.startPlugins = ["nvim-cursorline"]; vim.startPlugins = ["nvim-cursorline"];
vim.pluginRC.cursorline = entryAnywhere '' vim.luaConfigRC.cursorline = entryAnywhere ''
require('nvim-cursorline').setup { require('nvim-cursorline').setup {
cursorline = { cursorline = {
timeout = ${toString cfg.cursorline.lineTimeout}, timeout = ${toString cfg.cursorline.lineTimeout},
@ -37,7 +37,7 @@ in {
(mkIf cfg.scrollBar.enable { (mkIf cfg.scrollBar.enable {
vim.startPlugins = ["scrollbar-nvim"]; vim.startPlugins = ["scrollbar-nvim"];
vim.pluginRC.scrollBar = entryAnywhere '' vim.luaConfigRC.scrollBar = entryAnywhere ''
require('scrollbar').setup{ require('scrollbar').setup{
excluded_filetypes = { excluded_filetypes = {
'prompt', 'prompt',
@ -56,7 +56,7 @@ in {
(mkIf cfg.smoothScroll.enable { (mkIf cfg.smoothScroll.enable {
vim.startPlugins = ["cinnamon-nvim"]; vim.startPlugins = ["cinnamon-nvim"];
vim.pluginRC.smoothScroll = entryAnywhere '' vim.luaConfigRC.smoothScroll = entryAnywhere ''
require('cinnamon').setup() require('cinnamon').setup()
''; '';
}) })
@ -66,7 +66,7 @@ in {
vim.maps.normal = mkBinding cfg.cellularAutomaton.mappings.makeItRain "<cmd>CellularAutomaton make_it_rain<CR>" "Make it rain"; vim.maps.normal = mkBinding cfg.cellularAutomaton.mappings.makeItRain "<cmd>CellularAutomaton make_it_rain<CR>" "Make it rain";
vim.pluginRC.cellularAUtomaton = entryAnywhere '' vim.luaConfigRC.cellularAUtomaton = entryAnywhere ''
local config = { local config = {
fps = 50, fps = 50,
name = 'slide', name = 'slide',
@ -94,7 +94,7 @@ in {
(mkIf cfg.highlight-undo.enable { (mkIf cfg.highlight-undo.enable {
vim.startPlugins = ["highlight-undo"]; vim.startPlugins = ["highlight-undo"];
vim.pluginRC.highlight-undo = entryAnywhere '' vim.luaConfigRC.highlight-undo = entryAnywhere ''
require('highlight-undo').setup({ require('highlight-undo').setup({
duration = ${toString cfg.highlight-undo.duration}, duration = ${toString cfg.highlight-undo.duration},
highlight_for_count = ${boolToString cfg.highlight-undo.highlightForCount}, highlight_for_count = ${boolToString cfg.highlight-undo.highlightForCount},

View File

@ -12,7 +12,7 @@ in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim.startPlugins = ["fidget-nvim"]; vim.startPlugins = ["fidget-nvim"];
vim.pluginRC.fidget-nvim = entryAnywhere '' vim.luaConfigRC.fidget-nvim = entryAnywhere ''
require'fidget'.setup(${toLuaObject cfg.setupOpts}) require'fidget'.setup(${toLuaObject cfg.setupOpts})
''; '';
}; };

View File

@ -3,16 +3,17 @@
lib, lib,
... ...
}: let }: let
inherit (builtins) map mapAttrs filter; inherit (builtins) map mapAttrs toJSON filter;
inherit (lib.options) mkOption; inherit (lib.options) mkOption;
inherit (lib.attrsets) filterAttrs getAttrs attrValues attrNames; inherit (lib.attrsets) filterAttrs getAttrs attrValues attrNames;
inherit (lib.strings) concatLines concatMapStringsSep; inherit (lib.strings) isString concatLines concatMapStringsSep;
inherit (lib.misc) mapAttrsFlatten; inherit (lib.misc) mapAttrsFlatten;
inherit (lib.trivial) showWarnings; inherit (lib.trivial) showWarnings;
inherit (lib.types) str nullOr; inherit (lib.types) str nullOr;
inherit (lib.generators) mkLuaInline; inherit (lib.generators) mkLuaInline;
inherit (lib.nvim.dag) entryAfter mkLuarcSection resolveDag entryAnywhere; inherit (lib.nvim.dag) entryAnywhere entryAfter topoSort mkLuarcSection mkVimrcSection;
inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.lua) toLuaObject wrapLuaConfig;
inherit (lib.nvim.vim) valToVim;
inherit (lib.nvim.config) mkBool; inherit (lib.nvim.config) mkBool;
cfg = config.vim; cfg = config.vim;
@ -81,23 +82,11 @@
maps); maps);
in { in {
config = let config = let
filterNonNull = attrs: filterAttrs (_: value: value != null) attrs; filterNonNull = mappings: filterAttrs (_name: value: value != null) mappings;
globalsScript = globalsScript =
mapAttrsFlatten (name: value: "vim.g.${name} = ${toLuaObject value}") mapAttrsFlatten (name: value: "let g:${name}=${valToVim value}")
(filterNonNull cfg.globals); (filterNonNull cfg.globals);
extraPluginConfigs = resolveDag {
name = "extra plugin configs";
dag = mapAttrs (_: value: entryAfter value.after value.setup) cfg.extraPlugins;
mapResult = result: concatLines (map mkLuarcSection result);
};
pluginConfigs = resolveDag {
name = "plugin configs";
dag = cfg.pluginRC;
mapResult = result: concatLines (map mkLuarcSection result);
};
toLuaBindings = mode: maps: toLuaBindings = mode: maps:
map (value: '' map (value: ''
vim.keymap.set(${toLuaObject mode}, ${toLuaObject value.key}, ${toLuaObject value.action}, ${toLuaObject value.config}) vim.keymap.set(${toLuaObject mode}, ${toLuaObject value.key}, ${toLuaObject value.action}, ${toLuaObject value.config})
@ -116,31 +105,96 @@ in {
omap = toLuaBindings "o" config.vim.maps.operator; omap = toLuaBindings "o" config.vim.maps.operator;
icmap = toLuaBindings "ic" config.vim.maps.insertCommand; icmap = toLuaBindings "ic" config.vim.maps.insertCommand;
maps = [ resolveDag = {
nmap name,
imap dag,
vmap mapResult,
xmap }: let
smap # When the value is a string, default it to dag.entryAnywhere
cmap finalDag = mapAttrs (_: value:
omap if isString value
tmap then entryAnywhere value
lmap else value)
icmap dag;
allmap sortedDag = topoSort finalDag;
]; result =
mappings = concatLines (map concatLines maps); if sortedDag ? result
then mapResult sortedDag.result
else abort ("Dependency cycle in ${name}: " + toJSON sortedDag);
in
result;
in { in {
vim = { vim = {
luaConfigRC = { configRC = {
globalsScript = entryAnywhere (concatLines globalsScript); globalsScript = entryAnywhere (concatLines globalsScript);
# basic, theme
pluginConfigs = entryAfter ["theme"] pluginConfigs; # Call additional lua files with :luafile in Vimscript
extraPluginConfigs = entryAfter ["pluginConfigs"] extraPluginConfigs; # section of the configuration, only after
mappings = entryAfter ["extraPluginConfigs"] mappings; # the luaScript section has been evaluated
extraLuaFiles = let
callLuaFiles = map (file: "luafile ${file}") cfg.extraLuaFiles;
in
entryAfter ["globalScript"] (concatLines callLuaFiles);
# wrap the lua config in a lua block
# using the wrapLuaConfic function from the lib
luaScript = let
mapResult = result: (wrapLuaConfig {
luaBefore = "${cfg.luaConfigPre}";
luaConfig = concatLines (map mkLuarcSection result);
luaAfter = "${cfg.luaConfigPost}";
});
luaConfig = resolveDag {
name = "lua config script";
dag = cfg.luaConfigRC;
inherit mapResult;
};
in
entryAnywhere luaConfig;
extraPluginConfigs = let
mapResult = result: (wrapLuaConfig {
luaConfig = concatLines (map mkLuarcSection result);
});
extraPluginsDag = mapAttrs (_: {
after,
setup,
...
}:
entryAfter after setup)
cfg.extraPlugins;
pluginConfig = resolveDag {
name = "extra plugins config";
dag = extraPluginsDag;
inherit mapResult;
};
in
entryAfter ["luaScript"] pluginConfig;
# This is probably not the right way to set the config. I'm not sure how it should look like.
mappings = let
maps = [
nmap
imap
vmap
xmap
smap
cmap
omap
tmap
lmap
icmap
allmap
];
mapConfig = wrapLuaConfig {luaConfig = concatLines (map concatLines maps);};
in
entryAfter ["globalsScript"] mapConfig;
}; };
builtLuaConfigRC = let builtConfigRC = let
# Catch assertions and warnings # Catch assertions and warnings
# and throw for each failed assertion. If no assertions are found, show warnings. # and throw for each failed assertion. If no assertions are found, show warnings.
failedAssertions = map (x: x.message) (filter (x: !x.assertion) config.assertions); failedAssertions = map (x: x.message) (filter (x: !x.assertion) config.assertions);
@ -149,18 +203,14 @@ in {
then throw "\nFailed assertions:\n${concatMapStringsSep "\n" (x: "- ${x}") failedAssertions}" then throw "\nFailed assertions:\n${concatMapStringsSep "\n" (x: "- ${x}") failedAssertions}"
else showWarnings config.warnings; else showWarnings config.warnings;
luaConfig = resolveDag { mapResult = result: concatMapStringsSep "\n" mkVimrcSection result;
name = "lua config script"; vimConfig = resolveDag {
dag = cfg.luaConfigRC; name = "vim config script";
mapResult = result: dag = cfg.configRC;
concatLines [ inherit mapResult;
cfg.luaConfigPre
(concatMapStringsSep "\n" mkLuarcSection result)
cfg.luaConfigPost
];
}; };
in in
baseSystemAssertWarn luaConfig; baseSystemAssertWarn vimConfig;
}; };
}; };
} }

View File

@ -3,25 +3,13 @@
lib, lib,
... ...
}: let }: let
inherit (lib.modules) mkRemovedOptionModule;
inherit (lib.options) mkOption mkEnableOption literalMD literalExpression; inherit (lib.options) mkOption mkEnableOption literalMD literalExpression;
inherit (lib.strings) optionalString; inherit (lib.strings) optionalString;
inherit (lib.types) str attrs lines listOf either path bool; inherit (lib.types) str oneOf attrs lines listOf either path bool;
inherit (lib.nvim.types) dagOf; inherit (lib.nvim.types) dagOf;
inherit (lib.nvim.lua) listToLuaTable; inherit (lib.nvim.lua) listToLuaTable;
cfg = config.vim; cfg = config.vim;
in { in {
imports = [
(mkRemovedOptionModule ["vim" "configRC"] ''
Please migrate your configRC sections to Neovim's Lua format, and
add them to luaConfigRC.
See the v0.7 release notes for more information on how to migrate
your existing configurations.
'')
];
options.vim = { options.vim = {
enableLuaLoader = mkEnableOption '' enableLuaLoader = mkEnableOption ''
the experimental Lua module loader to speed up the start up process the experimental Lua module loader to speed up the start up process
@ -132,20 +120,35 @@ in {
description = '' description = ''
An attribute set containing global variable values An attribute set containing global variable values
for storing vim variables as early as possible. If for storing vim variables as early as possible. If
populated, this option will set vim variables in the populated, this soption will set vim variables in the
built luaConfigRC as the first item. built configRC as the first item.
E.g. {foo = "bar"} will set `vim.g.foo` to "bar" where E.g. {foo = "bar"} will set `g:foo` to "bar" where
the type of `bar` in the resulting vimscript will be the type of `bar` in the resulting vimscript will be
infered from the type of the value in the `{name = value}` infered from the type of the value in the `{name = value}`
pair. pair.
''; '';
}; };
pluginRC = mkOption { configRC = mkOption {
type = either (dagOf lines) str; type = oneOf [(dagOf lines) str];
default = {}; default = {};
description = "The DAG used to configure plugins. If a string is passed, entryAnywhere is automatically applied."; description = ''
Contents of vimrc, either as a string or a DAG.
If this option is passed as a DAG, it will be resolved
according to the DAG resolution rules (e.g. entryBefore
or entryAfter) as per the **nvf** extended library.
'';
example = literalMD ''
```vim
" Set the tab size to 4 spaces
set tabstop=4
set shiftwidth=4
set expandtab
```
'';
}; };
luaConfigPre = mkOption { luaConfigPre = mkOption {
@ -208,7 +211,7 @@ in {
}; };
luaConfigRC = mkOption { luaConfigRC = mkOption {
type = either (dagOf lines) str; type = oneOf [(dagOf lines) str];
default = {}; default = {};
description = '' description = ''
Lua configuration, either as a string or a DAG. Lua configuration, either as a string or a DAG.
@ -242,10 +245,10 @@ in {
''; '';
}; };
builtLuaConfigRC = mkOption { builtConfigRC = mkOption {
internal = true; internal = true;
type = lines; type = lines;
description = "The built lua config for neovim after resolving the DAG"; description = "The built config for neovim after resolving the DAG";
}; };
}; };
} }