Compare commits

...

41 commits

Author SHA1 Message Date
Ching Pei Yang
8718d9c59a
mappings: impl keymap option 2024-10-02 01:45:41 +02:00
Ching Pei Yang
aff88b8379
mappings: add new keymap option 2024-10-02 01:45:03 +02:00
Ching Pei Yang
6670d752c7
fix: missing function (#388) 2024-09-29 14:35:11 +02:00
raf
5826aebdd3
Merge branch 'main' into v0.7 2024-09-29 00:23:56 +00:00
c727528b6f
CI: clean up stale branches periodically
Some checks failed
Set up binary cache / cachix (default) (push) Waiting to run
Set up binary cache / cachix (maximal) (push) Waiting to run
Set up binary cache / cachix (nix) (push) Waiting to run
Validate flake & check formatting / Validate Flake (push) Waiting to run
Validate flake & check formatting / Formatting via Alejandra (push) Waiting to run
Build and deploy documentation / Check latest commit (push) Waiting to run
Build and deploy documentation / publish (push) Blocked by required conditions
Validate flake & check documentation / Validate Flake Documentation (docs) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-html) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-json) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-manpages) (push) Has been cancelled
2024-09-28 23:44:22 +03:00
38fc01b9c6
docs: wording 2024-09-28 23:43:15 +03:00
raf
d6bbae1a91
docs: re-format README; clean up sections (#387)
* docs: re-format README; clean up sections

* docs: update README with features section
2024-09-28 23:36:07 +03:00
cef3aefabb
flake: add formatting check 2024-09-28 23:32:25 +03:00
Soliprem
69cd77630b
lsp/otter: init (#385)
* r: implementing lsp

* r: version bump to context fixes treesitter bug

* r: changing treesitter package definition to mkGrammarOption

* added changelog entry

* created otter file

* created otter file

* update

* update

* otter: fixing fixing input

* committing flake.lock

* fixed typo

* configuration: disabling ccc and enabling otter

* added assertion to make sure ccc and otter aren't enabled at the same time

* configuration: otter set for isMaximal

* otter: changelog

* otter: better changelog

* otter-nvim: renamed from otter to otter-nvim

* otter: added setupopts

---------

Co-authored-by: raf <raf@notashelf.dev>
2024-09-28 23:21:27 +03:00
bce45d4eeb
docs: add missing changelog entries
Some checks are pending
Set up binary cache / cachix (default) (push) Waiting to run
Set up binary cache / cachix (maximal) (push) Waiting to run
Set up binary cache / cachix (nix) (push) Waiting to run
Validate flake & check documentation / Validate Flake Documentation (docs) (push) Waiting to run
Validate flake & check documentation / Validate Flake Documentation (docs-html) (push) Waiting to run
Validate flake & check documentation / Validate Flake Documentation (docs-json) (push) Waiting to run
Validate flake & check documentation / Validate Flake Documentation (docs-manpages) (push) Waiting to run
Validate flake & check formatting / Validate Flake (push) Waiting to run
Validate flake & check formatting / Formatting via Alejandra (push) Waiting to run
Build and deploy documentation / Check latest commit (push) Waiting to run
Build and deploy documentation / publish (push) Blocked by required conditions
2024-09-28 22:27:20 +03:00
ccea1a6159
dashboard/dashboard-nvim: add setupOpts 2024-09-28 22:18:28 +03:00
raf
ab9a7c1600
modules/wrapper: add vim.options (#386)
* wrapper/rc: add `vim.options`

Translates an attribute set of values into `vim.o` values in a key-value format.

* docs: document addition of optionsScript

* wrapper/rc: don't filter null values in {options,global}Script

* wrapper/rc: add examples to vim.options & vim.globals; wording
2024-09-28 21:28:17 +03:00
Anthony
c957b23aaa
docs: fix dead links in CONTRIBUTING + put PR template in its appropriate location (#384) 2024-09-26 18:07:04 +03:00
raf
a6c879e8a3
Merge branch 'main' into v0.7 2024-09-26 14:44:26 +00:00
Gerg-L
b4c06c71dc
docs: fix declerations (#381)
Some checks failed
Set up binary cache / cachix (default) (push) Has been cancelled
Set up binary cache / cachix (maximal) (push) Has been cancelled
Set up binary cache / cachix (nix) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-html) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-json) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-manpages) (push) Has been cancelled
Validate flake & check formatting / Validate Flake (push) Has been cancelled
Validate flake & check formatting / Formatting via Alejandra (push) Has been cancelled
Build and deploy documentation / Check latest commit (push) Has been cancelled
Build and deploy documentation / publish (push) Has been cancelled
* docs: fix declerations

* fix: formatting for your baldness
2024-09-26 01:46:47 +03:00
a56a83bd46
flake: bump neo-tree 2024-09-26 00:29:52 +03:00
Soliprem
8e96f0aaa3
R: adding LSP (#378)
Some checks failed
Set up binary cache / cachix (default) (push) Has been cancelled
Set up binary cache / cachix (maximal) (push) Has been cancelled
Set up binary cache / cachix (nix) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-html) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-json) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-manpages) (push) Has been cancelled
Validate flake & check formatting / Validate Flake (push) Has been cancelled
Validate flake & check formatting / Formatting via Alejandra (push) Has been cancelled
Build and deploy documentation / Check latest commit (push) Has been cancelled
Build and deploy documentation / publish (push) Has been cancelled
* r: implementing lsp

* r: version bump to context fixes treesitter bug

* r: changing treesitter package definition to mkGrammarOption

* added changelog entry

* docs: wording

---------

Co-authored-by: raf <raf@notashelf.dev>
2024-09-24 12:00:31 +00:00
raf
141a272747
Merge branch 'main' into v0.7 2024-09-24 10:54:31 +00:00
316f25a0f6
docs: minor formatting changes
Some checks are pending
Set up binary cache / cachix (default) (push) Waiting to run
Set up binary cache / cachix (maximal) (push) Waiting to run
Set up binary cache / cachix (nix) (push) Waiting to run
Validate flake & check documentation / Validate Flake Documentation (docs) (push) Waiting to run
Validate flake & check documentation / Validate Flake Documentation (docs-html) (push) Waiting to run
Validate flake & check documentation / Validate Flake Documentation (docs-json) (push) Waiting to run
Validate flake & check documentation / Validate Flake Documentation (docs-manpages) (push) Waiting to run
Validate flake & check formatting / Validate Flake (push) Waiting to run
Validate flake & check formatting / Formatting via Alejandra (push) Waiting to run
Build and deploy documentation / Check latest commit (push) Waiting to run
Build and deploy documentation / publish (push) Blocked by required conditions
Gerg I swear to god...
2024-09-24 06:27:06 +03:00
raf
842b45b969
languages/ts: update lspconfig; rename tsserver to ts_ls (#379)
Silence lspconfig, Microsoft naming convention is speaking.
2024-09-24 06:20:56 +03:00
27b3524508
flake: bump nixpkgs 2024-09-24 06:07:44 +03:00
a85ac83182
flake: minor cleanup
- Get rid of Zig input (nixpkgs one is alright.)
- Minor typo fixes
2024-09-24 06:06:28 +03:00
Gerg-L
57be605ed4
lib.neovimConfiguration: deprecated extraModules and configuration (#377)
Some checks failed
Set up binary cache / cachix (default) (push) Has been cancelled
Set up binary cache / cachix (maximal) (push) Has been cancelled
Set up binary cache / cachix (nix) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-html) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-json) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-manpages) (push) Has been cancelled
Validate flake & check formatting / Validate Flake (push) Has been cancelled
Validate flake & check formatting / Formatting via Alejandra (push) Has been cancelled
Build and deploy documentation / Check latest commit (push) Has been cancelled
Build and deploy documentation / publish (push) Has been cancelled
* lib.neovimConfiguration: deprecated extraModules and configuration

* docs: various fixes
2024-09-22 22:52:10 +03:00
diniamo
99ace503ad
fastaction: add module (#376)
Some checks failed
Set up binary cache / cachix (default) (push) Has been cancelled
Set up binary cache / cachix (maximal) (push) Has been cancelled
Set up binary cache / cachix (nix) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-html) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-json) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-manpages) (push) Has been cancelled
Validate flake & check formatting / Validate Flake (push) Has been cancelled
Validate flake & check formatting / Formatting via Alejandra (push) Has been cancelled
Build and deploy documentation / publish (push) Has been cancelled
* plugins/lsp: add code-actions module; add fastaction.nvim

* deprecate nvimCodeActionMenu

* fastaction-nvim: move range_code_action to visual maps

* fastaction: move to vim.ui, remove mappings, enable register_ui_select by default

* fastaction: add missing documentation

* fastaction: support vim.ui.borders

* treewide: clean up nvim-code-action-menu remnants

* docs: add missing section ids

---------

Co-authored-by: NotAShelf <raf@notashelf.dev>
2024-09-20 18:51:11 +03:00
raf
e40d7a2a56
neovim/basic: add undofile options (#367)
Some checks are pending
Set up binary cache / cachix (default) (push) Waiting to run
Set up binary cache / cachix (maximal) (push) Waiting to run
Set up binary cache / cachix (nix) (push) Waiting to run
Validate flake & check formatting / Validate Flake (push) Waiting to run
Validate flake & check formatting / Formatting via Alejandra (push) Waiting to run
`vim.undoFile.enable` and `vim.undoFile.path` can be used to manipulate whether undofile will be enabled, and the location if it is enabled.
2024-09-19 22:07:25 +03:00
raf
cb7ff874e2
languages/python: add basedpyright & python-lsp-server (#372)
Some checks failed
Set up binary cache / cachix (default) (push) Has been cancelled
Set up binary cache / cachix (maximal) (push) Has been cancelled
Set up binary cache / cachix (nix) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-html) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-json) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-manpages) (push) Has been cancelled
Validate flake & check formatting / Validate Flake (push) Has been cancelled
Validate flake & check formatting / Formatting via Alejandra (push) Has been cancelled
Build and deploy documentation / publish (push) Has been cancelled
* languages/python: add basedpyright LSP

* languages/python: make basedpyright the default language server

* languages/python: add python-lsp-server

* docs: update 0.7 release notes
2024-09-16 13:28:33 +03:00
raf
eb037b7bff
ui/breadcrumbs: allow lualine winbar component to be disabled (#371)
Some checks failed
Set up binary cache / cachix (default) (push) Has been cancelled
Set up binary cache / cachix (maximal) (push) Has been cancelled
Set up binary cache / cachix (nix) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-html) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-json) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-manpages) (push) Has been cancelled
Validate flake & check formatting / Validate Flake (push) Has been cancelled
Validate flake & check formatting / Formatting via Alejandra (push) Has been cancelled
Build and deploy documentation / publish (push) Has been cancelled
2024-09-13 20:54:08 +03:00
TheSunCat
b9dcbec29c
docs: fix typo in custom-plugins.md (#373) 2024-09-13 20:01:33 +03:00
Ching Pei Yang
b499151527
treewide: standardize border type (#341)
* ui: allow custom listOf str border type

* lib: extract shared borderType

* remove TODO

* allow ["|" "HighlightGroup"] for border char

* docs: update rl notes

---------

Co-authored-by: raf <raf@notashelf.dev>
2024-09-13 19:34:21 +03:00
b347757f8a
flake: bump nixpkgs input
Some checks are pending
Set up binary cache / cachix (default) (push) Waiting to run
Set up binary cache / cachix (maximal) (push) Waiting to run
Set up binary cache / cachix (nix) (push) Waiting to run
Validate flake & check formatting / Validate Flake (push) Waiting to run
Validate flake & check formatting / Formatting via Alejandra (push) Waiting to run
Fixes #368
2024-09-13 12:07:46 +03:00
99de583e21
flake: bump mnw
Prioritize nvf's instance of neovim over pkgs.neovim
2024-09-13 11:59:53 +03:00
ppenguin
9eb6159ca3
Telescope: fix projects binding, add Telescope resume in default (#370)
Some checks failed
Set up binary cache / cachix (default) (push) Has been cancelled
Set up binary cache / cachix (maximal) (push) Has been cancelled
Set up binary cache / cachix (nix) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-html) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-json) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-manpages) (push) Has been cancelled
Validate flake & check formatting / Validate Flake (push) Has been cancelled
Validate flake & check formatting / Formatting via Alejandra (push) Has been cancelled
Build and deploy documentation / publish (push) Has been cancelled
* Telescope: fix projects binding, add Telescope resume in default

The projects command had a typo preventing it from working; the
keybinding description was the same as for Telescope files.
Added `<leader>fr` for Telescope resume per default.

* Add info to release notes
2024-09-08 15:44:42 +00:00
diniamo
67abc51902
treewide: remove the theme section from the DAG order dependance (#369)
Some checks failed
Set up binary cache / cachix (default) (push) Has been cancelled
Set up binary cache / cachix (maximal) (push) Has been cancelled
Set up binary cache / cachix (nix) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-html) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-json) (push) Has been cancelled
Validate flake & check documentation / Validate Flake Documentation (docs-manpages) (push) Has been cancelled
Validate flake & check formatting / Validate Flake (push) Has been cancelled
Validate flake & check formatting / Formatting via Alejandra (push) Has been cancelled
Build and deploy documentation / publish (push) Has been cancelled
* treewide: remove the theme section from the DAG order dependance

* docs/dag-entries: correct theme entry note
2024-09-05 18:06:24 +00:00
c757d28ff7
flake: update nixpkgs input
Some checks failed
Set up binary cache / cachix (default) (push) Has been cancelled
Set up binary cache / cachix (maximal) (push) Has been cancelled
Set up binary cache / cachix (nix) (push) Has been cancelled
Validate flake & check formatting / Validate Flake (push) Has been cancelled
Validate flake & check formatting / Formatting via Alejandra (push) Has been cancelled
2024-08-27 22:27:51 +03:00
Ching Pei Yang
e949a51c55
rust/clang: update lldb binary name (#365)
Some checks failed
Set up binary cache / cachix (default) (push) Has been cancelled
Set up binary cache / cachix (maximal) (push) Has been cancelled
Set up binary cache / cachix (nix) (push) Has been cancelled
Validate flake & check formatting / Validate Flake (push) Has been cancelled
Validate flake & check formatting / Formatting via Alejandra (push) Has been cancelled
2024-08-24 17:48:20 +00:00
Ching Pei Yang
941a2a6f2e
Merge branch 'main' into v0.7 2024-08-24 14:37:46 +02:00
Ching Pei Yang
473ebea4cf
theme: fix broken function signatures (#364)
Some checks are pending
Set up binary cache / cachix (default) (push) Waiting to run
Set up binary cache / cachix (maximal) (push) Waiting to run
Set up binary cache / cachix (nix) (push) Waiting to run
Validate flake & check formatting / Validate Flake (push) Waiting to run
Validate flake & check formatting / Formatting via Alejandra (push) Waiting to run
2024-08-24 12:12:20 +00:00
Ching Pei Yang
e40cce5653
fix: map descriptions (#358)
* remove unused

* maps: fix missing description
2024-08-17 13:08:47 +02:00
Ching Pei Yang
2fc7dc798b
Re-add old maps API (#356)
* wrapper: fix wrong import source

* wrapper: fix typo

* Revert "lib/binds: improve code, adjust functions to new api"

This reverts commit 6cb57e1d26.

* mappings: re-add legacy vim.maps API

* mappings: fix wrong submodule syntax

* docs: fix missing section id
2024-08-13 00:27:05 +02:00
raf
3ca7e3b841
Merge branch 'main' into v0.7 2024-08-12 00:10:03 +00:00
diniamo
b71bf75dcd
vim.maps rewrite (#352)
* feat: rewrite vim.maps

* modules/mappings: enable silent by default

* docs: add entry for vim.maps rewrite

* lib/binds: improve code, adjust functions to new api
2024-08-12 00:07:45 +00:00
59 changed files with 1319 additions and 963 deletions

View file

@ -16,7 +16,7 @@ If you have any questions regarding those files, feel free to open an issue or [
## Contributing ## Contributing
The contribution process is mostly documented in the [pull request template](.github/pull_request_template.md). You will find a checklist of items to complete before submitting a pull request. Please make sure you complete it before submitting a pull request. If you are unsure about any of the items, please ask. The contribution process is mostly documented in the [pull request template](pull_request_template.md). You will find a checklist of items to complete before submitting a pull request. Please make sure you complete it before submitting a pull request. If you are unsure about any of the items, please ask.
### Guidelines ### Guidelines

192
.github/README.md vendored
View file

@ -33,10 +33,9 @@
<div align="center"> <div align="center">
<a> <a>
A highly modular, configurable, extensible and easy to use Neovim configuration nvf is a highly modular, configurable, extensible and easy to use Neovim configuration
framework in Nix. Designed for flexibility and ease of use, this flake in Nix. Designed for flexibility and ease of use, nvf allows you to easily configure
allows you to easily configure your Neovim instance with a few lines of your fully featured Neovim instance with a few lines of Nix.
Nix code.
</a> </a>
</div> </div>
@ -44,6 +43,7 @@
<div align="center"><p> <div align="center"><p>
[Features]: #features
[Get Started]: #get-started [Get Started]: #get-started
[Documentation]: #documentation [Documentation]: #documentation
[Help]: #help [Help]: #help
@ -51,119 +51,150 @@
[FAQ]: #faq [FAQ]: #faq
[Credits]: #credits [Credits]: #credits
**[<kbd><br>Get Started<br></kbd>][Get Started]** **[<kbd><br>Features <br></kbd>][Features]**
**[<kbd><br>Documentation<br></kbd>][Documentation]** **[<kbd><br>Get Started<br></kbd>][Get Started]**
**[<kbd><br>Help<br></kbd>][Help]** **[<kbd><br>Documentation<br></kbd>][Documentation]**
**[<kbd><br>Contribute<br></kbd>][Contribute]** **[<kbd><br>Help<br></kbd>][Help]**
**[<kbd><br>FAQ<br></kbd>][Faq]** **[<kbd><br>Contribute<br></kbd>][Contribute]**
**[<kbd><br>Credits<br></kbd>][Credits]** **[<kbd><br>FAQ<br></kbd>][Faq]** **[<kbd><br>Credits<br></kbd>][Credits]**
</p></div> </p></div>
--- ---
## Features
- **Reproducible**: Your configuration will behave the same _anywhere_. No
surprises, promise!
- **Portable**: nvf depends _solely_ on your Nix store, and nothing else. No
more global binaries! Works on all platforms, without hassle.
- **Customizable**: There are _almost no defaults_ to annoy you. nvf is fully
customizable through the Nix module system.
- **Well-documented**: Documentation is priority. You will _never_ face
undocumented, obscure behaviour.
- **Idiomatic**: nvf does things ✨ _the right way_ ✨ - the codebase is, and
will, remain maintainable for myself and any contributors.
## Get Started ## Get Started
### Using `nix` CLI [nvf manual]: https://notashelf.github.io/nvf/
[issue tracker]: https://github.com/NotAShelf/nvf/issues
If you would like to try out the configuration before even thinking about If you are not sold on the concepts of **nvf**, and would like to try out the
installing it, you can run the following command default configuration before even _thinking about_ installing it, you may run
the following in order to take **nvf** out for a spin.
```console ```bash
# Run the default package
nix run github:notashelf/nvf nix run github:notashelf/nvf
``` ```
This will get you a feel for the base configuration and UI design. This will get you a feel for the base configuration and UI design. Though, none
The flake exposes `#nix` as the default package, providing minimal of the configuration options are final as **nvf** is designed to be modular and
language support and various utilities.You may also use `#nix`, configurable.
`#tidal` or `#maximal` to get try out different configurations.
It is as simple as changing the target output to get a different > [!TIP]
configuration. For example, to get a configuration with `tidal` support, run: > The flake exposes `#nix` as the default package, providing minimal language
> support and various utilities. You may also use the `#nix` or `#maximal`
> packages provided by the this flake to get try out different configurations.
```console It is as simple as changing the target output to get a different configuration.
nix run github:notashelf/nvf#tidal For example, to get a configuration with large language coverage, run:
```bash
# Run the maximal package
nix run github:notashelf/nvf#maximal
``` ```
Similar instructions will apply for `nix profile install`. However, you are Similar instructions will apply for `nix profile install`. However, you are
recommended to instead use the module system as described in the manual. recommended to instead use the module system as described in the manual.
> [!NOTE] > [!NOTE]
> The `maximal` configuration is _massive_ and will take a while to build. > The `maximal` configuration is quite large, and might take a while to build.
> To get a feel for the configuration, use the default `nix` or `tidal` > To get a feel for the configuration, use the default `nix` configuration.
> configurations. Should you choose to try out the `maximal` configuration, > Should you choose to try out the `maximal` configuration, using the binary
> using the binary cache as described in the manual is _strongly_ recommended. > cache as described in the manual is _strongly_ recommended.
If you are convinced, proceed to the next section to view the installation
instructions.
## Documentation ## Documentation
See the [**nvf** Manual](https://notashelf.github.io/nvf/) for The _recommended_ way of installing **nvf** is using either the NixOS or the
detailed installation guides, configurations, available options, release notes Home-Manager module, though it is completely possible and no less supported to
and more. Tips for installing userspace plugins is also contained in the install **nvf** as a standalone package, or a flake output.
documentation.
If you want to dive right into trying **nvf** you can get a fully See the [**nvf** manual] for detailed and up-to-date installation guides,
featured configuration with `nix` language support by running: configurations, available options, release notes and more. Tips for installing
userspace plugins is also contained in the documentation.
```console Please create an issue on the [issue tracker] if you find the documentation
nix run github:notashelf/nvf#nix lacking or confusing. Any improvements to the documentation through pull
``` requests are also welcome, and appreciated.
[Issues]: https://github.com/NotAShelf/nvf/issues
Please create an issue on the [issue tracker](issues) if you find
the documentation lacking or confusing. I also appreciate any contributions
to the documentation.
## Help ## Help
You can create an issue on the [issue tracker](issues) to ask questions You can create an issue on the [issue tracker] to ask questions or report bugs.
or report bugs. I am not yet on spaces like matrix or IRC, so please use the issue I am not yet on spaces like matrix or IRC, so please use the issue tracker for
tracker for now. now.
## Contributing ## Contributing
I am always looking for new ways to help improve this flake. If you would like I am always looking for new ways to help improve this flake. If you would like
to contribute, please read the [contributing guide](CONTRIBUTING.md) before to contribute, please read the [contributing guide](CONTRIBUTING.md) before
submitting a pull request. You can also create an issue on the submitting a pull request. You can also create an issue on the [issue tracker]
[issue tracker](issues) before submitting a pull request if you would before submitting a pull request if you would like to discuss a feature or bug
like to discuss a feature or bug fix. fix.
## FAQ ## FAQ
[appropriate issue template]: https://github.com/NotAShelf/nvf/issues/new/choose
[list of branches]: https://github.com/NotAShelf/nvf/branches
[list of open pull requests]: https://github.com/NotAShelf/nvf/pulls
**Q**: What platforms are supported?
<br/> **A**: nvf actively supports Linux and Darwin platforms using standalone
Nix, NixOS or Home-Manager. Please take a look at the
**Q**: Can you add _X_? **Q**: Can you add _X_?
<br/> <br/> **A**: Maybe! It is not one of our goals to support each and every Neovim
**A**: Maybe! It is not one of our goals to support each and every Neovim plugin, however, I am always open to new modules and plugin setup additions to
plugin, however, I am always open to new modules and plugin setup additions **nvf**. Use the [appropriate issue template] and I will consider a module
to **nvf**. Use the [appropritate issue template](issues/new/choose) and I will addition. As mentioned before, PRs adding new features are also welcome.
consider a module addition.
**Q**: A plugin I need is not available in **nvf**. What to do? **Q**: A plugin I need is not available in **nvf**. What to do?
<br/> <br/> **A**: **nvf** exposes several APIs for you to be able to add your own
**A**: **nvf** exposes several APIs for you to be able to add your own plugin configurations! Please see the documentation on how you may do this.
plugin configurations! Please see the documentation on how you may do
this.
**Q**: Main branch is awfully silent, is the project dead? **Q**: Main branch is awfully silent, is the project dead?
<br/> <br/> **A**: No! Sometimes we branch out (e.g. `v0.6`) to avoid breaking
**A**: No! Sometimes we branch out (e.g. v0.6) to avoid breaking userspace userspace and work in a separate branch until we make sure the new additions are
and work in a separate branch until we make sure the new additions are implemented in the most comfortable way possible for the end user. If you have
implemented in the most comfortable way available to the end user. If you have not noticed any activity on the main branch, consider taking a look at the
not noticed any activity on the main branch, consider taking a look at the [list [list of branches] or the [list of open pull requests]. You may also consider
of branches](https://github.com/NotAShelf/nvf/branches=) or the [list of open _testing_ those release branches to get access to new features ahead of time and
pull requests](https://github.com/NotAShelf/nvf) better prepare to breaking changes.
## Credits ## Credits
### Contributors ### Contributors
Special thanks to Special, heart-felt thanks to
- [@fufexan](https://github.com/fufexan) - For the transition to flake-parts - [@fufexan](https://github.com/fufexan) - For the transition to flake-parts
- [@FlafyDev](https://github.com/FlafyDev) - For getting the home-manager to work - [@FlafyDev](https://github.com/FlafyDev) - For getting the home-manager to
- [@n3oney](https://github.com/n3oney) - For making custom keybinds finally possible work
- [@horriblename](https://github.com/horriblename) - For actively implementing planned features and quality of life updates - [@n3oney](https://github.com/n3oney) - For making custom keybinds finally
possible
- [@horriblename](https://github.com/horriblename) - For actively implementing
planned features and quality of life updates
- [@Yavko](https://github.com/Yavko) - For the amazing **nvf** logo - [@Yavko](https://github.com/Yavko) - For the amazing **nvf** logo
- [@FrothyMarrow](https://github.com/FrothyMarrow) - For seeing mistakes that I could not - [@FrothyMarrow](https://github.com/FrothyMarrow) - For seeing mistakes that I
could not
- [@Diniamo](https://github.com/Diniamo) - For actively submitting PRs, pull
requests and overall assistence
- [@Gerg-l](https://github.com/gerg-l) - For the modern Neovim wrapper, mnw and
occasional code improvements
and everyone who has submitted issues or pull requests! and everyone who has submitted issues or pull requests!
@ -172,10 +203,18 @@ and everyone who has submitted issues or pull requests!
This configuration borrows from and is based on a few other configurations, This configuration borrows from and is based on a few other configurations,
including: including:
- [@jordanisaacs's](https://github.com/jordanisaacs) [neovim-flake](https://github.com/jordanisaacs/neovim-flake) that this flake is originally based on. - [@jordanisaacs's](https://github.com/jordanisaacs)
- [@sioodmy's](https://github.com/sioodmy) [dotfiles](https://github.com/sioodmy/dotfiles) that inspired the design choices. [neovim-flake](https://github.com/jordanisaacs/neovim-flake) that this flake
- [@wiltaylor's](https://github.com/wiltaylor) [neovim-flake](https://github.com/wiltaylor/neovim-flake) for plugin and design ideas. is originally based on.
- [@gvolpe's](https://github.com/gvolpe) [neovim-flake](https://github.com/gvolpe/neovim-flake) for plugin, design and nix concepts. - [@sioodmy's](https://github.com/sioodmy)
[dotfiles](https://github.com/sioodmy/dotfiles) that inspired the design
choices.
- [@wiltaylor's](https://github.com/wiltaylor)
[neovim-flake](https://github.com/wiltaylor/neovim-flake) for plugin and
design ideas.
- [@gvolpe's](https://github.com/gvolpe)
[neovim-flake](https://github.com/gvolpe/neovim-flake) for plugin, design and
nix concepts.
I am grateful for their previous work and inspiration, and I wholeheartedly I am grateful for their previous work and inspiration, and I wholeheartedly
recommend checking their work out. recommend checking their work out.
@ -183,11 +222,14 @@ recommend checking their work out.
## License ## License
Following the license of the [original neovim-flake](https://github.com/jordanisaacs/neovim-flake), Following the license of the
**nvf** has been made available under the [**MIT License**](LICENSE). However, all assets [original neovim-flake](https://github.com/jordanisaacs/neovim-flake), **nvf**
and documentation are published under the has been made available under the [**MIT License**](LICENSE). However, all
assets and documentation are published under the
[**CC BY License**](https://github.com/NotAShelf/nvf/blob/main/.github/assets/LICENSE). [**CC BY License**](https://github.com/NotAShelf/nvf/blob/main/.github/assets/LICENSE).
<h6 align="center">Yes, this includes the logo work too. Stop taking artwork that is not yours!</h6>
--- ---
<div align="right"> <div align="right">

22
.github/workflows/cleanup.yml vendored Normal file
View file

@ -0,0 +1,22 @@
name: Cleanup
on:
workflow_dispatch:
schedule:
- cron: "0 4 1 * *" # 4AM on 1st of every month
- cron: "0 4 15 * *" # 4AM on the 15th of every month
jobs:
branches:
name: Cleanup old branches
runs-on: ubuntu-latest
steps:
- name: "Checkout"
uses: actions/checkout@v4
- name: "Delete old branches"
uses: beatlabs/delete-old-branches-action@v0.0.10
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
date: "1 months ago"
dry_run: false
delete_tags: false
exclude_open_pr_branches: true

View file

@ -1,4 +1,5 @@
name: "Build and deploy documentation" name: "Build and deploy documentation"
on: on:
workflow_dispatch: workflow_dispatch:
push: push:
@ -7,6 +8,7 @@ on:
paths: paths:
# build the manuals only when docs directory is updated # build the manuals only when docs directory is updated
- docs/** - docs/**
- modules/**
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions: permissions:
@ -20,23 +22,34 @@ concurrency:
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
check_date:
runs-on: ubuntu-latest
name: Check latest commit
outputs:
should_run: ${{ steps.should_run.outputs.should_run }}
steps:
- uses: actions/checkout@v4.1.7
- name: print latest_commit
run: echo ${{ github.sha }}
- id: should_run
continue-on-error: true
name: check latest commit is less than a day
if: ${{ github.event_name == 'schedule' }}
run: test -z $(git rev-list --after="24 hours" ${{ github.sha }}) && echo "::set-output name=should_run::false"
publish: publish:
needs: check_date
if: ${{ needs.check_date.outputs.should_run != 'false' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - uses: actions/checkout@v4.1.7
uses: actions/checkout@v4 - uses: DeterminateSystems/nix-installer-action@main
- name: Install Nix
uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main - uses: DeterminateSystems/magic-nix-cache-action@main
- run: |
- name: Build nix build .#docs
run: |
nix build '.#docs'
cp -r result/share/doc/nvf public cp -r result/share/doc/nvf public
- uses: peaceiris/actions-gh-pages@v4
- name: Deploy
uses: peaceiris/actions-gh-pages@v4
with: with:
github_token: ${{ secrets.GITHUB_TOKEN }} github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./public publish_dir: ./public

View file

@ -17,9 +17,9 @@ isMaximal: {
lspkind.enable = false; lspkind.enable = false;
lightbulb.enable = true; lightbulb.enable = true;
lspsaga.enable = false; lspsaga.enable = false;
nvimCodeActionMenu.enable = isMaximal;
trouble.enable = true; trouble.enable = true;
lspSignature.enable = true; lspSignature.enable = true;
otter-nvim.enable = isMaximal;
lsplines.enable = isMaximal; lsplines.enable = isMaximal;
nvim-docs-view.enable = isMaximal; nvim-docs-view.enable = isMaximal;
}; };
@ -60,6 +60,7 @@ isMaximal: {
python.enable = isMaximal; python.enable = isMaximal;
dart.enable = isMaximal; dart.enable = isMaximal;
bash.enable = isMaximal; bash.enable = isMaximal;
r.enable = isMaximal;
tailwind.enable = isMaximal; tailwind.enable = isMaximal;
typst.enable = isMaximal; typst.enable = isMaximal;
clang = { clang = {
@ -155,7 +156,7 @@ isMaximal: {
}; };
utility = { utility = {
ccc.enable = isMaximal; ccc.enable = false;
vim-wakatime.enable = false; vim-wakatime.enable = false;
icon-picker.enable = isMaximal; icon-picker.enable = isMaximal;
surround.enable = isMaximal; surround.enable = isMaximal;
@ -204,6 +205,7 @@ isMaximal: {
go = ["90" "130"]; go = ["90" "130"];
}; };
}; };
fastaction.enable = true;
}; };
assistant = { assistant = {

View file

@ -2,19 +2,24 @@
inputs, inputs,
pkgs, pkgs,
lib, lib,
manpageUrls ? pkgs.path + "/doc/manpage-urls.json",
...
}: let }: let
inherit (lib.modules) mkForce evalModules; inherit ((lib.importJSON ../release.json)) release;
inherit (lib.strings) hasPrefix removePrefix;
inherit (lib.attrsets) isAttrs mapAttrs optionalAttrs recursiveUpdate isDerivation;
inherit (builtins) fromJSON readFile;
# release data nvimModuleDocs = pkgs.nixosOptionsDoc {
release-config = fromJSON (readFile ../release.json); variablelistId = "nvf-options";
revision = release-config.release; warningsAreErrors = true;
# From home-manager: inherit
(
(lib.evalModules {
modules =
import ../modules/modules.nix {
inherit lib pkgs;
}
++ [
(
let
# From nixpkgs:
# #
# Recursively replace each derivation in the given attribute set # Recursively replace each derivation in the given attribute set
# with the same derivation but with the `outPath` attribute set to # with the same derivation but with the `outPath` attribute set to
@ -28,131 +33,73 @@
# Caveat: even if the package is reached by a different means, the # Caveat: even if the package is reached by a different means, the
# path above will be shown and not e.g. # path above will be shown and not e.g.
# `${config.services.foo.package}`. # `${config.services.foo.package}`.
scrubDerivations = prefixPath: attrs: let scrubDerivations = namePrefix: pkgSet:
scrubDerivation = name: value: let builtins.mapAttrs (
pkgAttrName = prefixPath + "." + name; name: value: let
wholeName = "${namePrefix}.${name}";
in in
if isAttrs value if builtins.isAttrs value
then then
scrubDerivations pkgAttrName value scrubDerivations wholeName value
// optionalAttrs (isDerivation value) { // lib.optionalAttrs (lib.isDerivation value) {
outPath = "\${${pkgAttrName}}"; inherit (value) drvPath;
outPath = "\${${wholeName}}";
} }
else value; else value
in )
mapAttrs scrubDerivation attrs; pkgSet;
# Make sure the used package is scrubbed to avoid actually
# instantiating derivations.
scrubbedPkgsModule = {
imports = [
{
_module.args = {
pkgs = mkForce (scrubDerivations "pkgs" pkgs);
pkgs_i686 = mkForce {};
};
}
];
};
# Specify the path to the module entrypoint
nvimPath = toString ./..;
buildOptionsDocs = args @ {
modules,
includeModuleSystemOptions ? true,
warningsAreErrors ? true,
...
}: let
inherit ((evalModules {inherit modules;})) options;
# Declaration of the Github site URL.
# Takes a user, repo, and subpath, and returns a declaration site
# as a string.
githubDeclaration = user: repo: subpath: let
urlRef = "github.com";
branch = "main";
in { in {
url = "https://${urlRef}/${user}/${repo}/blob/${branch}/${subpath}"; _module = {
name = "<${repo}/${subpath}>"; check = false;
args.pkgs = lib.mkForce (scrubDerivations "pkgs" pkgs);
}; };
in }
pkgs.buildPackages.nixosOptionsDoc ({ )
inherit warningsAreErrors; ];
})
options = )
if includeModuleSystemOptions options
then options ;
else builtins.removeAttrs options ["_module"];
transformOptions = opt: transformOptions = opt:
recursiveUpdate opt { opt
# Clean up declaration sites to not refer to the nvf // {
# source tree. declarations =
declarations = map (decl: map (
if hasPrefix nvimPath (toString decl) decl:
if lib.hasPrefix (toString ../.) (toString decl)
then then
githubDeclaration "notashelf" "nvf" lib.pipe decl [
(removePrefix "/" (removePrefix nvimPath (toString decl))) toString
(lib.removePrefix (toString ../.))
(lib.removePrefix "/")
(x: {
url = "https://github.com/NotAShelf/nvf/blob/main/${x}";
name = "<nvf/${x}>";
})
]
else if decl == "lib/modules.nix" else if decl == "lib/modules.nix"
then then {
# TODO: handle this in a better way (may require upstream url = "https://github.com/NixOS/nixpkgs/blob/master/${decl}";
# changes to nixpkgs) name = "<nixpkgs/lib/modules.nix>";
githubDeclaration "NixOS" "nixpkgs" decl }
else decl) else decl
)
opt.declarations; opt.declarations;
}; };
}
// builtins.removeAttrs args ["modules" "includeModuleSystemOptions"]);
nvimModuleDocs = buildOptionsDocs {
variablelistId = "nvf-options";
modules =
import ../modules/modules.nix {
inherit lib pkgs;
check = false;
}
++ [scrubbedPkgsModule];
}; };
# Generate the `man home-configuration.nix` package
nvf-configuration-manual =
pkgs.runCommand "nvf-reference-manpage" {
nativeBuildInputs = [pkgs.buildPackages.installShellFiles pkgs.nixos-render-docs];
allowedReferences = ["out"];
} ''
# Generate manpages.
mkdir -p $out/share/man/man5
mkdir -p $out/share/man/man1
nixos-render-docs -j $NIX_BUILD_CORES options manpage \
--revision ${revision} \
--header ${./man/header.5} \
--footer ${./man/footer.5} \
${nvimModuleDocs.optionsJSON}/share/doc/nixos/options.json \
$out/share/man/man5/nvf.5
cp ${./man/nvf.1} $out/share/man/man1/nvf.1
'';
# Generate the HTML manual pages # Generate the HTML manual pages
nvf-manual = pkgs.callPackage ./manual.nix { html = pkgs.callPackage ./manual.nix {
inherit revision manpageUrls; inherit release;
outputPath = "share/doc/nvf"; inherit (nvimModuleDocs) optionsJSON;
options = {
nvf = nvimModuleDocs.optionsJSON;
}; };
};
html = nvf-manual;
htmlOpenTool = pkgs.callPackage ./html-open-tool.nix {} {inherit html;};
in { in {
inherit (inputs) nmd; inherit (inputs) nmd;
options = {
# TODO: Use `hmOptionsDocs.optionsJSON` directly once upstream # TODO: Use `hmOptionsDocs.optionsJSON` directly once upstream
# `nixosOptionsDoc` is more customizable. # `nixosOptionsDoc` is more customizable.
json = options.json =
pkgs.runCommand "options.json" { pkgs.runCommand "options.json" {
meta.description = "List of nvf options in JSON format"; meta.description = "List of nvf options in JSON format";
} '' } ''
@ -165,8 +112,31 @@ in {
'${nvimModuleDocs.optionsJSON}/share/doc/nixos' \ '${nvimModuleDocs.optionsJSON}/share/doc/nixos' \
"$out/share/doc/nvf" "$out/share/doc/nvf"
''; '';
};
manPages = nvf-configuration-manual; # Generate the `man home-configuration.nix` package
manual = {inherit html htmlOpenTool;}; manPages =
pkgs.runCommand "nvf-reference-manpage" {
nativeBuildInputs = [
pkgs.buildPackages.installShellFiles
pkgs.nixos-render-docs
];
allowedReferences = ["out"];
} ''
# Generate manpages.
mkdir -p $out/share/man/{man5,man1}
nixos-render-docs -j $NIX_BUILD_CORES options manpage \
--revision ${release} \
--header ${./man/header.5} \
--footer ${./man/footer.5} \
${nvimModuleDocs.optionsJSON}/share/doc/nixos/options.json \
$out/share/man/man5/nvf.5
cp ${./man/nvf.1} $out/share/man/man1/nvf.1
'';
manual = {
inherit html;
htmlOpenTool = pkgs.callPackage ./html-open-tool.nix {inherit html;};
};
} }

View file

@ -2,13 +2,9 @@
writeShellScriptBin, writeShellScriptBin,
makeDesktopItem, makeDesktopItem,
symlinkJoin, symlinkJoin,
}: {
html, html,
pathName ? "nvf",
projectName ? pathName,
name ? "${pathName}-help",
}: let }: let
helpScript = writeShellScriptBin name '' helpScript = writeShellScriptBin "nvf-help" ''
set -euo pipefail set -euo pipefail
if [[ ! -v BROWSER || -z $BROWSER ]]; then if [[ ! -v BROWSER || -z $BROWSER ]]; then
@ -24,20 +20,23 @@
echo "$0: unable to start a web browser; please set \$BROWSER" echo "$0: unable to start a web browser; please set \$BROWSER"
exit 1 exit 1
else else
exec "$BROWSER" "${html}/share/doc/${pathName}/index.xhtml" exec "$BROWSER" "${html}/share/doc/nvf/index.xhtml"
fi fi
''; '';
desktopItem = makeDesktopItem { desktopItem = makeDesktopItem {
name = "${pathName}-manual"; name = "nvf-manual";
desktopName = "${projectName} Manual"; desktopName = "nvf Manual";
genericName = "View ${projectName} documentation in a web browser"; genericName = "View nvf documentation in a web browser";
icon = "nix-snowflake"; icon = "nix-snowflake";
exec = "${helpScript}/bin/${name}"; exec = "${helpScript}/bin/nvf-help";
categories = ["System"]; categories = ["System"];
}; };
in in
symlinkJoin { symlinkJoin {
inherit name; name = "nvf-help";
paths = [helpScript desktopItem]; paths = [
helpScript
desktopItem
];
} }

View file

@ -4,11 +4,10 @@
# build inputs # build inputs
nixos-render-docs, nixos-render-docs,
documentation-highlighter, documentation-highlighter,
path,
# nrd configuration # nrd configuration
manpageUrls, release,
revision, optionsJSON,
options,
outputPath ? "share/doc/nvf",
}: }:
stdenvNoCC.mkDerivation { stdenvNoCC.mkDerivation {
name = "nvf-manual"; name = "nvf-manual";
@ -20,9 +19,11 @@ stdenvNoCC.mkDerivation {
nativeBuildInputs = [nixos-render-docs]; nativeBuildInputs = [nixos-render-docs];
buildPhase = '' buildPhase = ''
mkdir -p out/{highlightjs,media} dest="$out/share/doc/nvf"
mkdir -p "$(dirname "$dest")"
mkdir -p $dest/{highlightjs,media}
cp -vt out/highlightjs \ cp -vt $dest/highlightjs \
${documentation-highlighter}/highlight.pack.js \ ${documentation-highlighter}/highlight.pack.js \
${documentation-highlighter}/LICENSE \ ${documentation-highlighter}/LICENSE \
${documentation-highlighter}/mono-blue.css \ ${documentation-highlighter}/mono-blue.css \
@ -31,36 +32,30 @@ stdenvNoCC.mkDerivation {
substituteInPlace ./options.md \ substituteInPlace ./options.md \
--subst-var-by \ --subst-var-by \
OPTIONS_JSON \ OPTIONS_JSON \
${options.nvf}/share/doc/nixos/options.json ${optionsJSON}/share/doc/nixos/options.json
substituteInPlace ./manual.md \ substituteInPlace ./manual.md \
--subst-var-by \ --subst-var-by \
NVF_VERSION \ NVF_VERSION \
${revision} ${release}
# copy stylesheet # copy stylesheet
cp ${./static/style.css} out/style.css cp ${./static/style.css} "$dest/style.css"
# copy release notes # copy release notes
cp -vr ${./release-notes} release-notes cp -vr ${./release-notes} release-notes
# generate manual from # generate manual from
nixos-render-docs manual html \ nixos-render-docs manual html \
--manpage-urls ${manpageUrls} \ --manpage-urls ${path + "/doc/manpage-urls.json"} \
--revision ${lib.trivial.revisionWithDefault revision} \ --revision ${lib.trivial.revisionWithDefault release} \
--stylesheet style.css \ --stylesheet style.css \
--script highlightjs/highlight.pack.js \ --script highlightjs/highlight.pack.js \
--script highlightjs/loader.js \ --script highlightjs/loader.js \
--toc-depth 2 \ --toc-depth 2 \
--section-toc-depth 1 \ --section-toc-depth 1 \
manual.md \ manual.md \
out/index.xhtml "$dest/index.xhtml"
'';
installPhase = ''
dest="$out/${outputPath}"
mkdir -p "$(dirname "$dest")"
mv out "$dest"
mkdir -p $out/nix-support/ mkdir -p $out/nix-support/
echo "doc manual $dest index.html" >> $out/nix-support/hydra-build-products echo "doc manual $dest index.html" >> $out/nix-support/hydra-build-products

View file

@ -1,7 +1,7 @@
# Custom Plugins {#ch-custom-plugins} # Custom Plugins {#ch-custom-plugins}
**nvf**, by default, exposes a wide variety of plugins as module options **nvf**, by default, exposes a wide variety of plugins as module options
for your convience and bundles necessary dependencies into **nvf**'s runtime. for your convenience and bundles necessary dependencies into **nvf**'s runtime.
In case a plugin is not available in **nvf**, you may consider making a pull In case a plugin is not available in **nvf**, you may consider making a pull
request to **nvf** to include it as a module or you may add it to your request to **nvf** to include it as a module or you may add it to your
configuration locally. configuration locally.

View file

@ -5,16 +5,19 @@ 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 are called, it's hard to do that, so here is a list of the internal
entries in nvf: entries in nvf:
`vim.luaConfigRC` (top-level DAG): ## `vim.luaConfigRC` (top-level DAG) {#ch-vim-luaconfigrc}
1. (`luaConfigPre`) - not a part of the actual DAG, instead, it's simply 1. (`luaConfigPre`) - not a part of the actual DAG, instead, it's simply
inserted before the rest of the DAG inserted before the rest of the DAG
2. `globalsScript` - used to set globals defined in `vim.globals` 2. `globalsScript` - used to set globals defined in `vim.globals`
3. `basic` - used to set basic configuration options 3. `basic` - used to set basic configuration options
4. `theme` - used to set up the theme, which has to be done before other plugins 4. `optionsScript` - used to set options defined in `vim.o`
5. `pluginConfigs` - the result of the nested `vim.pluginRC` (internal option, 5. `theme` (this is simply placed before `pluginConfigs`, meaning that
see the [Custom Plugins](/index.xhtml#ch-custom-plugins) page for adding your own surrounding entries don't depend on it) - used to set up the theme, which has
plugins) DAG, used to set up internal plugins to be done before other plugins
6. `extraPluginConfigs` - the result of `vim.extraPlugins`, which is not a 6. `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
7. `extraPluginConfigs` - the result of `vim.extraPlugins`, which is not a
direct DAG, but is converted to, and resolved as one internally direct DAG, but is converted to, and resolved as one internally
7. `mappings` - the result of `vim.maps` 8. `mappings` - the result of `vim.maps`

View file

@ -4,6 +4,8 @@ Release notes for release 0.7
## Breaking Changes and Migration Guide {#sec-breaking-changes-and-migration-guide-0-7} ## Breaking Changes and Migration Guide {#sec-breaking-changes-and-migration-guide-0-7}
### `vim.configRC` removed {#sec-vim-configrc-removed}
In v0.7 we are removing `vim.configRC` in favor of making `vim.luaConfigRC` the 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 top-level DAG, and thereby making the entire configuration Lua based. This
change introduces a few breaking changes: change introduces a few breaking changes:
@ -24,6 +26,40 @@ making good use of its extensive Lua API. Additionally, Vimscript is slow and
brings unnecessary performance overhead while working with different brings unnecessary performance overhead while working with different
configuration formats. configuration formats.
### `vim.maps` rewrite {#sec-vim-maps-rewrite}
Instead of specifying map modes using submodules (eg.: `vim.maps.normal`), a new
`mode` option has mode has been introduced. It can be either a string, or a list
of strings, where a string represents the short-name of the map mode(s), that
the mapping should be set for. See `:help map-modes` for more information.
For example:
```nix
vim.maps.normal."<leader>m" = { ... };
```
has to be replaced by
```nix
vim.maps."<leader>m" = {
mode = "n";
...
};
```
### `vim.lsp.nvimCodeActionMenu` removed in favor of `vim.ui.fastaction` {#sec-nvim-code-action-menu-deprecation}
The nvim-code-action-menu plugin has been archived and broken for a long time,
so it's being replaced with a young, but better alternative called
fastaction.nvim. Simply remove everything set under
`vim.lsp.nvimCodeActionMenu`, and set `vim.ui.fastaction.enable` to `true`.
Note that we are looking to add more alternatives in the future like
dressing.nvim and actions-preview.nvim, in case fastaction doesn't work for
everyone.
## Changelog {#sec-release-0.7-changelog} ## Changelog {#sec-release-0.7-changelog}
[ItsSorae](https://github.com/ItsSorae): [ItsSorae](https://github.com/ItsSorae):
@ -53,6 +89,7 @@ configuration formats.
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
- Standardize border style options and add custom borders
[rust-tools.nvim]: https://github.com/simrat39/rust-tools.nvim [rust-tools.nvim]: https://github.com/simrat39/rust-tools.nvim
[rustaceanvim]: https://github.com/mrcjkb/rustaceanvim [rustaceanvim]: https://github.com/mrcjkb/rustaceanvim
@ -71,7 +108,8 @@ configuration formats.
- Fix "Emac" typo - Fix "Emac" typo
- Add [new-file-template.nvim] to automatically fill new file contents using templates. - Add [new-file-template.nvim] to automatically fill new file contents using
templates.
[diniamo](https://github.com/diniamo): [diniamo](https://github.com/diniamo):
@ -102,6 +140,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
- Replace `vim.lsp.nvimCodeActionMenu` with `vim.ui.fastaction`, see the
breaking changes section above for more details
[Neovim documentation on `vim.cmd`]: https://neovim.io/doc/user/lua.html#vim.cmd() [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 - Make Neovim's configuration file entirely Lua based. This comes with a few
@ -114,6 +155,8 @@ configuration formats.
has been introduced for setting up internal plugins. See the "DAG entries in has been introduced for setting up internal plugins. See the "DAG entries in
nvf" manual page for more information. nvf" manual page for more information.
- Rewrite `vim.maps`, see the breaking changes section above.
[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
@ -146,7 +189,43 @@ configuration formats.
- Add `nvf-print-config` & `nvf-print-config-path` helper scripts to Neovim - Add `nvf-print-config` & `nvf-print-config-path` helper scripts to Neovim
closure. Both of those scripts have been automatically added to your PATH upon closure. Both of those scripts have been automatically added to your PATH upon
using neovimConfig or `programs.nvf.enable`. using neovimConfig or `programs.nvf.enable`.
- `nvf-print-config` will display your `init.lua`, in full. - `nvf-print-config` will display your `init.lua`, in full.
- `nvf-print-config-path` will display the path to _a clone_ of your - `nvf-print-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 `init.lua`. This is not the path used by the Neovim wrapper, but an
identical clone. identical clone.
- Add `vim.ui.breadcrumbs.lualine` to allow fine-tuning breadcrumbs behaviour on
Lualine. Only `vim.ui.breadcrumbs.lualine.winbar` is supported for the time
being.
- [](#opt-vim.ui.breadcrumbs.lualine.winbar.enable) has been added to allow
controlling the default behaviour of the `nvim-navic` component on Lualine,
which used to occupy `winbar.lualine_c` as long as breadcrumbs are enabled.
- `vim.ui.breadcrumbs.alwaysRender` has been renamed to
[](#opt-vim.ui.breadcrumbs.lualine.winbar.alwaysRender) to be conform to the
new format.
- Add [basedpyright](https://github.com/detachhead/basedpyright) as a Python LSP
server and make it default.
- Add [python-lsp-server](https://github.com/python-lsp/python-lsp-server) as an
additional Python LSP server.
- Add [](#opt-vim.options) to set `vim.o` values in in your nvf configuration
without using additional Lua. See option documentation for more details.
- Add [](#opt-vim.dashboard.dashboard-nvim.setupOpts) to allow user
configuration for [dashboard.nvim](https://github.com/nvimdev/dashboard-nvim)
[ppenguin](https://github.com/ppenguin):
- Telescope:
- Fixed `project-nvim` command and keybinding
- Added default ikeybind/command for `Telescope resume` (`<leader>fr`)
[Soliprem](https://github.com/Soliprem)
- Add LSP and Treesitter support for R under `vim.languages.R`.
- Add Otter support under `vim.lsp.otter` and an assert to prevent conflict with
ccc

151
flake.lock generated
View file

@ -1,21 +1,5 @@
{ {
"nodes": { "nodes": {
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1673956053,
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-parts": { "flake-parts": {
"inputs": { "inputs": {
"nixpkgs-lib": "nixpkgs-lib" "nixpkgs-lib": "nixpkgs-lib"
@ -52,28 +36,13 @@
"type": "github" "type": "github"
} }
}, },
"flake-utils_2": {
"locked": {
"lastModified": 1659877975,
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"mnw": { "mnw": {
"locked": { "locked": {
"lastModified": 1724456641, "lastModified": 1726188505,
"narHash": "sha256-SMgnviF6ofBPbyV3+rljPGcX0Hn9HBOhgXE10Cyjaic=", "narHash": "sha256-3dkxJo6y/aKfwkAg6YnpdiQAoZKgHhWHz7ilGJHCoVU=",
"owner": "Gerg-L", "owner": "Gerg-L",
"repo": "mnw", "repo": "mnw",
"rev": "c261925dbbf02f523af0e8add844df64fddf0359", "rev": "ea00b3d2162d85dd085a6ba6d49aa2a186e588e7",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -129,11 +98,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1722141560, "lastModified": 1726871744,
"narHash": "sha256-Ul3rIdesWaiW56PS/Ak3UlJdkwBrD4UcagCmXZR9Z7Y=", "narHash": "sha256-V5LpfdHyQkUF7RfOaDPrZDP+oqz88lTJrMT1+stXNwo=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "038fb464fcfa79b4f08131b07f2d8c9a6bcc4160", "rev": "a1d92660c6b3b7c26fb883500a80ea9d33321be2",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -171,22 +140,6 @@
"type": "github" "type": "github"
} }
}, },
"nixpkgs_3": {
"locked": {
"lastModified": 1702350026,
"narHash": "sha256-A+GNZFZdfl4JdDphYKBJ5Ef1HOiFsP18vQe9mqjmUis=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "9463103069725474698139ab10f17a9d125da859",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-23.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nmd": { "nmd": {
"flake": false, "flake": false,
"locked": { "locked": {
@ -571,6 +524,22 @@
"type": "github" "type": "github"
} }
}, },
"plugin-fastaction-nvim": {
"flake": false,
"locked": {
"lastModified": 1721396662,
"narHash": "sha256-L7na78FsE+QHlEwxMpiwQcoOPhtmrknvdTZfzUoDANI=",
"owner": "Chaitanyabsprip",
"repo": "fastaction.nvim",
"rev": "2384dea7ba81d2709d0bee0e4bc7a8831ff13a9d",
"type": "github"
},
"original": {
"owner": "Chaitanyabsprip",
"repo": "fastaction.nvim",
"type": "github"
}
},
"plugin-fidget-nvim": { "plugin-fidget-nvim": {
"flake": false, "flake": false,
"locked": { "locked": {
@ -894,11 +863,11 @@
"plugin-neo-tree-nvim": { "plugin-neo-tree-nvim": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1713050882, "lastModified": 1726542367,
"narHash": "sha256-cZwOVpdMT0NCtp6Ha592QA2RzKVS6LhXXcjfDBCQ+0k=", "narHash": "sha256-Lqt0KJNT9HmpJwZoWChYeVBrDWhscRe8COqVCwgcTwk=",
"owner": "nvim-neo-tree", "owner": "nvim-neo-tree",
"repo": "neo-tree.nvim", "repo": "neo-tree.nvim",
"rev": "22e566aeb075c94f670f34077e05ba95190dfb4a", "rev": "a77af2e764c5ed4038d27d1c463fa49cd4794e07",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -1052,22 +1021,6 @@
"type": "github" "type": "github"
} }
}, },
"plugin-nvim-code-action-menu": {
"flake": false,
"locked": {
"lastModified": 1702287297,
"narHash": "sha256-pY+aP9iBuJhvDZzVEsOHZmnfaq3vUP7TfKEEQrj+Mo8=",
"owner": "weilbith",
"repo": "nvim-code-action-menu",
"rev": "8c7672a4b04d3cc4edd2c484d05b660a9cb34a1b",
"type": "github"
},
"original": {
"owner": "weilbith",
"repo": "nvim-code-action-menu",
"type": "github"
}
},
"plugin-nvim-colorizer-lua": { "plugin-nvim-colorizer-lua": {
"flake": false, "flake": false,
"locked": { "locked": {
@ -1183,11 +1136,11 @@
"plugin-nvim-lspconfig": { "plugin-nvim-lspconfig": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1716498901, "lastModified": 1727085470,
"narHash": "sha256-PMMqPDnq4Q8gWeKQ2WPE+pOf1R1G61wJ+bAWkHpQlzE=", "narHash": "sha256-IPpUZEMIL7+4mmqQLy9JeT0cW15/SH3Hx8kyksVcqC0=",
"owner": "neovim", "owner": "neovim",
"repo": "nvim-lspconfig", "repo": "nvim-lspconfig",
"rev": "b972e7154bc94ab4ecdbb38c8edbccac36f83996", "rev": "dd329912c8d446240584a2dbcd3802af3a19105a",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -1327,11 +1280,11 @@
"plugin-nvim-treesitter-context": { "plugin-nvim-treesitter-context": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1716388265, "lastModified": 1726947805,
"narHash": "sha256-EY5Si6t7LXcxOP3ubGAAMd3lgbeaCOCIybSKi1Ucx98=", "narHash": "sha256-5oN/vyhSqDqjLEzECj01A7A+Yq7U1H1HXLbzkC1Ljqw=",
"owner": "nvim-treesitter", "owner": "nvim-treesitter",
"repo": "nvim-treesitter-context", "repo": "nvim-treesitter-context",
"rev": "f62bfe19e0fbc13ae95649dfb3cf22f4ff85b683", "rev": "3d5390c49e3f8fe457b376df2a49aa39d75b7911",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -1420,6 +1373,22 @@
"type": "github" "type": "github"
} }
}, },
"plugin-otter-nvim": {
"flake": false,
"locked": {
"lastModified": 1724585935,
"narHash": "sha256-euHwoK2WHLF/hrjLY2P4yGrIbYyBN38FL3q4CKNZmLY=",
"owner": "jmbuhr",
"repo": "otter.nvim",
"rev": "ca9ce67d0399380b659923381b58d174344c9ee7",
"type": "github"
},
"original": {
"owner": "jmbuhr",
"repo": "otter.nvim",
"type": "github"
}
},
"plugin-oxocarbon": { "plugin-oxocarbon": {
"flake": false, "flake": false,
"locked": { "locked": {
@ -1855,6 +1824,7 @@
"plugin-dracula": "plugin-dracula", "plugin-dracula": "plugin-dracula",
"plugin-dressing-nvim": "plugin-dressing-nvim", "plugin-dressing-nvim": "plugin-dressing-nvim",
"plugin-elixir-tools": "plugin-elixir-tools", "plugin-elixir-tools": "plugin-elixir-tools",
"plugin-fastaction-nvim": "plugin-fastaction-nvim",
"plugin-fidget-nvim": "plugin-fidget-nvim", "plugin-fidget-nvim": "plugin-fidget-nvim",
"plugin-flutter-tools": "plugin-flutter-tools", "plugin-flutter-tools": "plugin-flutter-tools",
"plugin-gesture-nvim": "plugin-gesture-nvim", "plugin-gesture-nvim": "plugin-gesture-nvim",
@ -1885,7 +1855,6 @@
"plugin-nvim-autopairs": "plugin-nvim-autopairs", "plugin-nvim-autopairs": "plugin-nvim-autopairs",
"plugin-nvim-bufferline-lua": "plugin-nvim-bufferline-lua", "plugin-nvim-bufferline-lua": "plugin-nvim-bufferline-lua",
"plugin-nvim-cmp": "plugin-nvim-cmp", "plugin-nvim-cmp": "plugin-nvim-cmp",
"plugin-nvim-code-action-menu": "plugin-nvim-code-action-menu",
"plugin-nvim-colorizer-lua": "plugin-nvim-colorizer-lua", "plugin-nvim-colorizer-lua": "plugin-nvim-colorizer-lua",
"plugin-nvim-cursorline": "plugin-nvim-cursorline", "plugin-nvim-cursorline": "plugin-nvim-cursorline",
"plugin-nvim-dap": "plugin-nvim-dap", "plugin-nvim-dap": "plugin-nvim-dap",
@ -1908,6 +1877,7 @@
"plugin-obsidian-nvim": "plugin-obsidian-nvim", "plugin-obsidian-nvim": "plugin-obsidian-nvim",
"plugin-onedark": "plugin-onedark", "plugin-onedark": "plugin-onedark",
"plugin-orgmode-nvim": "plugin-orgmode-nvim", "plugin-orgmode-nvim": "plugin-orgmode-nvim",
"plugin-otter-nvim": "plugin-otter-nvim",
"plugin-oxocarbon": "plugin-oxocarbon", "plugin-oxocarbon": "plugin-oxocarbon",
"plugin-plenary-nvim": "plugin-plenary-nvim", "plugin-plenary-nvim": "plugin-plenary-nvim",
"plugin-project-nvim": "plugin-project-nvim", "plugin-project-nvim": "plugin-project-nvim",
@ -1933,8 +1903,7 @@
"plugin-vim-vsnip": "plugin-vim-vsnip", "plugin-vim-vsnip": "plugin-vim-vsnip",
"plugin-which-key": "plugin-which-key", "plugin-which-key": "plugin-which-key",
"rnix-lsp": "rnix-lsp", "rnix-lsp": "rnix-lsp",
"systems": "systems_2", "systems": "systems_2"
"zig": "zig"
} }
}, },
"rust-overlay": { "rust-overlay": {
@ -2006,26 +1975,6 @@
"repo": "flake-utils", "repo": "flake-utils",
"type": "github" "type": "github"
} }
},
"zig": {
"inputs": {
"flake-compat": "flake-compat",
"flake-utils": "flake-utils_2",
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1716725305,
"narHash": "sha256-LIz08gALt2wlutGXAEhNroEoIuPV5ePQB8LI4WzXcy8=",
"owner": "mitchellh",
"repo": "zig-overlay",
"rev": "93b02a697561ecd438cfa5779727b5a1c300cb4c",
"type": "github"
},
"original": {
"owner": "mitchellh",
"repo": "zig-overlay",
"type": "github"
}
} }
}, },
"root": "root", "root": "root",

View file

@ -13,8 +13,8 @@
inherit inputs; inherit inputs;
specialArgs = {inherit lib;}; specialArgs = {inherit lib;};
} { } {
# provide overridable systems # Allow users to bring their own systems.
# https://github.com/nix-systems/nix-systems # «https://github.com/nix-systems/nix-systems»
systems = import inputs.systems; systems = import inputs.systems;
imports = [ imports = [
./flake/apps.nix ./flake/apps.nix
@ -62,7 +62,6 @@
pkgs, pkgs,
... ...
}: { }: {
formatter = pkgs.alejandra;
devShells = { devShells = {
default = self'.devShells.lsp; default = self'.devShells.lsp;
nvim-nix = pkgs.mkShell {packages = [config.packages.nix];}; nvim-nix = pkgs.mkShell {packages = [config.packages.nix];};
@ -70,6 +69,21 @@
packages = with pkgs; [nil statix deadnix alejandra]; packages = with pkgs; [nil statix deadnix alejandra];
}; };
}; };
# Provide the default formatter. `nix fmt` in project root
# will format available files with the correct formatter.
# P.S: Please do not format with nixfmt! It messes with many
# syntax elements and results in unreadable code.
formatter = pkgs.alejandra;
# Check if codebase is properly formatted.
# This can be initiated with `nix build .#checks.<system>.nix-fmt`
# or with `nix flake check`
checks = {
nix-fmt = pkgs.runCommand "nix-fmt-check" {nativeBuildInputs = [pkgs.alejandra];} ''
alejandra --check ${self} < /dev/null | tee $out
'';
};
}; };
}; };
@ -90,10 +104,7 @@
flake = false; flake = false;
}; };
# TODO: get zig from the zig overlay instead of nixpkgs # Language servers (use master instead of nixpkgs)
zig.url = "github:mitchellh/zig-overlay";
# Langauge server (use master instead of nixpkgs)
rnix-lsp.url = "github:nix-community/rnix-lsp"; rnix-lsp.url = "github:nix-community/rnix-lsp";
nil = { nil = {
url = "github:oxalica/nil"; url = "github:oxalica/nil";
@ -133,8 +144,8 @@
flake = false; flake = false;
}; };
plugin-nvim-code-action-menu = { plugin-fastaction-nvim = {
url = "github:weilbith/nvim-code-action-menu"; url = "github:Chaitanyabsprip/fastaction.nvim";
flake = false; flake = false;
}; };
@ -159,7 +170,12 @@
flake = false; flake = false;
}; };
# language support plugin-otter-nvim = {
url = "github:jmbuhr/otter.nvim";
flake = false;
};
# Language support
plugin-sqls-nvim = { plugin-sqls-nvim = {
url = "github:nanotee/sqls.nvim"; url = "github:nanotee/sqls.nvim";
flake = false; flake = false;

View file

@ -67,7 +67,6 @@ in {
formatOnSave = true; formatOnSave = true;
lightbulb.enable = true; lightbulb.enable = true;
lspsaga.enable = false; lspsaga.enable = false;
nvimCodeActionMenu.enable = true;
trouble.enable = true; trouble.enable = true;
lspSignature.enable = true; lspSignature.enable = true;
rust.enable = false; rust.enable = false;

View file

@ -67,7 +67,6 @@ in {
formatOnSave = true; formatOnSave = true;
lightbulb.enable = true; lightbulb.enable = true;
lspsaga.enable = false; lspsaga.enable = false;
nvimCodeActionMenu.enable = true;
trouble.enable = true; trouble.enable = true;
lspSignature.enable = true; lspSignature.enable = true;
rust.enable = false; rust.enable = false;

View file

@ -8,6 +8,7 @@
docs = import ../docs {inherit pkgs inputs lib;}; docs = import ../docs {inherit pkgs inputs lib;};
in { in {
packages = { packages = {
inherit (docs.manual) htmlOpenTool;
# Documentation # Documentation
docs = docs.manual.html; docs = docs.manual.html;
docs-html = docs.manual.html; docs-html = docs.manual.html;

View file

@ -1,18 +0,0 @@
{
inputs,
lib,
}: let
modulesWithInputs = import ../modules inputs;
in
{
modules ? [],
pkgs,
check ? true,
extraSpecialArgs ? {},
extraModules ? [],
...
}:
modulesWithInputs {
inherit pkgs lib check extraSpecialArgs extraModules;
configuration.imports = modules;
}

View file

@ -11,5 +11,5 @@
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;};
neovimConfiguration = import ./configuration.nix {inherit inputs lib;}; neovimConfiguration = import ../modules {inherit inputs lib;};
} }

View file

@ -9,7 +9,7 @@
typesCustom = import ./custom.nix {inherit lib;}; typesCustom = import ./custom.nix {inherit lib;};
in { in {
inherit (typesDag) dagOf; inherit (typesDag) dagOf;
inherit (typesPlugin) pluginsOpt extraPluginType mkPluginSetupOption luaInline pluginType; inherit (typesPlugin) pluginsOpt extraPluginType mkPluginSetupOption luaInline pluginType borderType;
inherit (typesLanguage) diagnostics mkGrammarOption; inherit (typesLanguage) diagnostics mkGrammarOption;
inherit (typesCustom) anythingConcatLists char; inherit (typesCustom) anythingConcatLists char;
} }

View file

@ -51,9 +51,13 @@
}; };
}; };
}; };
borderPresets = ["none" "single" "double" "rounded" "solid" "shadow"];
in { in {
inherit extraPluginType fromInputs pluginType; inherit extraPluginType fromInputs pluginType;
borderType = either (enum borderPresets) (listOf (either str (listOf str)));
pluginsOpt = { pluginsOpt = {
description, description,
example, example,

View file

@ -1,10 +1,13 @@
inputs: { {
configuration, inputs,
pkgs,
lib, lib,
check ? true, }: {
pkgs,
extraSpecialArgs ? {}, extraSpecialArgs ? {},
modules ? [],
# deprecated
extraModules ? [], extraModules ? [],
configuration ? {},
}: let }: let
inherit (pkgs) vimPlugins; inherit (pkgs) vimPlugins;
inherit (lib.strings) isString toString; inherit (lib.strings) isString toString;
@ -13,13 +16,25 @@ inputs: {
# import modules.nix with `check`, `pkgs` and `lib` as arguments # import modules.nix with `check`, `pkgs` and `lib` as arguments
# check can be disabled while calling this file is called # check can be disabled while calling this file is called
# to avoid checking in all modules # to avoid checking in all modules
nvimModules = import ./modules.nix {inherit pkgs check lib;}; nvimModules = import ./modules.nix {inherit pkgs lib;};
# evaluate the extended library with the modules # evaluate the extended library with the modules
# optionally with any additional modules passed by the user # optionally with any additional modules passed by the user
module = lib.evalModules { module = lib.evalModules {
specialArgs = extraSpecialArgs // {modulesPath = toString ./.;}; specialArgs = extraSpecialArgs // {modulesPath = toString ./.;};
modules = concatLists [[configuration] nvimModules extraModules]; modules = concatLists [
nvimModules
modules
(lib.optional (configuration != {}) (lib.warn ''
nvf: passing 'configuration' to lib.neovimConfiguration is deprecated.
''
configuration))
(lib.optionals (extraModules != []) (lib.warn ''
nvf: passing 'extraModules' to lib.neovimConfiguration is deprecated, use 'modules' instead.
''
extraModules))
];
}; };
# alias to the internal configuration # alias to the internal configuration

View file

@ -7,5 +7,12 @@ in {
Tidalcycles language support has been removed as of 2024-06-06 as it was long unmaintained. If Tidalcycles language support has been removed as of 2024-06-06 as it was long unmaintained. If
you depended on this functionality, please open an issue. you depended on this functionality, please open an issue.
'') '')
# 2024-07-20
(mkRemovedOptionModule ["vim" "lsp" "nvimCodeActionMenu"] ''
nvimCodeActionMenu has been deprecated and removed upstream. As of 0.7, fastaction will be
available under `vim.ui.fastaction` as a replacement. Simply remove everything under
`vim.lsp.nvimCodeActionMenu`, and set `vim.ui.fastaction.enable` to `true`.
'')
]; ];
} }

View file

@ -1,11 +1,10 @@
{ {
check ? true,
pkgs, pkgs,
lib, lib,
}: let }: let
inherit (lib.modules) mkDefault; inherit (lib.modules) mkDefault;
inherit (lib.lists) concatLists; inherit (lib.lists) concatLists;
allModules = let
# The core neovim modules. # The core neovim modules.
# Contains configuration for core neovim features # Contains configuration for core neovim features
# such as spellchecking, mappings, and the init script (init.vim). # such as spellchecking, mappings, and the init script (init.vim).
@ -58,20 +57,16 @@
extra = map (p: ./extra + "/${p}") [ extra = map (p: ./extra + "/${p}") [
"deprecations.nix" "deprecations.nix"
]; ];
in
allModules = concatLists [neovim plugins wrapper extra]; concatLists [neovim plugins wrapper extra];
in
pkgsModule = {config, ...}: { allModules
config = { ++ [
_module = { {
inherit check; _module.args = {
args = {
baseModules = allModules; baseModules = allModules;
pkgsPath = mkDefault pkgs.path; pkgsPath = mkDefault pkgs.path;
pkgs = mkDefault pkgs; pkgs = mkDefault pkgs;
}; };
}; }
}; ]
};
in
allModules ++ [pkgsModule]

View file

@ -3,11 +3,13 @@
lib, lib,
... ...
}: let }: let
inherit (lib.options) mkOption literalExpression; inherit (lib.options) mkOption mkEnableOption literalExpression literalMD;
inherit (lib.strings) optionalString; inherit (lib.strings) optionalString;
inherit (lib.types) enum bool str int; inherit (lib.types) enum bool str int either;
inherit (lib.generators) mkLuaInline;
inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.dag) entryAfter;
inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.lua) toLuaObject;
inherit (lib.nvim.types) luaInline;
cfg = config.vim; cfg = config.vim;
in { in {
@ -158,9 +160,29 @@ in {
default = "sensitive"; default = "sensitive";
description = "Set the case sensitivity of search"; description = "Set the case sensitivity of search";
}; };
undoFile = {
enable = mkEnableOption "undofile for persistent undo behaviour";
path = mkOption {
type = either str luaInline;
default = mkLuaInline "vim.fn.stdpath('state') .. '/undo'";
defaultText = literalMD ''
```nix
mkLuaInline "vim.fn.stdpath('state') .. '/undo'"
```
'';
example = literalMD ''
```nix
mkLuaInline "os.getenv('XDG_DATA_HOME') .. '/nvf/undo'"
```
'';
description = "Path to the directory in which undo history will be stored";
};
};
}; };
config.vim.luaConfigRC.basic = entryAfter ["globalsScript"] '' config = {
vim.luaConfigRC.basic = entryAfter ["globalsScript"] ''
-- Settings that are set for everything -- Settings that are set for everything
vim.o.encoding = "utf-8" vim.o.encoding = "utf-8"
vim.o.hidden = true vim.o.hidden = true
@ -178,6 +200,11 @@ in {
vim.g.mapleader = ${toLuaObject cfg.leaderKey} vim.g.mapleader = ${toLuaObject cfg.leaderKey}
vim.g.maplocalleader = ${toLuaObject cfg.leaderKey} vim.g.maplocalleader = ${toLuaObject cfg.leaderKey}
${optionalString cfg.undoFile.enable ''
vim.o.undofile = true
vim.o.undodir = ${toLuaObject cfg.undoFile.path}
''}
${optionalString cfg.splitBelow '' ${optionalString cfg.splitBelow ''
vim.o.splitbelow = true vim.o.splitbelow = true
''} ''}
@ -266,4 +293,5 @@ in {
vim.o.ignorecase = false vim.o.ignorecase = false
''} ''}
''; '';
};
} }

View file

@ -3,51 +3,75 @@
lib, lib,
... ...
}: let }: let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf mkMerge;
inherit (lib.trivial) pipe;
inherit (lib.attrsets) mapAttrsToList;
inherit (lib.lists) flatten;
legacyMapModes = {
normal = ["n"];
insert = ["i"];
select = ["s"];
visual = ["v"];
terminal = ["t"];
normalVisualOp = ["n" "v" "o"];
visualOnly = ["n" "x"];
operator = ["o"];
insertCommand = ["i" "c"];
lang = ["l"];
command = ["c"];
};
cfg = config.vim; cfg = config.vim;
in { in {
config = { config = {
vim.maps = { vim.keymaps = mkMerge [
normal = mkIf cfg.disableArrows { (
"<up>" = { mkIf cfg.disableArrows [
action = "<nop>"; {
key = "<up>";
noremap = false; mode = ["n" "i"];
};
"<down>" = {
action = "<nop>";
noremap = false;
};
"<left>" = {
action = "<nop>"; action = "<nop>";
noremap = false; noremap = false;
}; }
"<right>" = { {
key = "<down>";
mode = ["n" "i"];
action = "<nop>"; action = "<nop>";
noremap = false; noremap = false;
}; }
}; {
key = "<left>";
insert = mkIf cfg.disableArrows { mode = ["n" "i"];
"<up>" = {
action = "<nop>"; action = "<nop>";
noremap = false; noremap = false;
}; }
"<down>" = { {
key = "<right>";
mode = ["n" "i"];
action = "<nop>"; action = "<nop>";
noremap = false; noremap = false;
}; }
"<left>" = { ]
action = "<nop>"; )
noremap = false; (
}; pipe cfg.maps
"<right>" = { [
action = "<nop>"; (mapAttrsToList (
noremap = false; oldMode: keybinds:
}; mapAttrsToList (
}; key: bind:
}; bind
// {
inherit key;
mode = legacyMapModes.${oldMode};
}
)
keybinds
))
flatten
]
)
];
}; };
} }

View file

@ -1,72 +1,90 @@
{lib, ...}: let {lib, ...}: let
inherit (lib.options) mkOption; inherit (lib.options) mkOption;
inherit (lib.types) bool str attrsOf nullOr submodule; inherit (lib.types) either str listOf attrsOf nullOr submodule bool;
inherit (lib.nvim.config) mkBool; inherit (lib.nvim.config) mkBool;
# Most of the keybindings code is highly inspired by pta2002/nixvim.
# Thank you!
mapConfigOptions = { mapConfigOptions = {
silent =
mkBool false
"Whether this mapping should be silent. Equivalent to adding <silent> to a map.";
nowait =
mkBool false
"Whether to wait for extra input on ambiguous mappings. Equivalent to adding <nowait> to a map.";
script =
mkBool false
"Equivalent to adding <script> to a map.";
expr =
mkBool false
"Means that the action is actually an expression. Equivalent to adding <expr> to a map.";
unique =
mkBool false
"Whether to fail if the map is already defined. Equivalent to adding <unique> to a map.";
noremap =
mkBool true
"Whether to use the 'noremap' variant of the command, ignoring any custom mappings on the defined action. It is highly advised to keep this on, which is the default.";
desc = mkOption { desc = mkOption {
type = nullOr str; type = nullOr str;
default = null; default = null;
description = "A description of this keybind, to be shown in which-key, if you have it enabled."; description = "A description of this keybind, to be shown in which-key, if you have it enabled.";
}; };
};
mapOption = submodule {
options =
mapConfigOptions
// {
action = mkOption { action = mkOption {
type = str; type = str;
description = "The action to execute."; description = "The command to execute.";
}; };
lua = mkBool false ''
lua = mkOption {
type = bool;
description = ''
If true, `action` is considered to be lua code. If true, `action` is considered to be lua code.
Thus, it will not be wrapped in `""`. Thus, it will not be wrapped in `""`.
''; '';
default = false;
silent = mkBool true "Whether this mapping should be silent. Equivalent to adding <silent> to a map.";
nowait = mkBool false "Whether to wait for extra input on ambiguous mappings. Equivalent to adding <nowait> to a map.";
script = mkBool false "Equivalent to adding <script> to a map.";
expr = mkBool false "Means that the action is actually an expression. Equivalent to adding <expr> to a map.";
unique = mkBool false "Whether to fail if the map is already defined. Equivalent to adding <unique> to a map.";
noremap = mkBool true "Whether to use the 'noremap' variant of the command, ignoring any custom mappings on the defined action. It is highly advised to keep this on, which is the default.";
};
mapType = submodule {
options =
mapConfigOptions
// {
key = mkOption {
type = str;
description = ''
Key that triggers this keybind.
'';
};
mode = mkOption {
type = either str (listOf str);
description = ''
The short-name of the mode to set the keymapping for. Passing an empty string is the equivalent of `:map`.
See `:help map-modes` for a list of modes.
'';
example = ''"nvc" for normal, visual and command mode'';
}; };
}; };
}; };
# legacy stuff
legacyMapOption = submodule {
options = mapConfigOptions;
};
mapOptions = mode: mapOptions = mode:
mkOption { mkOption {
description = "Mappings for ${mode} mode"; description = "Mappings for ${mode} mode";
type = attrsOf mapOption; type = attrsOf legacyMapOption;
default = {}; default = {};
}; };
in { in {
options.vim = { options.vim = {
maps = mkOption { keymaps = mkOption {
type = submodule { type = listOf mapType;
options = { description = "Custom keybindings.";
example = ''
vim.keymaps = [
{
key = "<leader>m";
mode = "n";
silent = true;
action = ":make<CR>";
}
{
key = "<leader>l";
mode = ["n" "x"];
silent = true;
action = "<cmd>cnext<CR>";
}
];
'';
default = {};
};
maps = {
normal = mapOptions "normal"; normal = mapOptions "normal";
insert = mapOptions "insert"; insert = mapOptions "insert";
select = mapOptions "select"; select = mapOptions "select";
@ -81,21 +99,4 @@ in {
command = mapOptions "command-line"; command = mapOptions "command-line";
}; };
}; };
default = {};
description = ''
Custom keybindings for any mode.
For plain maps (e.g. just 'map' or 'remap') use `maps.normalVisualOp`.
'';
example = ''
maps = {
normal."<leader>m" = {
silent = true;
action = "<cmd>make<CR>";
}; # Same as nnoremap <leader>m <silent> <cmd>make<CR>
};
'';
};
};
} }

View file

@ -5,16 +5,17 @@
}: let }: let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.nvim.dag) entryAnywhere; inherit (lib.nvim.dag) entryAnywhere;
inherit (lib.nvim.lua) toLuaObject;
cfg = config.vim.dashboard.dashboard-nvim; cfg = config.vim.dashboard.dashboard-nvim;
in { in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim.startPlugins = [ vim = {
"dashboard-nvim" startPlugins = ["dashboard-nvim"];
];
vim.pluginRC.dashboard-nvim = entryAnywhere '' pluginRC.dashboard-nvim = entryAnywhere ''
require("dashboard").setup{} require("dashboard").setup(${toLuaObject cfg.setupOpts})
''; '';
}; };
};
} }

View file

@ -1,7 +1,9 @@
{lib, ...}: let {lib, ...}: let
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
inherit (lib.nvim.types) mkPluginSetupOption;
in { in {
options.vim.dashboard.dashboard-nvim = { options.vim.dashboard.dashboard-nvim = {
enable = mkEnableOption "Fancy and Blazing Fast start screen plugin of neovim [dashboard.nvim]"; enable = mkEnableOption "Fancy and Blazing Fast start screen plugin of neovim [dashboard.nvim]";
setupOpts = mkPluginSetupOption "dashboard.nvim" {};
}; };
} }

View file

@ -57,7 +57,7 @@
dapConfig = '' dapConfig = ''
dap.adapters.lldb = { dap.adapters.lldb = {
type = 'executable', type = 'executable',
command = '${cfg.dap.package}/bin/lldb-vscode', command = '${cfg.dap.package}/bin/lldb-dap',
name = 'lldb' name = 'lldb'
} }
dap.configurations.cpp = { dap.configurations.cpp = {

View file

@ -17,6 +17,7 @@ in {
./ocaml.nix ./ocaml.nix
./php.nix ./php.nix
./python.nix ./python.nix
./r.nix
./rust.nix ./rust.nix
./sql.nix ./sql.nix
./svelte.nix ./svelte.nix

View file

@ -14,7 +14,7 @@
cfg = config.vim.languages.python; cfg = config.vim.languages.python;
defaultServer = "pyright"; defaultServer = "basedpyright";
servers = { servers = {
pyright = { pyright = {
package = pkgs.pyright; package = pkgs.pyright;
@ -30,6 +30,36 @@
} }
''; '';
}; };
basedpyright = {
package = pkgs.basedpyright;
lspConfig = ''
lspconfig.basedpyright.setup{
capabilities = capabilities;
on_attach = default_on_attach;
cmd = ${
if isList cfg.lsp.package
then expToLua cfg.lsp.package
else ''{"${cfg.lsp.package}/bin/basedpyright-langserver", "--stdio"}''
}
}
'';
};
python-lsp-server = {
package = pkgs.python-lsp-server;
lspConfig = ''
lspconfig.pylsp.setup{
capabilities = capabilities;
on_attach = default_on_attach;
cmd = ${
if isList cfg.lsp.package
then expToLua cfg.lsp.package
else ''{"${cfg.lsp.package}/bin/pylsp"}''
}
}
'';
};
}; };
defaultFormat = "black"; defaultFormat = "black";
@ -61,11 +91,12 @@
black-and-isort = { black-and-isort = {
package = pkgs.writeShellApplication { package = pkgs.writeShellApplication {
name = "black"; name = "black";
runtimeInputs = [pkgs.black pkgs.isort];
text = '' text = ''
black --quiet - "$@" | isort --profile black - black --quiet - "$@" | isort --profile black -
''; '';
runtimeInputs = [pkgs.black pkgs.isort];
}; };
nullConfig = '' nullConfig = ''
table.insert( table.insert(
ls_sources, ls_sources,

View file

@ -0,0 +1,78 @@
{
config,
pkgs,
lib,
...
}: let
inherit (builtins) attrNames;
inherit (lib.options) mkEnableOption mkOption literalExpression;
inherit (lib.modules) mkIf mkMerge;
inherit (lib.lists) isList;
inherit (lib.types) enum either listOf package str;
inherit (lib.nvim.lua) expToLua;
inherit (lib.nvim.types) mkGrammarOption;
cfg = config.vim.languages.r;
r-with-languageserver = pkgs.rWrapper.override {
packages = with pkgs.rPackages; [languageserver];
};
defaultServer = "r_language_server";
servers = {
r_language_server = {
package = pkgs.writeShellScriptBin "r_lsp" ''
${r-with-languageserver}/bin/R --slave -e "languageserver::run()"
'';
lspConfig = ''
lspconfig.r_language_server.setup{
capabilities = capabilities;
on_attach = default_on_attach;
cmd = ${
if isList cfg.lsp.package
then expToLua cfg.lsp.package
else ''{"${lib.getExe cfg.lsp.package}"}''
}
}
'';
};
};
in {
options.vim.languages.r = {
enable = mkEnableOption "R language support";
treesitter = {
enable = mkEnableOption "R treesitter" // {default = config.vim.languages.enableTreesitter;};
package = mkGrammarOption pkgs "r";
};
lsp = {
enable = mkEnableOption "R LSP support" // {default = config.vim.languages.enableLSP;};
server = mkOption {
description = "R LSP server to use";
type = enum (attrNames servers);
default = defaultServer;
};
package = mkOption {
description = "R LSP server package, or the command to run as a list of strings";
example = literalExpression "[ (lib.getExe pkgs.jdt-language-server) \"-data\" \"~/.cache/jdtls/workspace\" ]";
type = either package (listOf str);
default = servers.${cfg.lsp.server}.package;
};
};
};
config = mkIf cfg.enable (mkMerge [
(mkIf cfg.treesitter.enable {
vim.treesitter.enable = true;
vim.treesitter.grammars = [cfg.treesitter.package];
})
(mkIf cfg.lsp.enable {
vim.lsp.lspconfig.enable = true;
vim.lsp.lspconfig.sources.r-lsp = servers.${cfg.lsp.server}.lspConfig;
})
]);
}

View file

@ -173,7 +173,7 @@ in {
dap = { dap = {
adapter = { adapter = {
type = "executable", type = "executable",
command = "${cfg.dap.package}/bin/lldb-vscode", command = "${cfg.dap.package}/bin/lldb-dap",
name = "rustacean_lldb", name = "rustacean_lldb",
}, },
}, },

View file

@ -17,12 +17,12 @@
cfg = config.vim.languages.ts; cfg = config.vim.languages.ts;
defaultServer = "tsserver"; defaultServer = "ts_ls";
servers = { servers = {
tsserver = { ts_ls = {
package = pkgs.typescript-language-server; package = pkgs.typescript-language-server;
lspConfig = '' lspConfig = ''
lspconfig.tsserver.setup { lspconfig.ts_ls.setup {
capabilities = capabilities; capabilities = capabilities;
on_attach = attach_keymaps, on_attach = attach_keymaps,
cmd = ${ cmd = ${
@ -49,6 +49,24 @@
} }
''; '';
}; };
# Here for backwards compatibility. Still consider tsserver a valid
# configuration in the enum, but assert if it's set to *properly*
# redirect the user to the correct server.
tsserver = {
package = pkgs.typescript-language-server;
lspConfig = ''
lspconfig.ts_ls.setup {
capabilities = capabilities;
on_attach = attach_keymaps,
cmd = ${
if isList cfg.lsp.package
then expToLua cfg.lsp.package
else ''{"${cfg.lsp.package}/bin/typescript-language-server", "--stdio"}''
}
}
'';
};
}; };
# TODO: specify packages # TODO: specify packages
@ -65,6 +83,7 @@
) )
''; '';
}; };
prettierd = { prettierd = {
package = pkgs.prettierd; package = pkgs.prettierd;
nullConfig = '' nullConfig = ''
@ -94,6 +113,7 @@
}; };
}; };
in { in {
_file = ./ts.nix;
options.vim.languages.ts = { options.vim.languages.ts = {
enable = mkEnableOption "Typescript/Javascript language support"; enable = mkEnableOption "Typescript/Javascript language support";
@ -190,11 +210,32 @@ in {
}; };
}) })
# Extensions
(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.pluginRC.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})
''; '';
}) })
# Warn the user if they have set the default server name to tsserver to match upstream (us)
# The name "tsserver" has been deprecated in lspconfig, and now should be called ts_ls. This
# is a purely cosmetic change, but emits a warning if not accounted for.
{
assertions = [
{
assertion = cfg.lsp.enable -> cfg.lsp.server != "tsserver";
message = ''
As of a recent lspconfig update, the `tsserver` configuration has been renamed
to `ts_ls` to match upstream behaviour of `lspconfig`, and the name `tsserver`
is no longer considered valid by nvf. Please set `vim.languages.ts.lsp.server`
to `"ts_ls"` instead of to `${cfg.lsp.server}`
Please see <https://github.com/neovim/nvim-lspconfig/pull/3232> for more details
about this change.
'';
}
];
}
]); ]);
} }

View file

@ -10,10 +10,10 @@
# lsp plugins # lsp plugins
./lspsaga ./lspsaga
./nvim-code-action-menu
./trouble ./trouble
./lsp-signature ./lsp-signature
./lightbulb ./lightbulb
./otter
./lspkind ./lspkind
./lsplines ./lsplines
./nvim-docs-view ./nvim-docs-view

View file

@ -7,6 +7,7 @@
inherit (lib.strings) optionalString; inherit (lib.strings) optionalString;
inherit (lib.attrsets) mapAttrs; inherit (lib.attrsets) mapAttrs;
inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.dag) entryAfter;
inherit (lib.nvim.lua) toLuaObject;
cfg = config.vim.lsp; cfg = config.vim.lsp;
in { in {
@ -22,7 +23,7 @@ in {
${ ${
optionalString config.vim.ui.borders.enable '' optionalString config.vim.ui.borders.enable ''
require('lspconfig.ui.windows').default_options.border = '${config.vim.ui.borders.globalStyle}' require('lspconfig.ui.windows').default_options.border = ${toLuaObject config.vim.ui.borders.globalStyle}
'' ''
} }
''; '';

View file

@ -36,7 +36,7 @@ in {
(mkSetLuaBinding mappings.nextDiagnostic "require('lspsaga.diagnostic').navigate('next')") (mkSetLuaBinding mappings.nextDiagnostic "require('lspsaga.diagnostic').navigate('next')")
(mkSetLuaBinding mappings.previousDiagnostic "require('lspsaga.diagnostic').navigate('prev')") (mkSetLuaBinding mappings.previousDiagnostic "require('lspsaga.diagnostic').navigate('prev')")
(mkIf (!cfg.nvimCodeActionMenu.enable) (mkSetLuaBinding mappings.codeAction "require('lspsaga.codeaction').code_action")) (mkSetLuaBinding mappings.codeAction "require('lspsaga.codeaction').code_action")
(mkIf (!cfg.lspSignature.enable) (mkSetLuaBinding mappings.signatureHelp "require('lspsaga.signaturehelp').signature_help")) (mkIf (!cfg.lspSignature.enable) (mkSetLuaBinding mappings.signatureHelp "require('lspsaga.signaturehelp').signature_help"))
]; ];
}; };

View file

@ -1,37 +0,0 @@
{
config,
lib,
...
}: let
inherit (lib.modules) mkIf;
inherit (lib.nvim.dag) entryAnywhere;
inherit (lib.nvim.binds) mkSetBinding addDescriptionsToMappings pushDownDefault;
cfg = config.vim.lsp;
self = import ./nvim-code-action-menu.nix {inherit lib;};
mappingDefinitions = self.options.vim.lsp.nvimCodeActionMenu.mappings;
mappings = addDescriptionsToMappings cfg.nvimCodeActionMenu.mappings mappingDefinitions;
in {
config = mkIf (cfg.enable && cfg.nvimCodeActionMenu.enable) {
vim = {
startPlugins = ["nvim-code-action-menu"];
maps.normal = mkSetBinding mappings.open ":CodeActionMenu<CR>";
binds.whichKey.register = pushDownDefault {
"<leader>c" = "+CodeAction";
};
pluginRC.code-action-menu = entryAnywhere ''
-- border configuration
vim.g.code_action_menu_window_border = '${config.vim.ui.borders.plugins.code-action-menu.style}'
-- show individual sections of the code action menu
${lib.optionalString cfg.nvimCodeActionMenu.show.details "vim.g.code_action_menu_show_details = true"}
${lib.optionalString cfg.nvimCodeActionMenu.show.diff "vim.g.code_action_menu_show_diff = true"}
${lib.optionalString cfg.nvimCodeActionMenu.show.actionKind "vim.g.code_action_menu_show_action_kind = true"}
'';
};
};
}

View file

@ -1,20 +0,0 @@
{lib, ...}: let
inherit (lib.options) mkEnableOption;
inherit (lib.nvim.binds) mkMappingOption;
in {
options.vim.lsp = {
nvimCodeActionMenu = {
enable = mkEnableOption "nvim code action menu";
show = {
details = mkEnableOption "Show details" // {default = true;};
diff = mkEnableOption "Show diff" // {default = true;};
actionKind = mkEnableOption "Show action kind" // {default = true;};
};
mappings = {
open = mkMappingOption "Open code action menu [nvim-code-action-menu]" "<leader>ca";
};
};
};
}

View file

@ -0,0 +1,39 @@
{
config,
lib,
...
}: let
inherit (lib.modules) mkIf mkMerge;
inherit (lib.nvim.dag) entryAnywhere;
inherit (lib.nvim.lua) toLuaObject;
inherit (lib.nvim.binds) addDescriptionsToMappings mkSetBinding;
cfg = config.vim.lsp;
self = import ./otter.nix {inherit lib;};
mappingDefinitions = self.options.vim.lsp.otter-nvim.mappings;
mappings = addDescriptionsToMappings cfg.otter-nvim.mappings mappingDefinitions;
in {
config = mkIf (cfg.enable && cfg.otter-nvim.enable) {
assertions = [
{
assertion = !config.vim.utility.ccc.enable;
message = ''
ccc and otter have a breaking conflict. It's been reported upstream. Until it's fixed, disable one of them
'';
}
];
vim = {
startPlugins = ["otter-nvim"];
maps.normal = mkMerge [
(mkSetBinding mappings.toggle "<cmd>lua require'otter'.activate()<CR>")
];
pluginRC.otter-nvim = entryAnywhere ''
-- Enable otter diagnostics viewer
require("otter").setup({${toLuaObject cfg.otter-nvim.setupOpts}})
'';
};
};
}

View file

@ -1,6 +1,6 @@
{ {
imports = [ imports = [
./nvim-code-action-menu.nix ./otter.nix
./config.nix ./config.nix
]; ];
} }

View file

@ -0,0 +1,64 @@
{lib, ...}: let
inherit (lib.options) mkOption mkEnableOption;
inherit (lib.nvim.binds) mkMappingOption;
inherit (lib.types) bool str listOf;
inherit (lib.nvim.types) mkPluginSetupOption;
in {
options.vim.lsp = {
otter-nvim = {
enable = mkEnableOption ''
lsp features and a code completion source for code embedded in other documents [otter-nvim]
'';
mappings = {
toggle = mkMappingOption "Activate LSP on Cursor Position [otter-nvim]" "<leader>lo";
};
setupOpts = mkPluginSetupOption "otter.nvim" {
lsp = {
diagnostic_update_event = mkOption {
type = listOf str;
default = ["BufWritePost"];
description = ''
`:h events` that cause the diagnostic to update.
Set to: {"BufWritePost", "InsertLeave", "TextChanged" }
for less performant but more instant diagnostic updates
'';
};
};
buffers = {
set_filetype = mkOption {
type = bool;
default = false;
description = ''
if set to true, the filetype of the otterbuffers will be set. Other wide only
the autocommand of lspconfig that attaches the language server will be
executed without stting the filetype
'';
};
write_to_disk = mkOption {
type = bool;
default = false;
description = ''
write <path>.otter.<embedded language extension> files to disk on save of main buffer.
Useful for some linters that require actual files.
Otter files are deleted on quit or main buffer close
'';
};
};
strip_wrapping_quote_characters = mkOption {
type = listOf str;
default = ["'" ''"'' "`"];
description = ''
'';
};
handle_leading_whitespace = mkOption {
type = bool;
default = false;
description = ''
otter may not work the way you expect when entire code blocks are indented
(eg. in Org files) When true, otter handles these cases fully.
'';
};
};
};
};
}

View file

@ -11,7 +11,7 @@
inherit (lib.generators) mkLuaInline; inherit (lib.generators) mkLuaInline;
cfg = config.vim.statusline.lualine; cfg = config.vim.statusline.lualine;
breadcrumbsCfg = config.vim.ui.breadcrumbs; bCfg = config.vim.ui.breadcrumbs;
in { in {
config = mkMerge [ config = mkMerge [
# TODO: move into nvim-tree file # TODO: move into nvim-tree file
@ -20,13 +20,14 @@ in {
extensions = ["nvim-tree"]; extensions = ["nvim-tree"];
}; };
}) })
(mkIf (breadcrumbsCfg.enable && breadcrumbsCfg.source == "nvim-navic") {
(mkIf (bCfg.enable && bCfg.lualine.winbar.enable && bCfg.source == "nvim-navic") {
vim.statusline.lualine.setupOpts = { vim.statusline.lualine.setupOpts = {
# TODO: rewrite in new syntax # TODO: rewrite in new syntax
winbar.lualine_c = mkDefault [ winbar.lualine_c = mkDefault [
[ [
"navic" "navic"
(mkLuaInline "draw_empty = ${boolToString config.vim.ui.breadcrumbs.alwaysRender}") (mkLuaInline "draw_empty = ${boolToString bCfg.lualine.winbar.alwaysRender}")
] ]
]; ];
}; };
@ -34,7 +35,6 @@ in {
(mkIf cfg.enable { (mkIf cfg.enable {
vim = { vim = {
startPlugins = ["lualine"]; startPlugins = ["lualine"];
pluginRC.lualine = entryAnywhere '' pluginRC.lualine = entryAnywhere ''
local lualine = require('lualine') local lualine = require('lualine')
lualine.setup ${toLuaObject cfg.setupOpts} lualine.setup ${toLuaObject cfg.setupOpts}

View file

@ -6,7 +6,7 @@
inherit (lib.trivial) boolToString warnIf; inherit (lib.trivial) boolToString warnIf;
in { in {
onedark = { onedark = {
setup = {style ? "dark"}: '' setup = {style ? "dark", ...}: ''
-- OneDark theme -- OneDark theme
require('onedark').setup { require('onedark').setup {
style = "${style}" style = "${style}"
@ -30,7 +30,7 @@ in {
}; };
dracula = { dracula = {
setup = {transparent}: '' setup = {transparent, ...}: ''
require('dracula').setup({ require('dracula').setup({
transparent_bg = ${boolToString transparent}, transparent_bg = ${boolToString transparent},
}); });

View file

@ -7,7 +7,7 @@
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 { supportedThemes = import ./supported-themes.nix {
@ -45,7 +45,7 @@ in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim = { vim = {
startPlugins = [cfg.name]; startPlugins = [cfg.name];
luaConfigRC.theme = entryAfter ["basic"] '' luaConfigRC.theme = entryBefore ["pluginConfigs"] ''
${cfg.extraConfig} ${cfg.extraConfig}
${supportedThemes.${cfg.name}.setup {inherit (cfg) style transparent;}} ${supportedThemes.${cfg.name}.setup {inherit (cfg) style transparent;}}
''; '';

View file

@ -4,31 +4,34 @@
... ...
}: let }: let
inherit (lib.options) mkOption mkEnableOption; inherit (lib.options) mkOption mkEnableOption;
inherit (lib.lists) optionals; inherit (lib.nvim.types) borderType;
inherit (lib.types) enum;
cfg = config.vim.ui.borders; cfg = config.vim.ui.borders;
defaultStyles = ["none" "single" "double" "rounded"];
in { in {
options.vim.ui.borders = { options.vim.ui.borders = {
enable = mkEnableOption "visible borders for most windows"; enable = mkEnableOption "visible borders for most windows";
globalStyle = mkOption { globalStyle = mkOption {
type = enum defaultStyles; type = borderType;
default = "rounded"; default = "rounded";
description = '' description = ''
The global border style to use. The global border style to use.
If a list is given, it should have a length of eight or any divisor of
eight. The array will specify the eight chars building up the border in
a clockwise fashion starting with the top-left corner. You can specify
a different highlight group for each character by passing a
[char, "YourHighlightGroup"] instead
''; '';
example = ["" "" "" "" "" "" "" ""];
}; };
# TODO: make per-plugin borders configurable
plugins = let plugins = let
mkPluginStyleOption = name: { mkPluginStyleOption = name: {
enable = mkEnableOption "borders for the ${name} plugin" // {default = cfg.enable;}; enable = mkEnableOption "borders for the ${name} plugin" // {default = cfg.enable;};
style = mkOption { style = mkOption {
type = enum (defaultStyles ++ optionals (name != "which-key") ["shadow"]); type = borderType;
default = cfg.globalStyle; default = cfg.globalStyle;
description = "The border style to use for the ${name} plugin"; description = "The border style to use for the ${name} plugin";
}; };
@ -40,7 +43,7 @@ in {
lspsaga = mkPluginStyleOption "lspsaga"; lspsaga = mkPluginStyleOption "lspsaga";
nvim-cmp = mkPluginStyleOption "nvim-cmp"; nvim-cmp = mkPluginStyleOption "nvim-cmp";
lsp-signature = mkPluginStyleOption "lsp-signature"; lsp-signature = mkPluginStyleOption "lsp-signature";
code-action-menu = mkPluginStyleOption "code-actions-menu"; fastaction = mkPluginStyleOption "fastaction";
}; };
}; };
} }

View file

@ -4,9 +4,9 @@
... ...
}: let }: let
inherit (lib.options) mkOption mkEnableOption; inherit (lib.options) mkOption mkEnableOption;
inherit (lib.types) nullOr listOf enum bool str int; inherit (lib.types) nullOr listOf enum bool str int either;
inherit (lib.modules) mkRenamedOptionModule; inherit (lib.modules) mkRenamedOptionModule;
inherit (lib.nvim.types) mkPluginSetupOption; inherit (lib.nvim.types) mkPluginSetupOption borderType;
mkSimpleIconOption = default: mkSimpleIconOption = default:
mkOption { mkOption {
inherit default; inherit default;
@ -31,6 +31,8 @@ in {
(renameSetupOpt ["sourceBuffer" "scrolloff"] ["source_buffer" "scrolloff"]) (renameSetupOpt ["sourceBuffer" "scrolloff"] ["source_buffer" "scrolloff"])
# TODO: every option under icon is renamed to first letter capitalized # TODO: every option under icon is renamed to first letter capitalized
(renameSetupOpt ["icon"] ["icon"]) (renameSetupOpt ["icon"] ["icon"])
(mkRenamedOptionModule ["vim" "ui" "breadcrumbs" "alwaysRender"] ["vim" "ui" "breadcrumbs" "lualine" "winbar" "alwaysRender"])
]; ];
options.vim.ui.breadcrumbs = { options.vim.ui.breadcrumbs = {
@ -43,17 +45,43 @@ in {
''; '';
}; };
# maybe this should be an option to *disable* alwaysRender optionally but oh well # Options for configuring Lualine integration of nvim-navic
# too late lualine.winbar = {
enable = mkOption {
type = bool;
default = true; # for retaining previous behaviour
example = false;
description = ''
Whether to automatically configure a winbar component for
Lualine on the Winbar section.
::: {.note}
This is **set to `true` by default**, which means nvim-navic
will occupy `winbar.lualine_c` for the breadcrumbs feature
unless this option is set to `false`.
:::
'';
};
alwaysRender = mkOption { alwaysRender = mkOption {
type = bool; type = bool;
default = true; default = true;
description = "Whether to always display the breadcrumbs component on winbar (always renders winbar)"; example = false;
description = ''
Whether to always display the breadcrumbs component
on winbar.
::: {.note}
This will pass `draw_empty` to the `nvim_navic` winbar
component, which causes the component to be drawn even
if it's empty
:::
'';
};
}; };
navbuddy = { navbuddy = {
enable = mkEnableOption "navbuddy LSP helper UI. Enabling this option automatically loads and enables nvim-navic"; enable = mkEnableOption "navbuddy LSP helper UI. Enabling this option automatically loads and enables nvim-navic";
mappings = { mappings = {
close = mkOption { close = mkOption {
type = str; type = str;
@ -212,8 +240,7 @@ in {
# position = {} # position = {}
border = mkOption { border = mkOption {
# TODO: let this type accept a custom string type = borderType;
type = enum ["single" "rounded" "double" "solid" "none"];
default = config.vim.ui.borders.globalStyle; default = config.vim.ui.borders.globalStyle;
description = "border style to use"; description = "border style to use";
}; };
@ -236,8 +263,7 @@ in {
*/ */
border = mkOption { border = mkOption {
# TODO: let this type accept a custom string type = borderType;
type = nullOr (enum ["single" "rounded" "double" "solid" "none"]);
default = config.vim.ui.borders.globalStyle; default = config.vim.ui.borders.globalStyle;
description = "border style to use for the left section of Navbuddy UI"; description = "border style to use for the left section of Navbuddy UI";
}; };
@ -254,8 +280,7 @@ in {
*/ */
border = mkOption { border = mkOption {
# TODO: let this type accept a custom string type = borderType;
type = nullOr (enum ["single" "rounded" "double" "solid" "none"]);
default = config.vim.ui.borders.globalStyle; default = config.vim.ui.borders.globalStyle;
description = "border style to use for the middle section of Navbuddy UI"; description = "border style to use for the middle section of Navbuddy UI";
}; };
@ -265,8 +290,7 @@ in {
# there is no size option for the right section, it fills the remaining space # there is no size option for the right section, it fills the remaining space
right = { right = {
border = mkOption { border = mkOption {
# TODO: let this type accept a custom string type = borderType;
type = nullOr (enum ["single" "rounded" "double" "solid" "none"]);
default = config.vim.ui.borders.globalStyle; default = config.vim.ui.borders.globalStyle;
description = "border style to use for the right section of Navbuddy UI"; description = "border style to use for the right section of Navbuddy UI";
}; };

View file

@ -8,5 +8,6 @@
./illuminate ./illuminate
./breadcrumbs ./breadcrumbs
./borders ./borders
./fastaction
]; ];
} }

View file

@ -0,0 +1,24 @@
{
config,
lib,
...
}: let
inherit (lib.modules) mkIf mkDefault;
inherit (lib.nvim.dag) entryAnywhere;
inherit (lib.nvim.lua) toLuaObject;
cfg = config.vim.ui.fastaction;
borderCfg = config.vim.ui.borders.plugins.fastaction;
in {
config = mkIf cfg.enable {
vim = {
ui.fastaction.setupOpts = {
register_ui_select = mkDefault true;
popup.border = mkIf borderCfg.enable borderCfg.style;
};
startPlugins = ["fastaction-nvim"];
pluginRC.fastaction = entryAnywhere "require('fastaction').setup(${toLuaObject cfg.setupOpts})";
};
};
}

View file

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

View file

@ -0,0 +1,9 @@
{lib, ...}: let
inherit (lib.options) mkEnableOption;
inherit (lib.nvim.types) mkPluginSetupOption;
in {
options.vim.ui.fastaction = {
enable = mkEnableOption "overriding vim.ui.select with fastaction.nvim";
setupOpts = mkPluginSetupOption "fastaction" {};
};
}

View file

@ -25,7 +25,7 @@ in {
${optionalString config.vim.ui.borders.plugins.which-key.enable '' ${optionalString config.vim.ui.borders.plugins.which-key.enable ''
window = { window = {
border = "${config.vim.ui.borders.plugins.which-key.style}", border = ${toLuaObject config.vim.ui.borders.plugins.which-key.style},
}, },
''} ''}
}) })

View file

@ -17,17 +17,19 @@
mappings = addDescriptionsToMappings cfg.mappings mappingDefinitions; mappings = addDescriptionsToMappings cfg.mappings mappingDefinitions;
in { in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim.startPlugins = [ vim = {
startPlugins = [
"telescope" "telescope"
"plenary-nvim" "plenary-nvim"
]; ];
vim.maps.normal = mkMerge [ maps.normal = mkMerge [
(mkSetBinding mappings.findFiles "<cmd> Telescope find_files<CR>") (mkSetBinding mappings.findFiles "<cmd> Telescope find_files<CR>")
(mkSetBinding mappings.liveGrep "<cmd> Telescope live_grep<CR>") (mkSetBinding mappings.liveGrep "<cmd> Telescope live_grep<CR>")
(mkSetBinding mappings.buffers "<cmd> Telescope buffers<CR>") (mkSetBinding mappings.buffers "<cmd> Telescope buffers<CR>")
(mkSetBinding mappings.helpTags "<cmd> Telescope help_tags<CR>") (mkSetBinding mappings.helpTags "<cmd> Telescope help_tags<CR>")
(mkSetBinding mappings.open "<cmd> Telescope<CR>") (mkSetBinding mappings.open "<cmd> Telescope<CR>")
(mkSetBinding mappings.resume "<cmd> Telescope resume<CR>")
(mkSetBinding mappings.gitCommits "<cmd> Telescope git_commits<CR>") (mkSetBinding mappings.gitCommits "<cmd> Telescope git_commits<CR>")
(mkSetBinding mappings.gitBufferCommits "<cmd> Telescope git_bcommits<CR>") (mkSetBinding mappings.gitBufferCommits "<cmd> Telescope git_bcommits<CR>")
@ -53,11 +55,11 @@ in {
( (
mkIf config.vim.projects.project-nvim.enable mkIf config.vim.projects.project-nvim.enable
(mkSetBinding mappings.findProjects "<cmd Telescope projects<CR>") (mkSetBinding mappings.findProjects "<cmd> Telescope projects<CR>")
) )
]; ];
vim.binds.whichKey.register = pushDownDefault { binds.whichKey.register = pushDownDefault {
"<leader>f" = "+Telescope"; "<leader>f" = "+Telescope";
"<leader>fl" = "Telescope LSP"; "<leader>fl" = "Telescope LSP";
"<leader>fm" = "Cellular Automaton"; "<leader>fm" = "Cellular Automaton";
@ -65,7 +67,7 @@ in {
"<leader>fvc" = "Commits"; "<leader>fvc" = "Commits";
}; };
vim.pluginRC.telescope = entryAnywhere '' pluginRC.telescope = entryAnywhere ''
local telescope = require('telescope') local telescope = require('telescope')
telescope.setup(${toLuaObject cfg.setupOpts}) telescope.setup(${toLuaObject cfg.setupOpts})
@ -88,4 +90,5 @@ in {
} }
''; '';
}; };
};
} }

View file

@ -150,13 +150,13 @@
in { in {
options.vim.telescope = { options.vim.telescope = {
mappings = { mappings = {
findProjects = mkMappingOption "Find files [Telescope]" "<leader>fp"; findProjects = mkMappingOption "Find projects [Telescope]" "<leader>fp";
findFiles = mkMappingOption "Find files [Telescope]" "<leader>ff"; findFiles = mkMappingOption "Find files [Telescope]" "<leader>ff";
liveGrep = mkMappingOption "Live grep [Telescope]" "<leader>fg"; liveGrep = mkMappingOption "Live grep [Telescope]" "<leader>fg";
buffers = mkMappingOption "Buffers [Telescope]" "<leader>fb"; buffers = mkMappingOption "Buffers [Telescope]" "<leader>fb";
helpTags = mkMappingOption "Help tags [Telescope]" "<leader>fh"; helpTags = mkMappingOption "Help tags [Telescope]" "<leader>fh";
open = mkMappingOption "Open [Telescope]" "<leader>ft"; open = mkMappingOption "Open [Telescope]" "<leader>ft";
resume = mkMappingOption "Resume (previous search) [Telescope]" "<leader>fr";
gitCommits = mkMappingOption "Git commits [Telescope]" "<leader>fvcw"; gitCommits = mkMappingOption "Git commits [Telescope]" "<leader>fvcw";
gitBufferCommits = mkMappingOption "Git buffer commits [Telescope]" "<leader>fvcb"; gitBufferCommits = mkMappingOption "Git buffer commits [Telescope]" "<leader>fvcb";

View file

@ -45,8 +45,6 @@ in {
'noice', 'noice',
'NvimTree', 'NvimTree',
'alpha', 'alpha',
'code-action-menu-menu',
'code-action-menu-warning-message',
'notify', 'notify',
'Navbuddy' 'Navbuddy'
}, },

View file

@ -7,7 +7,7 @@
inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.options) mkEnableOption mkOption literalExpression;
inherit (lib.strings) toUpper; inherit (lib.strings) toUpper;
inherit (lib.types) int float bool str enum listOf attrsOf oneOf nullOr submodule; inherit (lib.types) int float bool str enum listOf attrsOf oneOf nullOr submodule;
inherit (lib.nvim.types) mkPluginSetupOption luaInline; inherit (lib.nvim.types) mkPluginSetupOption luaInline borderType;
inherit (lib.generators) mkLuaInline; inherit (lib.generators) mkLuaInline;
in { in {
imports = [ imports = [
@ -453,7 +453,7 @@ in {
}; };
border = mkOption { border = mkOption {
description = "Border style of the notification window"; description = "Border style of the notification window";
type = enum ["none" "single" "double" "rounded" "solid" "shadow"]; type = borderType;
default = default =
if config.vim.ui.borders.enable if config.vim.ui.borders.enable
then config.vim.ui.borders.globalStyle then config.vim.ui.borders.globalStyle

View file

@ -4,86 +4,21 @@
... ...
}: let }: let
inherit (builtins) map mapAttrs filter; inherit (builtins) map mapAttrs filter;
inherit (lib.options) mkOption; inherit (lib.attrsets) mapAttrsToList filterAttrs;
inherit (lib.attrsets) mapAttrsToList filterAttrs getAttrs attrValues attrNames;
inherit (lib.strings) concatLines concatMapStringsSep; inherit (lib.strings) concatLines concatMapStringsSep;
inherit (lib.trivial) showWarnings; inherit (lib.trivial) showWarnings;
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) entryAfter mkLuarcSection resolveDag entryAnywhere;
inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.lua) toLuaObject;
inherit (lib.nvim.config) mkBool;
cfg = config.vim; cfg = config.vim;
# Most of the keybindings code is highly inspired by pta2002/nixvim.
# Thank you!
mapConfigOptions = {
silent =
mkBool false
"Whether this mapping should be silent. Equivalent to adding <silent> to a map.";
nowait =
mkBool false
"Whether to wait for extra input on ambiguous mappings. Equivalent to adding <nowait> to a map.";
script =
mkBool false
"Equivalent to adding <script> to a map.";
expr =
mkBool false
"Means that the action is actually an expression. Equivalent to adding <expr> to a map.";
unique =
mkBool false
"Whether to fail if the map is already defined. Equivalent to adding <unique> to a map.";
noremap =
mkBool true
"Whether to use the 'noremap' variant of the command, ignoring any custom mappings on the defined action. It is highly advised to keep this on, which is the default.";
desc = mkOption {
type = nullOr str;
default = null;
description = "A description of this keybind, to be shown in which-key, if you have it enabled.";
};
};
genMaps = mode: maps: let
/*
Take a user-defined action (string or attrs) and return the following attribute set:
{
action = (string) the actual action to map to this key
config = (attrs) the configuration options for this mapping (noremap, silent...)
}
*/
normalizeAction = action: {
# Extract the values of the config options that have been explicitly set by the user
config =
filterAttrs (_: v: v != null)
(getAttrs (attrNames mapConfigOptions) action);
action =
if action.lua
then mkLuaInline action.action
else action.action;
};
in
attrValues (mapAttrs
(key: action: let
normalizedAction = normalizeAction action;
in {
inherit (normalizedAction) action config;
inherit key;
inherit mode;
})
maps);
in { in {
config = let config = let
filterNonNull = attrs: filterAttrs (_: value: value != null) attrs;
globalsScript = globalsScript =
mapAttrsToList (name: value: "vim.g.${name} = ${toLuaObject value}") mapAttrsToList (name: value: "vim.g.${name} = ${toLuaObject value}") cfg.globals;
(filterNonNull cfg.globals);
optionsScript =
mapAttrsToList (name: value: "vim.o.${name} = ${toLuaObject value}") cfg.options;
extraPluginConfigs = resolveDag { extraPluginConfigs = resolveDag {
name = "extra plugin configs"; name = "extra plugin configs";
@ -97,46 +32,31 @@ in {
mapResult = result: concatLines (map mkLuarcSection result); mapResult = result: concatLines (map mkLuarcSection result);
}; };
toLuaBindings = mode: maps: getAction = keymap:
map (value: '' if keymap.lua
vim.keymap.set(${toLuaObject mode}, ${toLuaObject value.key}, ${toLuaObject value.action}, ${toLuaObject value.config}) then mkLuaInline keymap.action
'') (genMaps mode maps); else keymap.action;
# I'm not sure if every one of these will work. getOpts = keymap: {
allmap = toLuaBindings "" config.vim.maps.normalVisualOp; inherit (keymap) desc silent nowait script expr unique noremap;
nmap = toLuaBindings "n" config.vim.maps.normal; };
vmap = toLuaBindings "v" config.vim.maps.visual;
xmap = toLuaBindings "x" config.vim.maps.visualOnly;
smap = toLuaBindings "s" config.vim.maps.select;
imap = toLuaBindings "i" config.vim.maps.insert;
cmap = toLuaBindings "c" config.vim.maps.command;
tmap = toLuaBindings "t" config.vim.maps.terminal;
lmap = toLuaBindings "l" config.vim.maps.lang;
omap = toLuaBindings "o" config.vim.maps.operator;
icmap = toLuaBindings "ic" config.vim.maps.insertCommand;
maps = [ toLuaKeymap = bind: "vim.keymap.set(${toLuaObject bind.mode}, ${toLuaObject bind.key}, ${toLuaObject (getAction bind)}, ${toLuaObject (getOpts bind)})";
nmap
imap maps = concatLines (map toLuaKeymap cfg.keymaps);
vmap
xmap keymaps = maps;
smap
cmap
omap
tmap
lmap
icmap
allmap
];
mappings = concatLines (map concatLines maps);
in { in {
vim = { vim = {
luaConfigRC = { luaConfigRC = {
# `vim.g` and `vim.o`
globalsScript = entryAnywhere (concatLines globalsScript); globalsScript = entryAnywhere (concatLines globalsScript);
# basic, theme optionsScript = entryAfter ["basic"] (concatLines optionsScript);
pluginConfigs = entryAfter ["theme"] pluginConfigs;
# Basic
pluginConfigs = entryAfter ["optionsScript"] pluginConfigs;
extraPluginConfigs = entryAfter ["pluginConfigs"] extraPluginConfigs; extraPluginConfigs = entryAfter ["pluginConfigs"] extraPluginConfigs;
mappings = entryAfter ["extraPluginConfigs"] mappings; mappings = entryAfter ["extraPluginConfigs"] keymaps;
}; };
builtLuaConfigRC = let builtLuaConfigRC = let

View file

@ -129,16 +129,38 @@ in {
globals = mkOption { globals = mkOption {
type = attrs; type = attrs;
default = {}; default = {};
example = {"some_variable" = 42;};
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 option will set vim variables in the
built luaConfigRC as the first item. built luaConfigRC as the first item.
E.g. {foo = "bar"} will set `vim.g.foo` to "bar" where ::: {.note}
the type of `bar` in the resulting vimscript will be `{foo = "bar";}` will set `vim.g.foo` to "bar", where
infered from the type of the value in the `{name = value}` the type of `bar` in the resulting Lua value will be
pair. inferred from the type of the value in the `{name = value;}`
pair passed to the option.
:::
'';
};
options = mkOption {
type = attrs;
default = {};
example = {visualbell = true;};
description = ''
An attribute set containing vim options to be set
as early as possible. If populated, this option will
set vim options in the built luaConfigRC after `basic`
and before `pluginConfigs` DAG entries.
::: {.note}
`{foo = "bar";}` will set `vim.o.foo` to "bar", where
the type of `bar` in the resulting Lua value will be
inferred from the type of the value in the`{name = value;}`
pair passed to the option.
:::
''; '';
}; };