mirror of
https://github.com/NotAShelf/nvf.git
synced 2025-11-10 15:35:30 +00:00
Merge branch 'NotAShelf:main' into feature-language-tex
This commit is contained in:
commit
1b983561a4
41 changed files with 879 additions and 232 deletions
|
|
@ -14,7 +14,7 @@ indent_style = space
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
trim_trailing_whitespace = false
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
[*.{js,nix,yml,yaml}]
|
[*.{js,json,nix,yml,yaml}]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
tab_width = 2
|
tab_width = 2
|
||||||
|
|
|
||||||
|
|
@ -7,14 +7,17 @@ or dependency in this section.
|
||||||
If your pull request aims to fix an open issue or a please bug, please also link the relevant issue
|
If your pull request aims to fix an open issue or a please bug, please also link the relevant issue
|
||||||
below this line. You may attach an issue to your pull request with `Fixes #<issue number>` outside
|
below this line. You may attach an issue to your pull request with `Fixes #<issue number>` outside
|
||||||
this comment, and it will be closed when your pull request is merged.
|
this comment, and it will be closed when your pull request is merged.
|
||||||
|
|
||||||
|
A developer package template is provided in flake/develop.nix. If working on a module, you may use
|
||||||
|
it to test your changes with minimal dependency changes.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
## Sanity Checking
|
## Sanity Checking
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Please check all that apply. As before, this section is not a hard requirement but checklists with more checked
|
Please check all that apply. As before, this section is not a hard requirement but checklists with more checked
|
||||||
items are likely to be merged faster. You may save some time in maintainer review by performing self-reviews here
|
items are likely to be merged faster. You may save some time in maintainer reviews by performing self-reviews
|
||||||
before submitting your pull request.
|
here before submitting your pull request.
|
||||||
|
|
||||||
If your pull request includes any change or unexpected behaviour not covered below, please do make sure to include
|
If your pull request includes any change or unexpected behaviour not covered below, please do make sure to include
|
||||||
it above in your description.
|
it above in your description.
|
||||||
|
|
@ -22,9 +25,11 @@ it above in your description.
|
||||||
|
|
||||||
[editorconfig]: https://editorconfig.org
|
[editorconfig]: https://editorconfig.org
|
||||||
[changelog]: https://github.com/NotAShelf/nvf/tree/main/docs/release-notes
|
[changelog]: https://github.com/NotAShelf/nvf/tree/main/docs/release-notes
|
||||||
|
[hacking nvf]: https://notashelf.github.io/nvf/index.xhtml#sec-guidelines
|
||||||
|
|
||||||
- [ ] I have updated the [changelog] as per my changes
|
- [ ] I have updated the [changelog] as per my changes
|
||||||
- [ ] I have tested, and self-reviewed my code
|
- [ ] I have tested, and self-reviewed my code
|
||||||
|
- [ ] My changes fit guidelines found in [hacking nvf]
|
||||||
- Style and consistency
|
- Style and consistency
|
||||||
- [ ] I ran **Alejandra** to format my code (`nix fmt`)
|
- [ ] I ran **Alejandra** to format my code (`nix fmt`)
|
||||||
- [ ] My code conforms to the [editorconfig] configuration of the project
|
- [ ] My code conforms to the [editorconfig] configuration of the project
|
||||||
|
|
@ -34,9 +39,10 @@ it above in your description.
|
||||||
- [ ] I have added a section in the manual
|
- [ ] I have added a section in the manual
|
||||||
- [ ] _(For breaking changes)_ I have included a migration guide
|
- [ ] _(For breaking changes)_ I have included a migration guide
|
||||||
- Package(s) built:
|
- Package(s) built:
|
||||||
- [ ] `.#nix` (default package)
|
- [ ] `.#nix` _(default package)_
|
||||||
- [ ] `.#maximal`
|
- [ ] `.#maximal`
|
||||||
- [ ] `.#docs-html` (manual, must build)
|
- [ ] `.#docs-html` _(manual, must build)_
|
||||||
|
- [ ] `.#docs-linkcheck` _(optional, please build if adding links)_
|
||||||
- Tested on platform(s)
|
- Tested on platform(s)
|
||||||
- [ ] `x86_64-linux`
|
- [ ] `x86_64-linux`
|
||||||
- [ ] `aarch64-linux`
|
- [ ] `aarch64-linux`
|
||||||
|
|
@ -46,7 +52,8 @@ it above in your description.
|
||||||
<!--
|
<!--
|
||||||
If your changes touch upon a portion of the codebase that you do not understand well, please make sure to consult
|
If your changes touch upon a portion of the codebase that you do not understand well, please make sure to consult
|
||||||
the maintainers on your changes. In most cases, making an issue before creating your PR will help you avoid duplicate
|
the maintainers on your changes. In most cases, making an issue before creating your PR will help you avoid duplicate
|
||||||
efforts in the long run.
|
efforts in the long run. `git blame` might help you find out who is the "author" or the "maintainer" of a current
|
||||||
|
module by showing who worked on it the most.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
|
||||||
72
.github/README.md
vendored
72
.github/README.md
vendored
|
|
@ -50,6 +50,7 @@
|
||||||
[Contribute]: #contributing
|
[Contribute]: #contributing
|
||||||
[FAQ]: #frequently-asked-questions
|
[FAQ]: #frequently-asked-questions
|
||||||
[Credits]: #credits
|
[Credits]: #credits
|
||||||
|
[License]: #license
|
||||||
|
|
||||||
**[<kbd><br> Features <br></kbd>][Features]**
|
**[<kbd><br> Features <br></kbd>][Features]**
|
||||||
**[<kbd><br> Get Started <br></kbd>][Get Started]**
|
**[<kbd><br> Get Started <br></kbd>][Get Started]**
|
||||||
|
|
@ -67,6 +68,10 @@
|
||||||
[standalone]: https://notashelf.github.io/nvf/index.xhtml#ch-standalone-installation
|
[standalone]: https://notashelf.github.io/nvf/index.xhtml#ch-standalone-installation
|
||||||
[NixOS module]: https://notashelf.github.io/nvf/index.xhtml#ch-standalone-nixos
|
[NixOS module]: https://notashelf.github.io/nvf/index.xhtml#ch-standalone-nixos
|
||||||
[Home-Manager module]: https://notashelf.github.io/nvf/index.xhtml#ch-standalone-hm
|
[Home-Manager module]: https://notashelf.github.io/nvf/index.xhtml#ch-standalone-hm
|
||||||
|
[release notes]: https://notashelf.github.io/nvf/release-notes.html
|
||||||
|
[discussions tab]: https://github.com/notashelf/nvf/discussions
|
||||||
|
[FAQ section]: #frequently-asked-questions
|
||||||
|
[DAG]: https://en.wikipedia.org/wiki/Directed_acyclic_graph
|
||||||
|
|
||||||
- **Simple**: One language to rule them all! Use Nix to configure everything,
|
- **Simple**: One language to rule them all! Use Nix to configure everything,
|
||||||
with optional Lua support for robust configurability!
|
with optional Lua support for robust configurability!
|
||||||
|
|
@ -79,11 +84,31 @@
|
||||||
customizable through the Nix module system.
|
customizable through the Nix module system.
|
||||||
- Not comfortable with a full-nix config or want to bring your Lua config? You
|
- Not comfortable with a full-nix config or want to bring your Lua config? You
|
||||||
can do just that, no unnecessary restrictions.
|
can do just that, no unnecessary restrictions.
|
||||||
- Lazyloading? We got it! Lazyload both internal and external plugins at will.
|
- Lazyloading 💤? We got it! Lazyload both internal and external plugins at
|
||||||
|
will.
|
||||||
|
- nvf allows _ordering configuration bits_ using [DAG] (_Directed acyclic
|
||||||
|
graph_)s. It has never been easier to construct an editor configuration
|
||||||
|
deterministically!
|
||||||
|
- nvf exposes everything you need to avoid a vendor lock-in. Which means you
|
||||||
|
can add new modules, plugins and so on without relying on us adding a module
|
||||||
|
for them! Though, of course, feel free to request them.
|
||||||
|
- Use plugins from anywhere. Inputs, npins, nixpkgs... You name it.
|
||||||
|
- Add your own modules, with ease. It's all built-in!
|
||||||
- **Well-documented**: Documentation is priority. You will _never_ face
|
- **Well-documented**: Documentation is priority. You will _never_ face
|
||||||
undocumented, obscure behaviour.
|
undocumented, obscure behaviour.
|
||||||
|
- Changes, breaking or otherwise, will be communicated in the [release notes]
|
||||||
|
- Refer to the [FAQ section] for answers to common questions.
|
||||||
|
- Your question not there? Head to the to the [discussions tab]!
|
||||||
- **Idiomatic**: nvf does things ✨ _the right way_ ✨ - the codebase is, and
|
- **Idiomatic**: nvf does things ✨ _the right way_ ✨ - the codebase is, and
|
||||||
will, remain maintainable for myself and any contributors.
|
will, remain maintainable for myself and any contributors.
|
||||||
|
- **Community-Led**: we would like nvf to be fully capable of accomplishing what
|
||||||
|
you really want it to do. If you have a use case that is not made possible by
|
||||||
|
nvf, please open an issue (or a pull request!)
|
||||||
|
- Your feedback is more than welcome! Feedback is what _drives_ nvf forward.
|
||||||
|
If you have anything to say, or ask, please let us know.
|
||||||
|
- Pull requests are _always_ welcome. If you think the project can benefit
|
||||||
|
from something you did locally, but are not quite sure how to upstream,
|
||||||
|
please feel free to contact us! We'll help you get it done.
|
||||||
|
|
||||||
## Get Started
|
## Get Started
|
||||||
|
|
||||||
|
|
@ -173,36 +198,49 @@ fix.
|
||||||
[list of open pull requests]: https://github.com/NotAShelf/nvf/pulls
|
[list of open pull requests]: https://github.com/NotAShelf/nvf/pulls
|
||||||
|
|
||||||
**Q**: What platforms are supported?
|
**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 [nvf manual]
|
**A**: nvf actively supports **Linux and Darwin** platforms using standalone
|
||||||
for available installation instructions.
|
Nix, NixOS or Home-Manager. Please take a look at the [nvf manual] for available
|
||||||
|
installation instructions.
|
||||||
|
|
||||||
**Q**: Can you add _X_?
|
**Q**: Can you add _X_?
|
||||||
<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 to
|
||||||
**nvf**. Use the appropriate [issue template] and I will consider a module
|
**nvf**. Use the appropriate [issue template] and I will consider a module
|
||||||
addition. As mentioned before, pull requests to add new features are also
|
addition. As mentioned before, pull requests to add new features are also
|
||||||
welcome.
|
welcome.
|
||||||
|
|
||||||
**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/> **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.
|
**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.
|
||||||
|
|
||||||
**Q**: Main branch is awfully silent, is the project dead?
|
**Q**: Main branch is awfully silent, is the project dead?
|
||||||
<br/> **A**: No! Sometimes we branch out (e.g. `v0.6`) to avoid breaking
|
|
||||||
userspace and work in a separate branch until we make sure the new additions are
|
**A**: No! Sometimes we branch out (e.g. `v0.6`) to avoid breaking userspace and
|
||||||
implemented in the most comfortable way possible for the end user. If you have
|
work in a separate branch until we make sure the new additions are implemented
|
||||||
not noticed any activity on the main branch, consider taking a look at the
|
in the most comfortable way possible for the end user. If you have not noticed
|
||||||
|
any activity on the main branch, consider taking a look at the
|
||||||
[list of branches] or the [list of open pull requests]. You may also consider
|
[list of branches] or the [list of open pull requests]. You may also consider
|
||||||
_testing_ those release branches to get access to new features ahead of time and
|
_testing_ those release branches to get access to new features ahead of time and
|
||||||
better prepare to breaking changes.
|
better prepare to breaking changes.
|
||||||
|
|
||||||
**Q**: Will you support non-flake installations?
|
**Q**: Will you support non-flake installations?
|
||||||
<br/> **A**: Quite possibly. **nvf** started as "neovim-flake", which does mean
|
|
||||||
it is and will remain flakes-first but we might consider non-flakes
|
**A**: Quite possibly. **nvf** started as "neovim-flake", which does mean it is
|
||||||
compatibility. Though keep in mind that **nvf** under non-flake environments
|
and will remain flakes-first but we might consider non-flakes compatibility.
|
||||||
would lose customizability of plugin inputs, which is one of our primary
|
Though keep in mind that **nvf** under non-flake environments would lose
|
||||||
features.
|
customizability of plugin inputs, which is one of our primary features.
|
||||||
|
|
||||||
|
**Q**: I prefer working with Lua, can I use nvf as a plugin manager while I use
|
||||||
|
an imperative path (e.g., `~/.config/nvim`) for my Neovim configuration instead
|
||||||
|
of a configuration generated from Nix?
|
||||||
|
|
||||||
|
**A**: Yes! Add `"~/.config.nvim"` to `vim.additionalRuntimePaths = [ ... ]` and
|
||||||
|
any plugins you want to load to `vim.startPlugins`. This will load your
|
||||||
|
configuration from `~/.config/nvim`. You may still use `vim.*` to modify
|
||||||
|
Neovim's behaviour with Nix.
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
|
|
||||||
|
|
@ -245,7 +283,7 @@ and everyone who has submitted issues or pull requests!
|
||||||
|
|
||||||
### Inspiration
|
### Inspiration
|
||||||
|
|
||||||
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)
|
- [@jordanisaacs's](https://github.com/jordanisaacs)
|
||||||
|
|
|
||||||
1
.github/workflows/cachix.yml
vendored
1
.github/workflows/cachix.yml
vendored
|
|
@ -35,7 +35,6 @@ jobs:
|
||||||
|
|
||||||
- name: Install Nix
|
- name: Install Nix
|
||||||
uses: DeterminateSystems/nix-installer-action@main
|
uses: DeterminateSystems/nix-installer-action@main
|
||||||
- uses: DeterminateSystems/magic-nix-cache-action@main
|
|
||||||
|
|
||||||
- uses: cachix/cachix-action@v15
|
- uses: cachix/cachix-action@v15
|
||||||
with:
|
with:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
# This is the sample configuration for nvf, aiming to give you a feel of the default options
|
# This is the sample configuration for nvf, aiming to give you a feel of the default options
|
||||||
# while certain plugins are enabled. While it may act as one, this is not an overview of nvf's
|
# while certain plugins are enabled. While it may partially act as one, this is *not* quite
|
||||||
# module options. To find a complete overview of nvf's options and examples, visit the manual.
|
# an overview of nvf's module options. To find a complete and curated list of nvf module
|
||||||
|
# options, examples, instruction tutorials and more; please visit the online manual.
|
||||||
# https://notashelf.github.io/nvf/options.html
|
# https://notashelf.github.io/nvf/options.html
|
||||||
isMaximal: {
|
isMaximal: {
|
||||||
config.vim = {
|
config.vim = {
|
||||||
|
|
|
||||||
|
|
@ -102,7 +102,7 @@ in
|
||||||
--script script/anchor-use.js \
|
--script script/anchor-use.js \
|
||||||
--script script/anchor-min.js \
|
--script script/anchor-min.js \
|
||||||
--script script/search.js \
|
--script script/search.js \
|
||||||
--toc-depth 2 \
|
--toc-depth 1 \
|
||||||
--section-toc-depth 1 \
|
--section-toc-depth 1 \
|
||||||
manual.md \
|
manual.md \
|
||||||
"$dest/index.xhtml"
|
"$dest/index.xhtml"
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,13 @@
|
||||||
# Neovim Flake Configuration Options {#ch-options}
|
# nvf Configuration Options {#ch-options}
|
||||||
|
|
||||||
Below are the module options provided by nvf, in no particular order. Most
|
Below are the module options provided by nvf, in no particular order. Most
|
||||||
options will include useful comments, warnings or setup tips on how a module
|
options will include useful comments, warnings or setup tips on how a module
|
||||||
option is meant to be used as well as examples in complex cases.
|
option is meant to be used as well as examples in complex cases.
|
||||||
|
|
||||||
|
An offline version of this page is bundled with nvf as a part of the manpages
|
||||||
|
which you can access with `man 5 nvf`. Please us know if you believe any of the
|
||||||
|
options below are missing useful examples.
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
In the manual, individual options may be referenced in Hyperlinks as follows:
|
In the manual, individual options may be referenced in Hyperlinks as follows:
|
||||||
[](#opt-vim.*) If changing the prefix here, do keep in mind the #opt- suffix will have
|
[](#opt-vim.*) If changing the prefix here, do keep in mind the #opt- suffix will have
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
# Helpful Tips {#ch-helpful-tips}
|
# Helpful Tips {#ch-helpful-tips}
|
||||||
|
|
||||||
```{=include=} chapters
|
```{=include=} chapters
|
||||||
|
tips/pure-lua-config.md
|
||||||
tips/debugging-nvf.md
|
tips/debugging-nvf.md
|
||||||
tips/offline-docs.md
|
tips/offline-docs.md
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -17,3 +17,9 @@ nvf-print-config | bat --language=lua
|
||||||
```
|
```
|
||||||
|
|
||||||
Alternatively, `cat` or `less` may also be used.
|
Alternatively, `cat` or `less` may also be used.
|
||||||
|
|
||||||
|
## Accessing `neovimConfig` {#sec-accessing-config}
|
||||||
|
|
||||||
|
It is also possible to access the configuration for the wrapped package. The
|
||||||
|
_built_ Neovim package will contain a `neovimConfig` attribute in its
|
||||||
|
`passthru`.
|
||||||
|
|
|
||||||
117
docs/manual/tips/pure-lua-config.md
Normal file
117
docs/manual/tips/pure-lua-config.md
Normal file
|
|
@ -0,0 +1,117 @@
|
||||||
|
# Pure Lua Configuration {#sec-pure-lua-config}
|
||||||
|
|
||||||
|
We recognize that you might not always want to configure your setup purely in
|
||||||
|
Nix, sometimes doing things in Lua is simply the "superior" option. In such a
|
||||||
|
case you might want to configure your Neovim instance using Lua, and nothing but
|
||||||
|
Lua. It is also possible to mix Lua and Nix configurations.
|
||||||
|
|
||||||
|
Pure Lua or hybrid Lua/Nix configurations can be achieved in two different ways.
|
||||||
|
_Purely_, by modifying Neovim's runtime directory or _impurely_ by placing Lua
|
||||||
|
configuration in a directory found in `$HOME`. For your convenience, this
|
||||||
|
section will document both methods as they can be used.
|
||||||
|
|
||||||
|
## Pure Runtime Directory {#sec-pure-nvf-runtime}
|
||||||
|
|
||||||
|
As of 0.6, nvf allows you to modify Neovim's runtime path to suit your needs.
|
||||||
|
One of the ways the new runtime option is to add a configuration **located
|
||||||
|
relative to your `flake.nix`**, which must be version controlled in pure flakes
|
||||||
|
manner.
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{
|
||||||
|
# Let us assume we are in the repository root, i.e., the same directory as the
|
||||||
|
# flake.nix. For the sake of the argument, we will assume that the Neovim lua
|
||||||
|
# configuration is in a nvim/ directory relative to flake.nix.
|
||||||
|
vim = {
|
||||||
|
additionalRuntimeDirectories = [
|
||||||
|
# This will be added to Neovim's runtime paths. Conceptually, this behaves
|
||||||
|
# very similarly to ~/.config/nvim but you may not place a top-level
|
||||||
|
# init.lua to be able to require it directly.
|
||||||
|
./nvim
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This will add the `nvim` directory, or rather, the _store path_ that will be
|
||||||
|
realised after your flake gets copied to the Nix store, to Neovim's runtime
|
||||||
|
directory. You may now create a `lua/myconfig` directory within this nvim
|
||||||
|
directory, and call it with [](#opt-vim.luaConfigRC).
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{pkgs, ...}: {
|
||||||
|
vim = {
|
||||||
|
additionalRuntimeDirectories = [
|
||||||
|
# You can list more than one file here.
|
||||||
|
./nvim-custom-1
|
||||||
|
|
||||||
|
# To make sure list items are ordered, use lib.mkBefore or lib.mkAfter
|
||||||
|
# Simply placing list items in a given order will **not** ensure that
|
||||||
|
# this list will be deterministic.
|
||||||
|
./nvim-custom-2
|
||||||
|
];
|
||||||
|
|
||||||
|
startPlugins = [pkgs.vimPlugins.gitsigns];
|
||||||
|
|
||||||
|
# Neovim supports in-line syntax highlighting for multi-line strings.
|
||||||
|
# Simply place the filetype in a /* comment */ before the line.
|
||||||
|
luaConfigRC.myconfig = /* lua */ ''
|
||||||
|
-- Call the Lua module from ./nvim/lua/myconfig
|
||||||
|
require("myconfig")
|
||||||
|
|
||||||
|
-- Any additional Lua configuration that you might want *after* your own
|
||||||
|
-- configuration. For example, a plugin setup call.
|
||||||
|
require('gitsigns').setup({})
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Impure Absolute Directory {#sec-impure-absolute-dir}
|
||||||
|
|
||||||
|
[Neovim 0.9]: https://github.com/neovim/neovim/pull/22128
|
||||||
|
|
||||||
|
As of [Neovim 0.9], {var}`$NVIM_APPNAME` is a variable expected by Neovim to
|
||||||
|
decide on the configuration directory. nvf sets this variable as `"nvf"`,
|
||||||
|
meaning `~/.config/nvf` will be regarded as _the_ configuration directory by
|
||||||
|
Neovim, similar to how `~/.config/nvim` behaves in regular installations. This
|
||||||
|
allows some degree of Lua configuration, backed by our low-level wrapper
|
||||||
|
[mnw](https://github.com/Gerg-L/mnw). Creating a `lua/` directory located in
|
||||||
|
`$NVIM_APPNAME` ("nvf" by default) and placing your configuration in, e.g.,
|
||||||
|
`~/.config/nvf/lua/myconfig` will allow you to `require` it as a part of the Lua
|
||||||
|
module system through nvf's module system.
|
||||||
|
|
||||||
|
Let's assume your `~/.config/nvf/lua/myconfig/init.lua` consists of the
|
||||||
|
following:
|
||||||
|
|
||||||
|
```lua
|
||||||
|
-- init.lua
|
||||||
|
vim.keymap.set("n", " ", "<Nop>", { silent = true, remap = false })
|
||||||
|
vim.g.mapleader = " "
|
||||||
|
```
|
||||||
|
|
||||||
|
The following Nix configuration via [](#opt-vim.luaConfigRC) will allow loading
|
||||||
|
this
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{
|
||||||
|
# The attribute name "myconfig-dir" here is arbitrary. It is required to be
|
||||||
|
# a *named* attribute by the DAG system, but the name is entirely up to you.
|
||||||
|
vim.luaConfigRC.myconfig-dir = ''
|
||||||
|
require("myconfig")
|
||||||
|
|
||||||
|
-- Any additional Lua
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
[DAG system]: https://notashelf.github.io/nvf/index.xhtml#ch-using-dags
|
||||||
|
|
||||||
|
After you load your custom configuration, you may use an `init.lua` located in
|
||||||
|
your custom configuration directory to configure Neovim exactly as you would
|
||||||
|
without a wrapper like nvf. If you want to place your `require` call in a
|
||||||
|
specific position (i.e., before or after options you set in nvf) the
|
||||||
|
[DAG system] will let you place your configuration in a location of your
|
||||||
|
choosing.
|
||||||
|
|
||||||
|
[top-level DAG system]: https://notashelf.github.io/nvf/index.xhtml#ch-vim-luaconfigrc
|
||||||
|
|
@ -47,6 +47,12 @@
|
||||||
|
|
||||||
- Add Haskell support under `vim.languages.haskell` using [haskell-tools.nvim].
|
- Add Haskell support under `vim.languages.haskell` using [haskell-tools.nvim].
|
||||||
|
|
||||||
|
[horriblename](https://github.com/horriblename):
|
||||||
|
|
||||||
|
[blink.cmp]: https://github.com/saghen/blink.cmp
|
||||||
|
|
||||||
|
- Add [blink.cmp] support
|
||||||
|
|
||||||
[diniamo](https://github.com/diniamo):
|
[diniamo](https://github.com/diniamo):
|
||||||
|
|
||||||
- Add Odin support under `vim.languages.odin`.
|
- Add Odin support under `vim.languages.odin`.
|
||||||
|
|
@ -139,3 +145,7 @@
|
||||||
|
|
||||||
- Add `vim.languages.zig.dap` support through pkgs.lldb dap adapter. Code
|
- Add `vim.languages.zig.dap` support through pkgs.lldb dap adapter. Code
|
||||||
Inspiration from `vim.languages.clang.dap` implementation.
|
Inspiration from `vim.languages.clang.dap` implementation.
|
||||||
|
|
||||||
|
[nezia1](https://github.com/nezia1)
|
||||||
|
|
||||||
|
- Add support for [nixd](https://github.com/nix-community/nixd) language server.
|
||||||
|
|
|
||||||
34
flake.lock
generated
34
flake.lock
generated
|
|
@ -167,6 +167,38 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"plugin-blink-cmp": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1736295934,
|
||||||
|
"narHash": "sha256-MfHI4efAdaoCU8si6YFdznZmSTprthDq3YKuF91z7ss=",
|
||||||
|
"owner": "saghen",
|
||||||
|
"repo": "blink.cmp",
|
||||||
|
"rev": "1cc3b1a908fbcfd15451c4772759549724f38524",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "saghen",
|
||||||
|
"repo": "blink.cmp",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"plugin-blink-compat": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1734896240,
|
||||||
|
"narHash": "sha256-Rrrh+O3FbBnaAnCHwPuQyfhH+XueSkQp6ipEkn6esGY=",
|
||||||
|
"owner": "saghen",
|
||||||
|
"repo": "blink.compat",
|
||||||
|
"rev": "74b251a1e9478c4fa6d7c6bc2921d7124e6f6cbb",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "saghen",
|
||||||
|
"repo": "blink.compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"plugin-bufdelete-nvim": {
|
"plugin-bufdelete-nvim": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
|
|
@ -2788,6 +2820,8 @@
|
||||||
"plugin-aerial-nvim": "plugin-aerial-nvim",
|
"plugin-aerial-nvim": "plugin-aerial-nvim",
|
||||||
"plugin-alpha-nvim": "plugin-alpha-nvim",
|
"plugin-alpha-nvim": "plugin-alpha-nvim",
|
||||||
"plugin-base16": "plugin-base16",
|
"plugin-base16": "plugin-base16",
|
||||||
|
"plugin-blink-cmp": "plugin-blink-cmp",
|
||||||
|
"plugin-blink-compat": "plugin-blink-compat",
|
||||||
"plugin-bufdelete-nvim": "plugin-bufdelete-nvim",
|
"plugin-bufdelete-nvim": "plugin-bufdelete-nvim",
|
||||||
"plugin-catppuccin": "plugin-catppuccin",
|
"plugin-catppuccin": "plugin-catppuccin",
|
||||||
"plugin-ccc": "plugin-ccc",
|
"plugin-ccc": "plugin-ccc",
|
||||||
|
|
|
||||||
12
flake.nix
12
flake.nix
|
|
@ -17,6 +17,8 @@
|
||||||
# «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/templates
|
||||||
|
|
||||||
./flake/apps.nix
|
./flake/apps.nix
|
||||||
./flake/legacyPackages.nix
|
./flake/legacyPackages.nix
|
||||||
./flake/overlays.nix
|
./flake/overlays.nix
|
||||||
|
|
@ -292,6 +294,16 @@
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
plugin-blink-cmp = {
|
||||||
|
url = "github:saghen/blink.cmp";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-blink-compat = {
|
||||||
|
url = "github:saghen/blink.compat";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
plugin-nvim-cmp = {
|
plugin-nvim-cmp = {
|
||||||
url = "github:hrsh7th/nvim-cmp";
|
url = "github:hrsh7th/nvim-cmp";
|
||||||
flake = false;
|
flake = false;
|
||||||
|
|
|
||||||
|
|
@ -9,10 +9,14 @@
|
||||||
overlays = [
|
overlays = [
|
||||||
inputs.self.overlays.default
|
inputs.self.overlays.default
|
||||||
|
|
||||||
(_: _: {
|
(final: _: {
|
||||||
# Build nil from source to get most recent
|
# Build nil from source to get most recent
|
||||||
# features as they are added.
|
# features as they are added.
|
||||||
nil = inputs'.nil.packages.default;
|
nil = inputs'.nil.packages.default;
|
||||||
|
blink-cmp = final.callPackage ./legacyPackages/blink-cmp.nix {
|
||||||
|
src = inputs.plugin-blink-cmp;
|
||||||
|
version = inputs.plugin-blink-cmp.shortRev or inputs.plugin-blink-cmp.shortDirtyRev or "dirty";
|
||||||
|
};
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
|
||||||
38
flake/legacyPackages/blink-cmp.nix
Normal file
38
flake/legacyPackages/blink-cmp.nix
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
{
|
||||||
|
rustPlatform,
|
||||||
|
hostPlatform,
|
||||||
|
vimUtils,
|
||||||
|
git,
|
||||||
|
src,
|
||||||
|
version,
|
||||||
|
}: let
|
||||||
|
blink-fuzzy-lib = rustPlatform.buildRustPackage {
|
||||||
|
pname = "blink-fuzzy-lib";
|
||||||
|
inherit version src;
|
||||||
|
|
||||||
|
env = {
|
||||||
|
# TODO: remove this if plugin stops using nightly rust
|
||||||
|
RUSTC_BOOTSTRAP = true;
|
||||||
|
};
|
||||||
|
nativeBuildInputs = [git];
|
||||||
|
cargoLock = {
|
||||||
|
lockFile = "${src}/Cargo.lock";
|
||||||
|
allowBuiltinFetchGit = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
libExt =
|
||||||
|
if hostPlatform.isDarwin
|
||||||
|
then "dylib"
|
||||||
|
else "so";
|
||||||
|
in
|
||||||
|
vimUtils.buildVimPlugin {
|
||||||
|
pname = "blink-cmp";
|
||||||
|
inherit version src;
|
||||||
|
|
||||||
|
# blink references a repro.lua which is placed outside the lua/ directory
|
||||||
|
doCheck = false;
|
||||||
|
preInstall = ''
|
||||||
|
mkdir -p target/release
|
||||||
|
ln -s ${blink-fuzzy-lib}/lib/libblink_cmp_fuzzy.${libExt} target/release/libblink_cmp_fuzzy.${libExt}
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
|
@ -10,10 +10,10 @@
|
||||||
nixConfig = import ../configuration.nix false;
|
nixConfig = import ../configuration.nix false;
|
||||||
maximalConfig = import ../configuration.nix true;
|
maximalConfig = import ../configuration.nix true;
|
||||||
in {
|
in {
|
||||||
flake.overlays.default = _final: prev: {
|
flake.overlays.default = final: _prev: {
|
||||||
inherit neovimConfiguration;
|
inherit neovimConfiguration;
|
||||||
neovim-nix = buildPkg prev [nixConfig];
|
neovim-nix = buildPkg final [nixConfig];
|
||||||
neovim-maximal = buildPkg prev [maximalConfig];
|
neovim-maximal = buildPkg final [maximalConfig];
|
||||||
devPkg = buildPkg pkgs [nixConfig {config.vim.languages.html.enable = pkgs.lib.mkForce true;}];
|
devPkg = buildPkg pkgs [nixConfig {config.vim.languages.html.enable = pkgs.lib.mkForce true;}];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,11 @@
|
||||||
in
|
in
|
||||||
pkgs.testers.lycheeLinkCheck {
|
pkgs.testers.lycheeLinkCheck {
|
||||||
inherit site;
|
inherit site;
|
||||||
|
|
||||||
remap = {
|
remap = {
|
||||||
"https://notashelf.github.io/nvf/" = site;
|
"https://notashelf.github.io/nvf/" = site;
|
||||||
};
|
};
|
||||||
|
|
||||||
extraConfig = {
|
extraConfig = {
|
||||||
exclude = [];
|
exclude = [];
|
||||||
include_mail = true;
|
include_mail = true;
|
||||||
|
|
@ -29,43 +31,39 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
# Build and open the built manual in your system browser
|
# Helper utility for building the HTML manual and opening it in the
|
||||||
docs-html-wrapped = pkgs.writeScriptBin "docs-html-wrapped" ''
|
# browser with $BROWSER or using xdg-open as a fallback tool.
|
||||||
#!${pkgs.stdenv.shell}
|
# Adapted from Home-Manager, available under the MIT license.
|
||||||
# use xdg-open to open the docs in the browser
|
docs-html-wrapped = let
|
||||||
${pkgs.xdg-utils}/bin/xdg-open ${docs.manual.html}
|
xdg-open = lib.getExe' pkgs.xdg-utils "xdg-open";
|
||||||
'';
|
docs-html = docs.manual.html + /share/doc/nvf;
|
||||||
|
in
|
||||||
|
pkgs.writeShellScriptBin "docs-html-wrapped" ''
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
if [[ ! -v BROWSER || -z $BROWSER ]]; then
|
||||||
|
for candidate in xdg-open open w3m; do
|
||||||
|
BROWSER="$(type -P $candidate || true)"
|
||||||
|
if [[ -x $BROWSER ]]; then
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -v BROWSER || -z $BROWSER ]]; then
|
||||||
|
echo "$0: unable to start a web browser; please set \$BROWSER"
|
||||||
|
echo "$0: Trying xdg-open as a fallback"
|
||||||
|
${xdg-open} ${docs-html}/index.xhtml
|
||||||
|
else
|
||||||
|
echo "\$BROWSER is set. Attempting to open manual"
|
||||||
|
exec "$BROWSER" "${docs-html}/index.xhtml"
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
|
||||||
# Exposed neovim configurations
|
# Exposed neovim configurations
|
||||||
nix = config.legacyPackages.neovim-nix;
|
nix = config.legacyPackages.neovim-nix;
|
||||||
maximal = config.legacyPackages.neovim-maximal;
|
maximal = config.legacyPackages.neovim-maximal;
|
||||||
default = config.legacyPackages.neovim-nix;
|
default = config.legacyPackages.neovim-nix;
|
||||||
|
|
||||||
# Published docker images
|
|
||||||
docker-nix = let
|
|
||||||
inherit (pkgs) bash gitFull buildEnv;
|
|
||||||
inherit (config.legacyPackages) neovim-nix;
|
|
||||||
in
|
|
||||||
pkgs.dockerTools.buildImage {
|
|
||||||
name = "nvf";
|
|
||||||
tag = "latest";
|
|
||||||
|
|
||||||
copyToRoot = buildEnv {
|
|
||||||
name = "neovim-root";
|
|
||||||
pathsToLink = ["/bin"];
|
|
||||||
paths = [
|
|
||||||
neovim-nix
|
|
||||||
gitFull
|
|
||||||
bash
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
config = {
|
|
||||||
Cmd = ["${neovim-nix}/bin/nvim"];
|
|
||||||
WorkingDir = "/home/neovim/demo";
|
|
||||||
Volumes = {"/home/neovim/demo" = {};};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
17
flake/templates/default.nix
Normal file
17
flake/templates/default.nix
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
flake.templates = {
|
||||||
|
standalone = {
|
||||||
|
path = ./standalone;
|
||||||
|
description = "Standalone flake template for nvf";
|
||||||
|
welcomeText = ''
|
||||||
|
Template flake.nix has been created in flake.nix!
|
||||||
|
|
||||||
|
Note that this is a very basic example to bootstrap nvf for you. Please edit your
|
||||||
|
configuration as described in the nvf manual before using this template. The
|
||||||
|
configured packages will be ran with 'nix run .' or 'nix run .#neovimConfigured'
|
||||||
|
|
||||||
|
Happy editing!
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
64
flake/templates/standalone/flake.nix
Normal file
64
flake/templates/standalone/flake.nix
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
nvf.url = "github:notashelf/nvf";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = {
|
||||||
|
self,
|
||||||
|
nixpkgs,
|
||||||
|
...
|
||||||
|
} @ inputs: let
|
||||||
|
# An abstraction over systems to easily provide the same package
|
||||||
|
# for multiple systems. This is preferable to abstraction libraries.
|
||||||
|
forEachSystem = nixpkgs.lib.genAttrs ["x86_64-linux"];
|
||||||
|
in {
|
||||||
|
packages = forEachSystem (system: let
|
||||||
|
pkgs = inputs.nixpkgs.legacyPackages.${system};
|
||||||
|
|
||||||
|
# A module to be evaluated via lib.evalModules inside nvf's module system.
|
||||||
|
# All options supported by nvf will go under config.vim to create the final
|
||||||
|
# wrapped package. You may also add some new *options* under options.* to
|
||||||
|
# expand the module system.
|
||||||
|
configModule = {
|
||||||
|
# You may browse available options for nvf on the online manual. Please see
|
||||||
|
# <https://notashelf.github.io/nvf/options.html>
|
||||||
|
config.vim = {
|
||||||
|
theme.enable = true;
|
||||||
|
|
||||||
|
# Language support and automatic configuration of companion plugins.
|
||||||
|
# Note that enabling, e.g., languages.<lang>.diagnostics will automatically
|
||||||
|
# enable top-level options such as enableLSP or enableExtraDiagnostics as
|
||||||
|
# they are needed.
|
||||||
|
languages = {
|
||||||
|
enableLSP = true;
|
||||||
|
enableFormat = true;
|
||||||
|
enableTreesitter = true;
|
||||||
|
enableExtraDiagnostics = true;
|
||||||
|
|
||||||
|
# Nix language and diagnostics.
|
||||||
|
nix.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Evaluate any and all modules to create the wrapped Neovim package.
|
||||||
|
neovimConfigured = inputs.nvf.lib.neovimConfiguration {
|
||||||
|
inherit pkgs;
|
||||||
|
|
||||||
|
modules = [
|
||||||
|
# Configuration module to be imported. You may define multiple modules
|
||||||
|
# or even import them from other files (e.g., ./modules/lsp.nix) to
|
||||||
|
# better modularize your configuration.
|
||||||
|
configModule
|
||||||
|
];
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
# Packages to be exposed under packages.<system>. Those can accessed
|
||||||
|
# directly from package outputs in other flakes if this flake is added
|
||||||
|
# as an input. You may run those packages with 'nix run .#<package>'
|
||||||
|
default = self.packages.${system}.neovim;
|
||||||
|
neovimConfigured = neovimConfigured.neovim;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
28
lib/dag.nix
28
lib/dag.nix
|
|
@ -24,7 +24,7 @@ in {
|
||||||
entryAfter, and entryBefore to a topologically sorted list of
|
entryAfter, and entryBefore to a topologically sorted list of
|
||||||
entries.
|
entries.
|
||||||
|
|
||||||
Internally this function uses the `toposort` function in
|
Internally this function uses the `topoSort` function in
|
||||||
`<nixpkgs/lib/lists.nix>` and its value is accordingly.
|
`<nixpkgs/lib/lists.nix>` and its value is accordingly.
|
||||||
|
|
||||||
Specifically, the result on success is
|
Specifically, the result on success is
|
||||||
|
|
@ -136,16 +136,26 @@ in {
|
||||||
entriesAfter = tag: entriesBetween tag [];
|
entriesAfter = tag: entriesBetween tag [];
|
||||||
entriesBefore = tag: before: entriesBetween tag before [];
|
entriesBefore = tag: before: entriesBetween tag before [];
|
||||||
|
|
||||||
# mkLuarcSection and mkVimrcSection take a section DAG
|
# mkLuarcSection takes a section DAG, containing 'name' and 'data' fields
|
||||||
# and return a string containing a comment to identify
|
# then returns a string containing a comment to identify the section, and
|
||||||
|
# the data contained within the section.
|
||||||
# the section, and the data contained within the section
|
# the section, and the data contained within the section
|
||||||
#
|
#
|
||||||
# all operations are done without any modifications
|
# All operations are done without any modifications to the inputted section
|
||||||
# to the inputted section data
|
# data, but if a non-string is passed to name or data, then it will try to
|
||||||
mkLuarcSection = section: ''
|
# coerce it into a string, which may fail. Setting data to "" or null will
|
||||||
-- SECTION: ${section.name}
|
# return an empty string.
|
||||||
${section.data}
|
#
|
||||||
'';
|
# section.data should never be null, though taking 'null' as a value that
|
||||||
|
# can "clear" the DAG might come in handy for filtering sections more easily.
|
||||||
|
# Or perhaps simply unsetting them from an user perspective.
|
||||||
|
mkLuarcSection = section:
|
||||||
|
if section.data == "" || section.data == null
|
||||||
|
then ""
|
||||||
|
else ''
|
||||||
|
-- SECTION: ${section.name}
|
||||||
|
${section.data}
|
||||||
|
'';
|
||||||
|
|
||||||
resolveDag = {
|
resolveDag = {
|
||||||
name,
|
name,
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
inherit (lib.nvim.config) batchRenameOptions;
|
inherit (lib.nvim.config) batchRenameOptions;
|
||||||
|
|
||||||
renamedVimOpts = batchRenameOptions ["vim"] ["vim" "options"] {
|
renamedVimOpts = batchRenameOptions ["vim"] ["vim" "options"] {
|
||||||
|
# 2024-12-01
|
||||||
colourTerm = "termguicolors";
|
colourTerm = "termguicolors";
|
||||||
mouseSupport = "mouse";
|
mouseSupport = "mouse";
|
||||||
cmdHeight = "cmdheight";
|
cmdHeight = "cmdheight";
|
||||||
|
|
@ -15,6 +16,9 @@
|
||||||
autoIndent = "autoindent";
|
autoIndent = "autoindent";
|
||||||
wordWrap = "wrap";
|
wordWrap = "wrap";
|
||||||
showSignColumn = "signcolumn";
|
showSignColumn = "signcolumn";
|
||||||
|
|
||||||
|
# 2025-02-07
|
||||||
|
scrollOff = "scrolloff";
|
||||||
};
|
};
|
||||||
in {
|
in {
|
||||||
imports = concatLists [
|
imports = concatLists [
|
||||||
|
|
@ -93,9 +97,15 @@ in {
|
||||||
|
|
||||||
# 2024-12-02
|
# 2024-12-02
|
||||||
(mkRenamedOptionModule ["vim" "enableEditorconfig"] ["vim" "globals" "editorconfig"])
|
(mkRenamedOptionModule ["vim" "enableEditorconfig"] ["vim" "globals" "editorconfig"])
|
||||||
|
|
||||||
|
# 2025-02-06
|
||||||
|
(mkRemovedOptionModule ["vim" "disableArrows"] ''
|
||||||
|
Top-level convenience options are now in the process of being removed from nvf as
|
||||||
|
their behaviour was abstract, and confusing. Please use 'vim.options' or 'vim.luaConfigRC'
|
||||||
|
to replicate previous behaviour.
|
||||||
|
'')
|
||||||
]
|
]
|
||||||
|
|
||||||
# 2024-12-01
|
|
||||||
# Migrated via batchRenameOptions. Further batch renames must be below this line.
|
# Migrated via batchRenameOptions. Further batch renames must be below this line.
|
||||||
renamedVimOpts
|
renamedVimOpts
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -16,12 +16,6 @@
|
||||||
cfg = config.vim;
|
cfg = config.vim;
|
||||||
in {
|
in {
|
||||||
options.vim = {
|
options.vim = {
|
||||||
disableArrows = mkOption {
|
|
||||||
type = bool;
|
|
||||||
default = false;
|
|
||||||
description = "Set to prevent arrow keys from moving cursor";
|
|
||||||
};
|
|
||||||
|
|
||||||
hideSearchHighlight = mkOption {
|
hideSearchHighlight = mkOption {
|
||||||
type = bool;
|
type = bool;
|
||||||
default = false;
|
default = false;
|
||||||
|
|
|
||||||
|
|
@ -26,34 +26,6 @@
|
||||||
in {
|
in {
|
||||||
config = {
|
config = {
|
||||||
vim.keymaps = mkMerge [
|
vim.keymaps = mkMerge [
|
||||||
(
|
|
||||||
mkIf cfg.disableArrows [
|
|
||||||
{
|
|
||||||
key = "<up>";
|
|
||||||
mode = ["n" "i"];
|
|
||||||
action = "<nop>";
|
|
||||||
noremap = false;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
key = "<down>";
|
|
||||||
mode = ["n" "i"];
|
|
||||||
action = "<nop>";
|
|
||||||
noremap = false;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
key = "<left>";
|
|
||||||
mode = ["n" "i"];
|
|
||||||
action = "<nop>";
|
|
||||||
noremap = false;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
key = "<right>";
|
|
||||||
mode = ["n" "i"];
|
|
||||||
action = "<nop>";
|
|
||||||
noremap = false;
|
|
||||||
}
|
|
||||||
]
|
|
||||||
)
|
|
||||||
(
|
(
|
||||||
pipe cfg.maps
|
pipe cfg.maps
|
||||||
[
|
[
|
||||||
|
|
|
||||||
120
modules/plugins/completion/blink-cmp/blink-cmp.nix
Normal file
120
modules/plugins/completion/blink-cmp/blink-cmp.nix
Normal file
|
|
@ -0,0 +1,120 @@
|
||||||
|
{lib, ...}: let
|
||||||
|
inherit (lib.options) mkEnableOption mkOption literalMD;
|
||||||
|
inherit (lib.types) listOf str either attrsOf submodule enum anything int nullOr;
|
||||||
|
inherit (lib.generators) mkLuaInline;
|
||||||
|
inherit (lib.nvim.types) mkPluginSetupOption luaInline;
|
||||||
|
inherit (lib.nvim.binds) mkMappingOption;
|
||||||
|
inherit (lib.nvim.config) mkBool;
|
||||||
|
|
||||||
|
keymapType = submodule {
|
||||||
|
freeformType = attrsOf (listOf (either str luaInline));
|
||||||
|
options = {
|
||||||
|
preset = mkOption {
|
||||||
|
type = enum ["default" "none" "super-tab" "enter"];
|
||||||
|
default = "none";
|
||||||
|
description = "keymap presets";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
providerType = submodule {
|
||||||
|
freeformType = anything;
|
||||||
|
options = {
|
||||||
|
module = mkOption {
|
||||||
|
type = str;
|
||||||
|
description = "module of the provider";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
options.vim.autocomplete.blink-cmp = {
|
||||||
|
enable = mkEnableOption "blink.cmp";
|
||||||
|
setupOpts = mkPluginSetupOption "blink.cmp" {
|
||||||
|
sources = {
|
||||||
|
default = mkOption {
|
||||||
|
type = listOf str;
|
||||||
|
default = ["lsp" "path" "snippets" "buffer"];
|
||||||
|
description = "Default list of sources to enable for completion.";
|
||||||
|
};
|
||||||
|
|
||||||
|
cmdline = mkOption {
|
||||||
|
type = nullOr (listOf str);
|
||||||
|
default = [];
|
||||||
|
description = "List of sources to enable for cmdline. Null means use default source list.";
|
||||||
|
};
|
||||||
|
|
||||||
|
providers = mkOption {
|
||||||
|
type = attrsOf providerType;
|
||||||
|
default = {};
|
||||||
|
description = "Settings for completion providers";
|
||||||
|
};
|
||||||
|
|
||||||
|
transform_items = mkOption {
|
||||||
|
type = nullOr luaInline;
|
||||||
|
default = mkLuaInline "function(_, items) return items end";
|
||||||
|
defaultText = ''
|
||||||
|
Our default does nothing. If you want blink.cmp's default, which
|
||||||
|
lowers the score for snippets, set this option to null.
|
||||||
|
'';
|
||||||
|
description = ''
|
||||||
|
Function to use when transforming the items before they're returned
|
||||||
|
for all providers.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
completion = {
|
||||||
|
documentation = {
|
||||||
|
auto_show = mkBool true "Show documentation whenever an item is selected";
|
||||||
|
auto_show_delay_ms = mkOption {
|
||||||
|
type = int;
|
||||||
|
default = 200;
|
||||||
|
description = "Delay before auto show triggers";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
keymap = mkOption {
|
||||||
|
type = keymapType;
|
||||||
|
default = {};
|
||||||
|
description = "blink.cmp keymap";
|
||||||
|
example = literalMD ''
|
||||||
|
```nix
|
||||||
|
vim.autocomplete.blink-cmp.setupOpts.keymap = {
|
||||||
|
preset = "none";
|
||||||
|
|
||||||
|
"<Up>" = ["select_prev" "fallback"];
|
||||||
|
"<C-n>" = [
|
||||||
|
(lib.generators.mkLuaInline ''''
|
||||||
|
function(cmp)
|
||||||
|
if some_condition then return end -- runs the next command
|
||||||
|
return true -- doesn't run the next command
|
||||||
|
end,
|
||||||
|
'''')
|
||||||
|
"select_next"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
```
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
fuzzy = {
|
||||||
|
prebuilt_binaries = {
|
||||||
|
download = mkBool false ''
|
||||||
|
Auto-downloads prebuilt binaries. Do not enable, it doesn't work on nix
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
mappings = {
|
||||||
|
complete = mkMappingOption "Complete [blink.cmp]" "<C-Space>";
|
||||||
|
confirm = mkMappingOption "Confirm [blink.cmp]" "<CR>";
|
||||||
|
next = mkMappingOption "Next item [blink.cmp]" "<Tab>";
|
||||||
|
previous = mkMappingOption "Previous item [blink.cmp]" "<S-Tab>";
|
||||||
|
close = mkMappingOption "Close [blink.cmp]" "<C-e>";
|
||||||
|
scrollDocsUp = mkMappingOption "Scroll docs up [blink.cmp]" "<C-d>";
|
||||||
|
scrollDocsDown = mkMappingOption "Scroll docs down [blink.cmp]" "<C-f>";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
91
modules/plugins/completion/blink-cmp/config.nix
Normal file
91
modules/plugins/completion/blink-cmp/config.nix
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib.modules) mkIf;
|
||||||
|
inherit (lib.strings) optionalString;
|
||||||
|
inherit (lib.generators) mkLuaInline;
|
||||||
|
inherit (lib.nvim.lua) toLuaObject;
|
||||||
|
inherit (builtins) concatStringsSep typeOf tryEval attrNames mapAttrs;
|
||||||
|
|
||||||
|
cfg = config.vim.autocomplete.blink-cmp;
|
||||||
|
cmpCfg = config.vim.autocomplete.nvim-cmp;
|
||||||
|
inherit (cfg) mappings;
|
||||||
|
|
||||||
|
getPluginName = plugin:
|
||||||
|
if typeOf plugin == "string"
|
||||||
|
then plugin
|
||||||
|
else if (plugin ? pname && (tryEval plugin.pname).success)
|
||||||
|
then plugin.pname
|
||||||
|
else plugin.name;
|
||||||
|
in {
|
||||||
|
vim = mkIf cfg.enable {
|
||||||
|
startPlugins = ["blink-compat"];
|
||||||
|
lazy.plugins = {
|
||||||
|
blink-cmp = {
|
||||||
|
package = "blink-cmp";
|
||||||
|
setupModule = "blink.cmp";
|
||||||
|
inherit (cfg) setupOpts;
|
||||||
|
|
||||||
|
# TODO: lazy disabled until lspconfig is lazy loaded
|
||||||
|
#
|
||||||
|
# event = ["InsertEnter" "CmdlineEnter"];
|
||||||
|
|
||||||
|
after = ''
|
||||||
|
${optionalString config.vim.lazy.enable
|
||||||
|
(concatStringsSep "\n" (map
|
||||||
|
(package: "require('lz.n').trigger_load(${toLuaObject (getPluginName package)})")
|
||||||
|
cmpCfg.sourcePlugins))}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
autocomplete = {
|
||||||
|
enableSharedCmpSources = true;
|
||||||
|
blink-cmp.setupOpts = {
|
||||||
|
sources = {
|
||||||
|
default = ["lsp" "path" "snippets" "buffer"] ++ (attrNames cmpCfg.sources);
|
||||||
|
providers =
|
||||||
|
mapAttrs (name: _: {
|
||||||
|
inherit name;
|
||||||
|
module = "blink.compat.source";
|
||||||
|
})
|
||||||
|
cmpCfg.sources;
|
||||||
|
};
|
||||||
|
snippets = mkIf config.vim.snippets.luasnip.enable {
|
||||||
|
preset = "luasnip";
|
||||||
|
};
|
||||||
|
|
||||||
|
keymap = {
|
||||||
|
${mappings.complete} = ["show" "fallback"];
|
||||||
|
${mappings.close} = ["hide" "fallback"];
|
||||||
|
${mappings.scrollDocsUp} = ["scroll_documentation_up" "fallback"];
|
||||||
|
${mappings.scrollDocsDown} = ["scroll_documentation_down" "fallback"];
|
||||||
|
${mappings.confirm} = ["accept" "fallback"];
|
||||||
|
|
||||||
|
${mappings.next} = [
|
||||||
|
"select_next"
|
||||||
|
"snippet_forward"
|
||||||
|
(mkLuaInline ''
|
||||||
|
function(cmp)
|
||||||
|
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
|
||||||
|
has_words_before = col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
|
||||||
|
|
||||||
|
if has_words_before then
|
||||||
|
return cmp.show()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'')
|
||||||
|
"fallback"
|
||||||
|
];
|
||||||
|
${mappings.previous} = [
|
||||||
|
"select_prev"
|
||||||
|
"snippet_backward"
|
||||||
|
"fallback"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
6
modules/plugins/completion/blink-cmp/default.nix
Normal file
6
modules/plugins/completion/blink-cmp/default.nix
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./blink-cmp.nix
|
||||||
|
./config.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
34
modules/plugins/completion/config.nix
Normal file
34
modules/plugins/completion/config.nix
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib.modules) mkIf;
|
||||||
|
inherit (lib.nvim.attrsets) mapListToAttrs;
|
||||||
|
inherit (builtins) typeOf tryEval;
|
||||||
|
|
||||||
|
cfg = config.vim.autocomplete;
|
||||||
|
getPluginName = plugin:
|
||||||
|
if typeOf plugin == "string"
|
||||||
|
then plugin
|
||||||
|
else if (plugin ? pname && (tryEval plugin.pname).success)
|
||||||
|
then plugin.pname
|
||||||
|
else plugin.name;
|
||||||
|
in {
|
||||||
|
config.vim = mkIf cfg.enableSharedCmpSources {
|
||||||
|
startPlugins = ["rtp-nvim"];
|
||||||
|
lazy.plugins =
|
||||||
|
mapListToAttrs (package: {
|
||||||
|
name = getPluginName package;
|
||||||
|
value = {
|
||||||
|
inherit package;
|
||||||
|
lazy = true;
|
||||||
|
after = ''
|
||||||
|
local path = vim.fn.globpath(vim.o.packpath, 'pack/*/opt/${getPluginName package}')
|
||||||
|
require("rtp_nvim").source_after_plugin_dir(path)
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
})
|
||||||
|
cfg.nvim-cmp.sourcePlugins;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,9 @@
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
|
./module.nix
|
||||||
|
./config.nix
|
||||||
|
|
||||||
./nvim-cmp
|
./nvim-cmp
|
||||||
|
./blink-cmp
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
7
modules/plugins/completion/module.nix
Normal file
7
modules/plugins/completion/module.nix
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
{lib, ...}: let
|
||||||
|
inherit (lib.options) mkEnableOption;
|
||||||
|
in {
|
||||||
|
options.vim.autocomplete = {
|
||||||
|
enableSharedCmpSources = mkEnableOption "sources shared by blink.cmp and nvim-cmp";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -24,114 +24,103 @@
|
||||||
in {
|
in {
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
vim = {
|
vim = {
|
||||||
startPlugins = ["rtp-nvim"];
|
lazy.plugins = {
|
||||||
lazy.plugins = mkMerge [
|
nvim-cmp = {
|
||||||
(mapListToAttrs (package: {
|
package = "nvim-cmp";
|
||||||
name = getPluginName package;
|
after = ''
|
||||||
value = {
|
${optionalString luasnipEnable "local luasnip = require('luasnip')"}
|
||||||
inherit package;
|
local cmp = require("cmp")
|
||||||
lazy = true;
|
|
||||||
after = ''
|
local kinds = require("cmp.types").lsp.CompletionItemKind
|
||||||
local path = vim.fn.globpath(vim.o.packpath, 'pack/*/opt/${getPluginName package}')
|
local deprio = function(kind)
|
||||||
require("rtp_nvim").source_after_plugin_dir(path)
|
return function(e1, e2)
|
||||||
|
if e1:get_kind() == kind then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
if e2:get_kind() == kind then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
cmp.setup(${toLuaObject cfg.setupOpts})
|
||||||
|
|
||||||
|
${optionalString config.vim.lazy.enable
|
||||||
|
(concatStringsSep "\n" (map
|
||||||
|
(package: "require('lz.n').trigger_load(${toLuaObject (getPluginName package)})")
|
||||||
|
cfg.sourcePlugins))}
|
||||||
|
'';
|
||||||
|
|
||||||
|
event = ["InsertEnter" "CmdlineEnter"];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
autocomplete = {
|
||||||
|
enableSharedCmpSources = true;
|
||||||
|
|
||||||
|
nvim-cmp = {
|
||||||
|
sources = {
|
||||||
|
nvim-cmp = null;
|
||||||
|
buffer = "[Buffer]";
|
||||||
|
path = "[Path]";
|
||||||
|
};
|
||||||
|
|
||||||
|
sourcePlugins = ["cmp-buffer" "cmp-path"];
|
||||||
|
|
||||||
|
setupOpts = {
|
||||||
|
sources = map (s: {name = s;}) (attrNames cfg.sources);
|
||||||
|
|
||||||
|
window = mkIf borders.enable {
|
||||||
|
completion.border = borders.style;
|
||||||
|
documentation.border = borders.style;
|
||||||
|
};
|
||||||
|
|
||||||
|
formatting.format = cfg.format;
|
||||||
|
|
||||||
|
# `cmp` and `luasnip` are defined above, in the `nvim-cmp` section
|
||||||
|
mapping = {
|
||||||
|
${mappings.complete} = mkLuaInline "cmp.mapping.complete()";
|
||||||
|
${mappings.close} = mkLuaInline "cmp.mapping.abort()";
|
||||||
|
${mappings.scrollDocsUp} = mkLuaInline "cmp.mapping.scroll_docs(-4)";
|
||||||
|
${mappings.scrollDocsDown} = mkLuaInline "cmp.mapping.scroll_docs(4)";
|
||||||
|
${mappings.confirm} = mkLuaInline "cmp.mapping.confirm({ select = true })";
|
||||||
|
|
||||||
|
${mappings.next} = mkLuaInline ''
|
||||||
|
cmp.mapping(function(fallback)
|
||||||
|
local has_words_before = function()
|
||||||
|
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
|
||||||
|
return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if cmp.visible() then
|
||||||
|
cmp.select_next_item()
|
||||||
|
${optionalString luasnipEnable ''
|
||||||
|
elseif luasnip.locally_jumpable(1) then
|
||||||
|
luasnip.jump(1)
|
||||||
|
''}
|
||||||
|
elseif has_words_before() then
|
||||||
|
cmp.complete()
|
||||||
|
else
|
||||||
|
fallback()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
'';
|
||||||
|
|
||||||
|
${mappings.previous} = mkLuaInline ''
|
||||||
|
cmp.mapping(function(fallback)
|
||||||
|
if cmp.visible() then
|
||||||
|
cmp.select_prev_item()
|
||||||
|
${optionalString luasnipEnable ''
|
||||||
|
elseif luasnip.locally_jumpable(-1) then
|
||||||
|
luasnip.jump(-1)
|
||||||
|
''}
|
||||||
|
else
|
||||||
|
fallback()
|
||||||
|
end
|
||||||
|
end)
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
})
|
|
||||||
cfg.sourcePlugins)
|
|
||||||
{
|
|
||||||
nvim-cmp = {
|
|
||||||
package = "nvim-cmp";
|
|
||||||
after = ''
|
|
||||||
${optionalString luasnipEnable "local luasnip = require('luasnip')"}
|
|
||||||
local cmp = require("cmp")
|
|
||||||
|
|
||||||
local kinds = require("cmp.types").lsp.CompletionItemKind
|
|
||||||
local deprio = function(kind)
|
|
||||||
return function(e1, e2)
|
|
||||||
if e1:get_kind() == kind then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
if e2:get_kind() == kind then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
cmp.setup(${toLuaObject cfg.setupOpts})
|
|
||||||
|
|
||||||
${optionalString config.vim.lazy.enable
|
|
||||||
(concatStringsSep "\n" (map
|
|
||||||
(package: "require('lz.n').trigger_load(${toLuaObject (getPluginName package)})")
|
|
||||||
cfg.sourcePlugins))}
|
|
||||||
'';
|
|
||||||
|
|
||||||
event = ["InsertEnter" "CmdlineEnter"];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
autocomplete.nvim-cmp = {
|
|
||||||
sources = {
|
|
||||||
nvim-cmp = null;
|
|
||||||
buffer = "[Buffer]";
|
|
||||||
path = "[Path]";
|
|
||||||
};
|
|
||||||
|
|
||||||
sourcePlugins = ["cmp-buffer" "cmp-path"];
|
|
||||||
|
|
||||||
setupOpts = {
|
|
||||||
sources = map (s: {name = s;}) (attrNames cfg.sources);
|
|
||||||
|
|
||||||
window = mkIf borders.enable {
|
|
||||||
completion.border = borders.style;
|
|
||||||
documentation.border = borders.style;
|
|
||||||
};
|
|
||||||
|
|
||||||
formatting.format = cfg.format;
|
|
||||||
|
|
||||||
# `cmp` and `luasnip` are defined above, in the `nvim-cmp` section
|
|
||||||
mapping = {
|
|
||||||
${mappings.complete} = mkLuaInline "cmp.mapping.complete()";
|
|
||||||
${mappings.close} = mkLuaInline "cmp.mapping.abort()";
|
|
||||||
${mappings.scrollDocsUp} = mkLuaInline "cmp.mapping.scroll_docs(-4)";
|
|
||||||
${mappings.scrollDocsDown} = mkLuaInline "cmp.mapping.scroll_docs(4)";
|
|
||||||
${mappings.confirm} = mkLuaInline "cmp.mapping.confirm({ select = true })";
|
|
||||||
|
|
||||||
${mappings.next} = mkLuaInline ''
|
|
||||||
cmp.mapping(function(fallback)
|
|
||||||
local has_words_before = function()
|
|
||||||
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
|
|
||||||
return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
|
|
||||||
end
|
|
||||||
|
|
||||||
if cmp.visible() then
|
|
||||||
cmp.select_next_item()
|
|
||||||
${optionalString luasnipEnable ''
|
|
||||||
elseif luasnip.locally_jumpable(1) then
|
|
||||||
luasnip.jump(1)
|
|
||||||
''}
|
|
||||||
elseif has_words_before() then
|
|
||||||
cmp.complete()
|
|
||||||
else
|
|
||||||
fallback()
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
'';
|
|
||||||
|
|
||||||
${mappings.previous} = mkLuaInline ''
|
|
||||||
cmp.mapping(function(fallback)
|
|
||||||
if cmp.visible() then
|
|
||||||
cmp.select_prev_item()
|
|
||||||
${optionalString luasnipEnable ''
|
|
||||||
elseif luasnip.locally_jumpable(-1) then
|
|
||||||
luasnip.jump(-1)
|
|
||||||
''}
|
|
||||||
else
|
|
||||||
fallback()
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
'';
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,40 @@
|
||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
nixd = {
|
||||||
|
package = pkgs.nixd;
|
||||||
|
internalFormatter = true;
|
||||||
|
lspConfig = ''
|
||||||
|
lspconfig.nixd.setup{
|
||||||
|
capabilities = capabilities,
|
||||||
|
${
|
||||||
|
if cfg.format.enable
|
||||||
|
then useFormat
|
||||||
|
else noFormat
|
||||||
|
},
|
||||||
|
cmd = ${packageToCmd cfg.lsp.package "nixd"},
|
||||||
|
${optionalString cfg.format.enable ''
|
||||||
|
settings = {
|
||||||
|
nixd = {
|
||||||
|
${optionalString (cfg.format.type == "alejandra")
|
||||||
|
''
|
||||||
|
formatting = {
|
||||||
|
command = {"${cfg.format.package}/bin/alejandra", "--quiet"},
|
||||||
|
},
|
||||||
|
''}
|
||||||
|
${optionalString (cfg.format.type == "nixfmt")
|
||||||
|
''
|
||||||
|
formatting = {
|
||||||
|
command = {"${cfg.format.package}/bin/nixfmt"},
|
||||||
|
},
|
||||||
|
''}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
''}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
defaultFormat = "alejandra";
|
defaultFormat = "alejandra";
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@
|
||||||
ls_sources,
|
ls_sources,
|
||||||
null_ls.builtins.formatting.prettier.with({
|
null_ls.builtins.formatting.prettier.with({
|
||||||
command = "${cfg.format.package}/bin/prettier",
|
command = "${cfg.format.package}/bin/prettier",
|
||||||
filetypes = { "typescript" },
|
filetypes = { "typescript", "javascript" },
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
'';
|
'';
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
cfg = config.vim.lsp;
|
cfg = config.vim.lsp;
|
||||||
usingNvimCmp = config.vim.autocomplete.nvim-cmp.enable;
|
usingNvimCmp = config.vim.autocomplete.nvim-cmp.enable;
|
||||||
|
usingBlinkCmp = config.vim.autocomplete.blink-cmp.enable;
|
||||||
self = import ./module.nix {inherit config lib pkgs;};
|
self = import ./module.nix {inherit config lib pkgs;};
|
||||||
|
|
||||||
mappingDefinitions = self.options.vim.lsp.mappings;
|
mappingDefinitions = self.options.vim.lsp.mappings;
|
||||||
|
|
@ -22,7 +23,7 @@
|
||||||
in {
|
in {
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
vim = {
|
vim = {
|
||||||
autocomplete.nvim-cmp = {
|
autocomplete.nvim-cmp = mkIf usingNvimCmp {
|
||||||
sources = {nvim_lsp = "[LSP]";};
|
sources = {nvim_lsp = "[LSP]";};
|
||||||
sourcePlugins = ["cmp-nvim-lsp"];
|
sourcePlugins = ["cmp-nvim-lsp"];
|
||||||
};
|
};
|
||||||
|
|
@ -170,6 +171,10 @@ in {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
''}
|
''}
|
||||||
|
|
||||||
|
${optionalString usingBlinkCmp ''
|
||||||
|
capabilities = require('blink.cmp').get_lsp_capabilities()
|
||||||
|
''}
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,16 @@
|
||||||
cfg = config.vim.lsp;
|
cfg = config.vim.lsp;
|
||||||
in {
|
in {
|
||||||
config = mkIf (cfg.enable && cfg.lspSignature.enable) {
|
config = mkIf (cfg.enable && cfg.lspSignature.enable) {
|
||||||
|
assertions = [
|
||||||
|
{
|
||||||
|
assertion = !config.vim.autocomplete.blink-cmp.enable;
|
||||||
|
message = ''
|
||||||
|
lsp-signature does not work with blink.cmp. Please use blink.cmp's builtin signature feature:
|
||||||
|
|
||||||
|
vim.autocomplete.blink-cmp.setupOpts.signature.enabled = true;
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
];
|
||||||
vim = {
|
vim = {
|
||||||
startPlugins = [
|
startPlugins = [
|
||||||
"lsp-signature"
|
"lsp-signature"
|
||||||
|
|
|
||||||
|
|
@ -8,16 +8,18 @@
|
||||||
inherit (lib.nvim.lua) toLuaObject;
|
inherit (lib.nvim.lua) toLuaObject;
|
||||||
|
|
||||||
cfg = config.vim.lsp.lspkind;
|
cfg = config.vim.lsp.lspkind;
|
||||||
|
usingCmp = config.vim.autocomplete.nvim-cmp.enable;
|
||||||
|
usingBlink = config.vim.autocomplete.blink-cmp.enable;
|
||||||
in {
|
in {
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
assertions = [
|
assertions = [
|
||||||
{
|
{
|
||||||
assertion = config.vim.autocomplete.nvim-cmp.enable;
|
assertion = usingCmp || usingBlink;
|
||||||
message = ''
|
message = ''
|
||||||
While lspkind supports Neovim's native lsp upstream, using that over
|
While lspkind supports Neovim's native lsp upstream, using that over
|
||||||
nvim-cmp isn't recommended, nor supported by nvf.
|
nvim-cmp/blink.cmp isn't recommended, nor supported by nvf.
|
||||||
|
|
||||||
Please migrate to nvim-cmp if you want to use lspkind.
|
Please migrate to nvim-cmp/blink.cmp if you want to use lspkind.
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
@ -26,9 +28,19 @@ in {
|
||||||
startPlugins = ["lspkind"];
|
startPlugins = ["lspkind"];
|
||||||
|
|
||||||
lsp.lspkind.setupOpts.before = config.vim.autocomplete.nvim-cmp.format;
|
lsp.lspkind.setupOpts.before = config.vim.autocomplete.nvim-cmp.format;
|
||||||
autocomplete.nvim-cmp.setupOpts.formatting.format = mkForce (mkLuaInline ''
|
autocomplete = {
|
||||||
require("lspkind").cmp_format(${toLuaObject cfg.setupOpts})
|
nvim-cmp = mkIf usingCmp {
|
||||||
'');
|
setupOpts.formatting.format = mkForce (mkLuaInline ''
|
||||||
|
require("lspkind").cmp_format(${toLuaObject cfg.setupOpts})
|
||||||
|
'');
|
||||||
|
};
|
||||||
|
|
||||||
|
blink-cmp = mkIf usingBlink {
|
||||||
|
setupOpts.appearance.kind_icons = mkLuaInline ''
|
||||||
|
require("lspkind").symbol_map
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,8 @@
|
||||||
inherit (lib.types) bool str nullOr;
|
inherit (lib.types) bool str nullOr;
|
||||||
inherit (lib.modules) mkRenamedOptionModule;
|
inherit (lib.modules) mkRenamedOptionModule;
|
||||||
inherit (lib.nvim.types) mkPluginSetupOption;
|
inherit (lib.nvim.types) mkPluginSetupOption;
|
||||||
|
|
||||||
|
autocompleteCfg = config.vim.autocomplete;
|
||||||
in {
|
in {
|
||||||
imports = let
|
imports = let
|
||||||
renamedSetupOption = oldPath: newPath:
|
renamedSetupOption = oldPath: newPath:
|
||||||
|
|
@ -42,7 +44,7 @@ in {
|
||||||
# If using nvim-cmp, otherwise set to false
|
# If using nvim-cmp, otherwise set to false
|
||||||
type = bool;
|
type = bool;
|
||||||
description = "If using nvim-cmp, otherwise set to false";
|
description = "If using nvim-cmp, otherwise set to false";
|
||||||
default = config.vim.autocomplete.nvim-cmp.enable;
|
default = autocompleteCfg.nvim-cmp.enable || autocompleteCfg.blink-cmp.enable;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ in {
|
||||||
after = cfg.loaders;
|
after = cfg.loaders;
|
||||||
};
|
};
|
||||||
startPlugins = cfg.providers;
|
startPlugins = cfg.providers;
|
||||||
autocomplete.nvim-cmp = {
|
autocomplete.nvim-cmp = mkIf config.vim.autocomplete.nvim-cmp.enable {
|
||||||
sources = {luasnip = "[LuaSnip]";};
|
sources = {luasnip = "[LuaSnip]";};
|
||||||
sourcePlugins = ["cmp-luasnip"];
|
sourcePlugins = ["cmp-luasnip"];
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,8 @@ in {
|
||||||
vim = {
|
vim = {
|
||||||
startPlugins = ["nvim-treesitter"];
|
startPlugins = ["nvim-treesitter"];
|
||||||
|
|
||||||
autocomplete.nvim-cmp = {
|
# cmp-treesitter doesn't work on blink.cmp
|
||||||
|
autocomplete.nvim-cmp = mkIf config.vim.autocomplete.nvim-cmp.enable {
|
||||||
sources = {treesitter = "[Treesitter]";};
|
sources = {treesitter = "[Treesitter]";};
|
||||||
sourcePlugins = ["cmp-treesitter"];
|
sourcePlugins = ["cmp-treesitter"];
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -87,11 +87,6 @@
|
||||||
type = float;
|
type = float;
|
||||||
default = 0.55;
|
default = 0.55;
|
||||||
};
|
};
|
||||||
results_width = mkOption {
|
|
||||||
description = "";
|
|
||||||
type = float;
|
|
||||||
default = 0.8;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
vertical = {
|
vertical = {
|
||||||
mirror = mkOption {
|
mirror = mkOption {
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,7 @@
|
||||||
"flutter-tools.dev_tools"
|
"flutter-tools.dev_tools"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
inherit (pkgs) blink-cmp;
|
||||||
};
|
};
|
||||||
|
|
||||||
buildConfigPlugins = plugins:
|
buildConfigPlugins = plugins:
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
{
|
{
|
||||||
"release": "v0.8",
|
"release": "v0.8",
|
||||||
"isReleaseBranch": false
|
"isReleaseBranch": false
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue