mirror of
https://github.com/NotAShelf/nvf.git
synced 2024-11-22 05:10:44 +00:00
dev: rebase on a less personalized neovim flake
This commit is contained in:
commit
9c00808863
70 changed files with 4910 additions and 0 deletions
1
.envrc
Normal file
1
.envrc
Normal file
|
@ -0,0 +1 @@
|
||||||
|
use flake
|
17
.github/workflows/check.yml
vendored
Normal file
17
.github/workflows/check.yml
vendored
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
name: "Pull request"
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
workflow_dispatch:
|
||||||
|
jobs:
|
||||||
|
nix-flake-check:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: cachix/install-nix-action@v18
|
||||||
|
with:
|
||||||
|
extra_nix_config: |
|
||||||
|
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- run: nix flake check
|
34
.github/workflows/manual.yml
vendored
Normal file
34
.github/workflows/manual.yml
vendored
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
name: Github Pages docs
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
pages: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
# Allow one concurrent deployment
|
||||||
|
concurrency:
|
||||||
|
group: "pages"
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Install Nix
|
||||||
|
uses: cachix/install-nix-action@v18
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
nix build '.#docs-html'
|
||||||
|
cp -r result/share/doc/neovim-flake public
|
||||||
|
- name: Deploy
|
||||||
|
uses: peaceiris/actions-gh-pages@v3
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
publish_dir: ./public
|
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
result
|
||||||
|
.config
|
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 Jordan
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
30
README.md
Normal file
30
README.md
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# neovim-flake
|
||||||
|
|
||||||
|
A highly configurable nix flake for neovim.
|
||||||
|
|
||||||
|
Come join the Matrix room if you have any questions or need help: [#neovim-flake:matrix.org](https://matrix.to/#/#neovim-flake:matrix.org)
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
See the [neovim-flake Manual](https://jordanisaacs.github.io/neovim-flake/) for documentation, available options, and release notes.
|
||||||
|
|
||||||
|
If you want to dive right into trying neovim-flake you can get a fully featured configuration with `nix` language support by running:
|
||||||
|
|
||||||
|
```
|
||||||
|
nix run github:jordanisaacs/neovim-flake
|
||||||
|
```
|
||||||
|
|
||||||
|
## Screenshot
|
||||||
|
|
||||||
|
![screenshot](./screenshot.png)
|
||||||
|
|
||||||
|
## Philosophy
|
||||||
|
|
||||||
|
The philosophy behind this flake configuration is to allow for easily configurable and reproducible neovim environments. Enter a directory and have a ready to go neovim configuration that is the same on every machine. Whether you are a developer, writer, or live coder (see tidal cycles below!), quickly craft a config that suits every project's need. Think of it like a distribution of Neovim that takes advantage of pinning vim plugins and third party dependencies (such as tree-sitter grammars, language servers, and more).
|
||||||
|
|
||||||
|
As a result, one should never get a broken config when setting options. If setting multiple options results in a broken neovim, file an issue! Each plugin knows when another plugin which allows for smart configuration of keybindings and automatic setup of things like completion sources and languages.
|
||||||
|
|
||||||
|
|
||||||
|
## Credit
|
||||||
|
|
||||||
|
Originally based on Wil Taylor's amazing [neovim-flake](https://github.com/wiltaylor/neovim-flake)
|
42
docs/custom-configs.adoc
Normal file
42
docs/custom-configs.adoc
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
[[ch-custom-configuration]]
|
||||||
|
== Custom Configuration
|
||||||
|
|
||||||
|
Custom configuration is done with the `neovimConfiguration` function. It takes in the configuration as a module. The output of the configuration function is an attrset.
|
||||||
|
|
||||||
|
[source,nix]
|
||||||
|
----
|
||||||
|
{
|
||||||
|
options = "The options that were available to configure";
|
||||||
|
config = "The outputted configuration";
|
||||||
|
pkgs = "The package set used to evaluate the module";
|
||||||
|
neovim = "The built neovim package";
|
||||||
|
}
|
||||||
|
----
|
||||||
|
|
||||||
|
The following is an example of a barebones vim configuration with the default theme enabled.
|
||||||
|
|
||||||
|
[source,nix]
|
||||||
|
----
|
||||||
|
{
|
||||||
|
inputs.neovim-flake.url = "github:jordanisaacs/neovim-flake";
|
||||||
|
|
||||||
|
outputs = {nixpkgs, neovim-flake, ...}: let
|
||||||
|
system = "x86_64-linux";
|
||||||
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
|
configModule = {
|
||||||
|
# Add any custom options (and feel free to upstream them!)
|
||||||
|
# options = ...
|
||||||
|
|
||||||
|
config.vim.theme.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
customNeovim = neovim-flake.lib.neovimConfiguration {
|
||||||
|
modules = [configModule];
|
||||||
|
inherit pkgs;
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
packages.${system}.neovim = customNeovim.neovim;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
----
|
||||||
|
|
36
docs/default-configs.adoc
Normal file
36
docs/default-configs.adoc
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
[[ch-default-configs]]
|
||||||
|
== Default Configs
|
||||||
|
|
||||||
|
While you can configure neovim-flake yourself using the builder, here are a few default configurations you can use.
|
||||||
|
|
||||||
|
[[sec-default-tidal]]
|
||||||
|
=== Tidal Cycles
|
||||||
|
|
||||||
|
[source,console]
|
||||||
|
$ nix run github:jordanisaacs/neovim-flake#tidal file.tidal
|
||||||
|
|
||||||
|
Utilizing https://github.com/tidalcycles/vim-tidal[vim-tidal] and mitchmindtree's fantastic https://github.com/mitchmindtree/tidalcycles.nix[tidalcycles.nix] start playing with tidal cycles in a single command.
|
||||||
|
|
||||||
|
In your tidal file, type a cycle e.g. `d1 $ s "drum"` and then press _ctrl+enter_. Super collider with superdirt, and a modified GHCI with tidal will start up and begin playing. Note, you need jack enabled on your system. If you are using pipewire, its as easy as setting `services.pipewire.jack.enable = true`.
|
||||||
|
|
||||||
|
|
||||||
|
[[sec-default-nix]]
|
||||||
|
=== Nix
|
||||||
|
|
||||||
|
[source,console]
|
||||||
|
$ nix run github:jordanisaacs/neovim-flake#nix test.nix
|
||||||
|
|
||||||
|
Enables all the of neovim plugins, with language support for specifically Nix. This lets you see what a fully configured neovim setup looks like without downloading a whole bunch of language servers and associated tools.
|
||||||
|
|
||||||
|
[[sec-default-maximal]]
|
||||||
|
=== Maximal
|
||||||
|
|
||||||
|
[source,console]
|
||||||
|
$ nix shell github:jordanisaacs/neovim-flake#maximal test.nix
|
||||||
|
|
||||||
|
It is the same fully configured neovim as with the <<sec-default-nix,Nix>> config, but with every supported language enabled.
|
||||||
|
|
||||||
|
[NOTE]
|
||||||
|
====
|
||||||
|
Running the maximal config will download *a lot* of packages as it is downloading language servers, formatters, and more.
|
||||||
|
====
|
54
docs/default.nix
Normal file
54
docs/default.nix
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
lib ? import ../modules/lib/stdlib-extended.nix pkgs.lib,
|
||||||
|
nmdSrc,
|
||||||
|
}: let
|
||||||
|
nmd = import nmdSrc {inherit lib pkgs;};
|
||||||
|
scrubbedPkgsModule = {
|
||||||
|
imports = [
|
||||||
|
{
|
||||||
|
_module.args = {
|
||||||
|
pkgs = lib.mkForce (nmd.scrubDerivations "pkgs" pkgs);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
nvimModuleDocs = nmd.buildModulesDocs {
|
||||||
|
modules =
|
||||||
|
import ../modules/modules.nix {
|
||||||
|
inherit pkgs lib;
|
||||||
|
check = false;
|
||||||
|
}
|
||||||
|
++ [scrubbedPkgsModule];
|
||||||
|
moduleRootPaths = [./..];
|
||||||
|
mkModuleUrl = path: "https://github.com/jordanisaacs/neovim-flake/blob/main/${path}#blob-path";
|
||||||
|
channelName = "neovim-flake";
|
||||||
|
docBook.id = "neovim-flake-options";
|
||||||
|
};
|
||||||
|
|
||||||
|
docs = nmd.buildDocBookDocs {
|
||||||
|
pathName = "neovim-flake";
|
||||||
|
projectName = "neovim-flake";
|
||||||
|
modulesDocs = [nvimModuleDocs];
|
||||||
|
documentsDirectory = ./.;
|
||||||
|
documentType = "book";
|
||||||
|
chunkToc = ''
|
||||||
|
<toc>
|
||||||
|
<d:tocentry xmlns:d="http://docbook.org/ns/docbook" linkend="book-neovim-flake-manual">
|
||||||
|
<?dbhtml filename="index.html"?>
|
||||||
|
<d:tocentry linkend="ch-options">
|
||||||
|
<?dbhtml filename="options.html"?>
|
||||||
|
</d:tocentry>
|
||||||
|
<d:tocentry linkend="ch-release-notes">
|
||||||
|
<?dbhtml filename="release-notes.html"?>
|
||||||
|
</d:tocentry>
|
||||||
|
</d:tocentry>
|
||||||
|
</toc>
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
options.json = nvimModuleDocs.json.override {path = "share/doc/neovim-flake/options.json";};
|
||||||
|
manPages = docs.manPages;
|
||||||
|
manual = {inherit (docs) html htmlOpenTool;};
|
||||||
|
}
|
71
docs/languages.adoc
Normal file
71
docs/languages.adoc
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
[[ch-languages]]
|
||||||
|
== Language Support
|
||||||
|
|
||||||
|
Language specific support combines some combination of language specific plugins, `treesitter` support, `nvim-lspconfig` langauge servers, and `null-ls` integration. This gets you capabilities ranging from autocompletion to formatting to diagnostics. The following languages have support beyond just `treesitter` highlighting.
|
||||||
|
|
||||||
|
[[sec-languages-rust]]
|
||||||
|
=== Rust
|
||||||
|
|
||||||
|
*LSP Server*: https://github.com/rust-analyzer/rust-analyzer[rust-analyzer]
|
||||||
|
|
||||||
|
*Formatting*: Built into LSP, uses https://github.com/rust-lang/rustfmt[rustfmt]
|
||||||
|
|
||||||
|
*Plugins*: See <<sec-plugins-rust,here>>
|
||||||
|
|
||||||
|
[[sec-languages-nix]]
|
||||||
|
=== Nix
|
||||||
|
|
||||||
|
*LSP Server*: Choice between https://github.com/oxalica/nil[nil] and https://github.com/nix-community/rnix-lsp[rnix-lsp]
|
||||||
|
|
||||||
|
*Formatting*: Choice between https://github.com/kamadorueda/alejandra[alejandra] and https://github.com/nix-community/nixpkgs-fmt[nixpkgs-fmt]
|
||||||
|
|
||||||
|
[[sec-languages-sql]]
|
||||||
|
=== SQL
|
||||||
|
|
||||||
|
*LSP Server*: https://github.com/lighttiger2505/sqls[sqls]
|
||||||
|
|
||||||
|
*Formatting*: Disabled LSP formatting, instead using https://github.com/sqlfluff/sqlfluff[sqlfluff]
|
||||||
|
|
||||||
|
*Linting*: https://github.com/sqlfluff/sqlfluff[sqlfluff]
|
||||||
|
|
||||||
|
*Plugins*: See <<sec-plugins-sql,here>>
|
||||||
|
|
||||||
|
[[sec-languages-clang]]
|
||||||
|
=== C/C++
|
||||||
|
|
||||||
|
*LSP Server*: https://github.com/MaskRay/ccls[ccls]
|
||||||
|
|
||||||
|
*Formatting*: Built into language server
|
||||||
|
|
||||||
|
[[sec-languages-typescript]]
|
||||||
|
=== Typescript
|
||||||
|
|
||||||
|
*LSP Server*: https://github.com/typescript-language-server/typescript-language-server[typescript-language-server]
|
||||||
|
|
||||||
|
*Formatting*: Disabled LSP formatting, instead using https://github.com/prettier/prettier[prettier]
|
||||||
|
|
||||||
|
*Linting*: https://github.com/prettier/prettier[eslint]
|
||||||
|
|
||||||
|
[[sec-languages-python]]
|
||||||
|
=== Python
|
||||||
|
|
||||||
|
*LSP Server*: https://github.com/microsoft/pyright[pyright]
|
||||||
|
|
||||||
|
*Formatting*: https://github.com/psf/black[black]
|
||||||
|
|
||||||
|
[[sec-languages-zig]]
|
||||||
|
=== Zig
|
||||||
|
|
||||||
|
*LSP Server*: https://github.com/zigtools/zls[zls]
|
||||||
|
|
||||||
|
*Formatting*: Built into LSP, uses `zig fmt`.
|
||||||
|
|
||||||
|
[[sec-languages-markdown]]
|
||||||
|
=== Markdown
|
||||||
|
|
||||||
|
*Plugins*: See <<sec-plugins-markdown,here>>
|
||||||
|
|
||||||
|
[[sec-languages-html]]
|
||||||
|
=== HTML
|
||||||
|
|
||||||
|
*Plugins*: See <<sec-plugins-html,here>>
|
42
docs/man-configuration.xml
Normal file
42
docs/man-configuration.xml
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
<refentry xmlns="http://docbook.org/ns/docbook"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>neovim-flake configuration</refentrytitle>
|
||||||
|
<manvolnum>5</manvolnum>
|
||||||
|
<refmiscinfo class="source">neovim-flake</refmiscinfo>
|
||||||
|
<!-- <refmiscinfo class="version"><xi:include href="version.txt" parse="text"/></refmiscinfo> -->
|
||||||
|
</refmeta>
|
||||||
|
<refnamediv>
|
||||||
|
<refname>neovim configuration</refname>
|
||||||
|
<refpurpose>neovim-flake configuration specification</refpurpose>
|
||||||
|
</refnamediv>
|
||||||
|
<refsection>
|
||||||
|
<title>Description</title>
|
||||||
|
<para>
|
||||||
|
Custom configuration is done with the neovim-flake.lib.neovimConfiguration function. It takes in the configuration as a module.
|
||||||
|
<programlisting>
|
||||||
|
neovim-flake.lib.neovimConfiguration {
|
||||||
|
inherit pkgs;
|
||||||
|
modules = [{config = xxx;}];
|
||||||
|
};
|
||||||
|
</programlisting>
|
||||||
|
The output of the configuration function is an attrset.
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
{
|
||||||
|
options = "The options that were available to configure";
|
||||||
|
config = "The outputted configuration";
|
||||||
|
pkgs = "The package set used to evaluate the module";
|
||||||
|
neovim = "The built neovim package";
|
||||||
|
}
|
||||||
|
</programlisting>
|
||||||
|
</refsection>
|
||||||
|
<refsection>
|
||||||
|
<title>Options</title>
|
||||||
|
<para>
|
||||||
|
You can use the following options in your neovim configuration.
|
||||||
|
</para>
|
||||||
|
<xi:include href="./nmd-result/neovim-flake-options.xml"/>
|
||||||
|
</refsection>
|
||||||
|
</refentry>
|
13
docs/man-pages.xml
Normal file
13
docs/man-pages.xml
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<reference xmlns="http://docbook.org/ns/docbook"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||||
|
<title>neovim-flake Reference Pages</title>
|
||||||
|
<info>
|
||||||
|
<author><personname>neovim-flake contributors</personname></author>
|
||||||
|
<copyright>
|
||||||
|
<year>2021–2022</year>
|
||||||
|
<holder>neovim-flake contributors</holder>
|
||||||
|
</copyright>
|
||||||
|
</info>
|
||||||
|
<xi:include href="man-configuration.xml" />
|
||||||
|
</reference>
|
27
docs/manual.xml
Normal file
27
docs/manual.xml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<book xmlns="http://docbook.org/ns/docbook"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||||||
|
version="5.0"
|
||||||
|
xml:id="book-neovim-flake-manual">
|
||||||
|
<info>
|
||||||
|
<title>neovim-flake Manual</title>
|
||||||
|
</info>
|
||||||
|
<preface>
|
||||||
|
<title>Preface</title>
|
||||||
|
<para>
|
||||||
|
If you encounter problems or want to discuss neovim-flake then join the Matrix room
|
||||||
|
<link xlink:href="https://matrix.to/#/%23neovim-flake:matrix.org">#neovim-flake:matrix.org</link>.
|
||||||
|
If your problem is caused by a bug in neovim-flake then it should be reported on the
|
||||||
|
<link xlink:href="https://github.com/jordanisaacs/neovim-flake/issues">neovim-flake issue tracker</link>.
|
||||||
|
</para>
|
||||||
|
</preface>
|
||||||
|
<xi:include href="default-configs.xml"/>
|
||||||
|
<xi:include href="custom-configs.xml"/>
|
||||||
|
<xi:include href="languages.xml"/>
|
||||||
|
<xi:include href="plugins.xml"/>
|
||||||
|
<appendix xml:id="ch-options">
|
||||||
|
<title>Configuration Options</title>
|
||||||
|
<xi:include href="./nmd-result/neovim-flake-options.xml" />
|
||||||
|
</appendix>
|
||||||
|
<xi:include href="./release-notes/release-notes.xml" />
|
||||||
|
</book>
|
111
docs/plugins.adoc
Normal file
111
docs/plugins.adoc
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
[[ch-plugins]]
|
||||||
|
== Plugins
|
||||||
|
|
||||||
|
The following are the neovim plugins used within neovim-flake. Some plugins are explicitly enabled by the user, while others are enabled implicitly.
|
||||||
|
|
||||||
|
[[sec-plugins-server]]
|
||||||
|
=== Language Server
|
||||||
|
|
||||||
|
* https://github.com/neovim/nvim-lspconfig[nvim-lspconfig] common configurations for built-in language server
|
||||||
|
* https://github.com/jose-elias-alvarez/null-ls.nvim[null-ls.nvim] neovim as a language server to inject LSP diagnostics, code actions, etc.
|
||||||
|
* https://github.com/glepnir/lspsaga.nvim[lspsaga.nvim] useful UI and tools for lsp
|
||||||
|
* https://github.com/folke/trouble.nvim[trouble.nvim] pretty list of lsp data
|
||||||
|
* https://github.com/weilbith/nvim-code-action-menu[nvim-code-action-menu] a better code action menu with diff support
|
||||||
|
* https://github.com/ray-x/lsp_signature.nvim[lsp-signature] show function signatures as you type
|
||||||
|
* https://github.com/onsails/lspkind-nvim[lspkind-nvim] for pictograms in lsp (with support for nvim-cmp)
|
||||||
|
|
||||||
|
[[sec-plugins-buffer]]
|
||||||
|
=== Buffers
|
||||||
|
|
||||||
|
* https://github.com/akinsho/bufferline.nvim[nvim-bufferline-lua] a buffer line with tab integration
|
||||||
|
* https://github.com/famiu/bufdelete.nvim[bufdelete-nvim] delete buffers without losing window layout
|
||||||
|
|
||||||
|
[[sec-plugins-statuslines]]
|
||||||
|
=== Statuslines
|
||||||
|
|
||||||
|
* https://github.com/hoob3rt/lualine.nvim[lualine.nvim] statusline written in lua.
|
||||||
|
|
||||||
|
[[sec-plugins-filetrees]]
|
||||||
|
=== Filetrees
|
||||||
|
|
||||||
|
* https://github.com/kyazdani42/nvim-tree.lua[nvim-tree-lua] a file explorer tree written in lua. Using
|
||||||
|
|
||||||
|
[[sec-plugins-git]]
|
||||||
|
=== Git
|
||||||
|
|
||||||
|
* https://github.com/lewis6991/gitsigns.nvim[gitsigns.nvim] a variety of git decorations
|
||||||
|
|
||||||
|
[[sec-plugins-treesitter]]
|
||||||
|
=== Treesitter
|
||||||
|
|
||||||
|
* https://github.com/romgrk/nvim-treesitter-context[nvim-treesitter-context] a context bar using tree-sitter
|
||||||
|
|
||||||
|
[[sec-plugins-visuals]]
|
||||||
|
=== Visuals
|
||||||
|
|
||||||
|
* https://github.com/lukas-reineke/indent-blankline.nvim[indent-blankline] for indentation guides
|
||||||
|
* https://github.com/kyazdani42/nvim-web-devicons[nvim-web-devicons] Plugins and colors for icons. Requires patched font
|
||||||
|
|
||||||
|
[[sec-plugins-utilities]]
|
||||||
|
=== Utilities
|
||||||
|
|
||||||
|
* https://github.com/nvim-telescope/telescope.nvim[telescope] an extendable fuzzy finder of lists. Working ripgrep and fd
|
||||||
|
* https://github.com/folke/which-key.nvim[which-key] a popup that displays possible keybindings of command being typed
|
||||||
|
|
||||||
|
[[sec-plugins-completions]]
|
||||||
|
=== Completions
|
||||||
|
|
||||||
|
* https://github.com/hrsh7th/nvim-cmp[nvim-cmp] a completion engine that utilizes sources
|
||||||
|
** https://github.com/hrsh7th/cmp-buffer[cmp-buffer] a source for buffer words
|
||||||
|
** https://github.com/hrsh7th/cmp-nvim-lsp[cmp-nvim-lsp] a source for builtin LSP client
|
||||||
|
** https://github.com/hrsh7th/cmp-vsnip[cmp-vsnip] a source for vim-vsnip autocomplete
|
||||||
|
** https://github.com/hrsh7th/cmp-path[cmp-path] a source for path autocomplete
|
||||||
|
** https://github.com/ray-x/cmp-treesitter[cmp-treesitter] treesitter nodes autcomplete
|
||||||
|
|
||||||
|
[[sec-plugins-snippets]]
|
||||||
|
=== Snippets
|
||||||
|
|
||||||
|
* https://github.com/hrsh7th/vim-vsnip[vim-vsnip] a snippet plugin that supports LSP/VSCode's snippet format
|
||||||
|
|
||||||
|
[[sec-plugins-autopairs]]
|
||||||
|
=== Autopairs
|
||||||
|
|
||||||
|
* https://github.com/windwp/nvim-autopairs[nvim-autopairs] an autopair plugin for neovim
|
||||||
|
|
||||||
|
[[sec-plugins-themes]]
|
||||||
|
=== Themes
|
||||||
|
|
||||||
|
* https://github.com/navarasu/onedark.nvim[onedark] a dark colorscheme with multiple options
|
||||||
|
* https://github.com/folke/tokyonight.nvim[tokyonight-nvim] a neovim theme with multiple color options
|
||||||
|
* https://github.com/catppuccin/nvim[catppuccin] a pastel theme with 4 color options
|
||||||
|
|
||||||
|
[[sec-plugins-markdown]]
|
||||||
|
=== Markdown
|
||||||
|
|
||||||
|
* https://github.com/ellisonleao/glow.nvim[glow.nvim] a markdown preview directly in neovim using glow
|
||||||
|
|
||||||
|
[[sec-plugins-rust]]
|
||||||
|
=== Rust
|
||||||
|
|
||||||
|
* https://github.com/simrat39/rust-tools.nvim[rust-tools] provides tools for rust
|
||||||
|
* https://github.com/Saecki/crates.nvim[crates.nvim] provides tools for working with `cargo.toml`
|
||||||
|
|
||||||
|
[[sec-plugins-tidalcycles]]
|
||||||
|
=== Tidal Cycles
|
||||||
|
|
||||||
|
* https://github.com/tidalcycles/vim-tidal[vim-tidal] for tidal cycles integration into vim
|
||||||
|
|
||||||
|
[[sec-plugins-sql]]
|
||||||
|
=== SQL
|
||||||
|
|
||||||
|
* https://github.com/nanotee/sqls.nvim[sqls.nvim] for useful actions that leverage `sqls` LSP
|
||||||
|
|
||||||
|
[[sec-plugins-html]]
|
||||||
|
=== HTML
|
||||||
|
|
||||||
|
* https://github.com/windwp/nvim-ts-autotag[nvim-ts-autotag] uses treesitter to autoclose/rename html tags
|
||||||
|
|
||||||
|
[[sec-plugins-dependencies]]
|
||||||
|
=== Dependencies
|
||||||
|
|
||||||
|
* https://github.com/nvim-lua/plenary.nvim[plenary] which is a dependency of some plugins, installed automatically if needed
|
9
docs/release-notes/release-notes.adoc
Normal file
9
docs/release-notes/release-notes.adoc
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[[ch-release-notes]]
|
||||||
|
[appendix]
|
||||||
|
== Release Notes
|
||||||
|
|
||||||
|
This section lists the release notes for tagged version of neovim-flake and current main.
|
||||||
|
|
||||||
|
:leveloffset: 1
|
||||||
|
|
||||||
|
include::rl-0.1.adoc[]
|
32
docs/release-notes/rl-0.1.adoc
Normal file
32
docs/release-notes/rl-0.1.adoc
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
[[sec-release-0.1]]
|
||||||
|
== Release 0.1
|
||||||
|
|
||||||
|
This is the current master branch and information here is not final. These are changes from the v0.01 tag.
|
||||||
|
|
||||||
|
Special thanks to https://github.com/nix-community/home-manager/[home-manager] for this release. Docs/manual generation, the new module evaluation system, and DAG implementation are from them.
|
||||||
|
|
||||||
|
[[sec-release-0.1-changelog]]
|
||||||
|
=== Changelog
|
||||||
|
|
||||||
|
https://github.com/jordanisaacs[jordanisaacs]:
|
||||||
|
|
||||||
|
* Removed hare language support (lsp/tree-sitter/etc). `vim.lsp.hare` is no longer defined. If you use hare and would like it added back, please file an issue.
|
||||||
|
|
||||||
|
* <<opt-vim.startPlugins>> & <<opt-vim.optPlugins>> are now an enum of `string` for options sourced from the flake inputs. Users can still provide vim plugin packages.
|
||||||
|
+
|
||||||
|
If you are contributing and adding a new plugin, add the plugin name to `availablePlugins` in https://github.com/jordanisaacs/neovim-flake/blob/20cec032bd74bc3d20ac17ce36cd84786a04fd3e/modules/lib/types-plugin.nix[types-plugin.nix].
|
||||||
|
|
||||||
|
* `neovimBuilder` has been removed for configuration. Using an overlay is no longer required. See the manual for the new way to configuration.
|
||||||
|
|
||||||
|
* Treesitter grammars are now configurable with <<opt-vim.treesitter.grammars>>. Utilizes the nixpkgs `nvim-treesitter` plugin rather than a custom input in order to take advantage of build support of pinned versions. See https://discourse.nixos.org/t/psa-if-you-are-on-unstable-try-out-nvim-treesitter-withallgrammars/23321?u=snowytrees[discourse] for more information. Packages can be found under the `vimPlugins.nvim-treesitter.builtGrammars` namespace.
|
||||||
|
|
||||||
|
* <<opt-vim.configRC>> and <<opt-vim.luaConfigRC>> are now of type DAG lines. This allows for ordering of the config. Usage is the same is in home-manager's `home.activation` option.
|
||||||
|
+
|
||||||
|
[source,nix]
|
||||||
|
----
|
||||||
|
vim.luaConfigRC = lib.nvim.dag.entryAnywhere "config here"
|
||||||
|
----
|
||||||
|
|
||||||
|
https://github.com/MoritzBoehme[MoritzBoehme]:
|
||||||
|
|
||||||
|
* `catppuccin` theme is now available as a neovim theme <<opt-vim.theme.style>> and lualine theme <<opt-vim.statusline.lualine.theme>>.
|
1022
flake.lock
Normal file
1022
flake.lock
Normal file
File diff suppressed because it is too large
Load diff
421
flake.nix
Normal file
421
flake.nix
Normal file
|
@ -0,0 +1,421 @@
|
||||||
|
{
|
||||||
|
description = "Jordan's Neovim Configuration";
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
# For generating documentation website
|
||||||
|
nmd = {
|
||||||
|
url = "gitlab:rycee/nmd";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# LSP plugins
|
||||||
|
nvim-lspconfig = {
|
||||||
|
# url = "github:neovim/nvim-lspconfig?ref=v0.1.3";
|
||||||
|
# Use master for nil_ls
|
||||||
|
url = "github:neovim/nvim-lspconfig";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
lspsaga = {
|
||||||
|
url = "github:tami5/lspsaga.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
lspkind = {
|
||||||
|
url = "github:onsails/lspkind-nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
trouble = {
|
||||||
|
url = "github:folke/trouble.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvim-treesitter-context = {
|
||||||
|
url = "github:lewis6991/nvim-treesitter-context";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvim-lightbulb = {
|
||||||
|
url = "github:kosayoda/nvim-lightbulb";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
nvim-code-action-menu = {
|
||||||
|
url = "github:weilbith/nvim-code-action-menu";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
lsp-signature = {
|
||||||
|
url = "github:ray-x/lsp_signature.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
null-ls = {
|
||||||
|
url = "github:jose-elias-alvarez/null-ls.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
sqls-nvim = {
|
||||||
|
url = "github:nanotee/sqls.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
rust-tools = {
|
||||||
|
url = "github:simrat39/rust-tools.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Copying/Registers
|
||||||
|
registers = {
|
||||||
|
url = "github:tversteeg/registers.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvim-neoclip = {
|
||||||
|
url = "github:AckslD/nvim-neoclip.lua";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Telescope
|
||||||
|
telescope = {
|
||||||
|
url = "github:nvim-telescope/telescope.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Langauge server (use master instead of nixpkgs)
|
||||||
|
rnix-lsp.url = "github:nix-community/rnix-lsp";
|
||||||
|
nil = {
|
||||||
|
url = "github:oxalica/nil";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
inputs.flake-utils.follows = "flake-utils";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Filetrees
|
||||||
|
nvim-tree-lua = {
|
||||||
|
url = "github:kyazdani42/nvim-tree.lua";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Tablines
|
||||||
|
nvim-bufferline-lua = {
|
||||||
|
url = "github:akinsho/nvim-bufferline.lua?ref=v3.0.1";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Statuslines
|
||||||
|
lualine = {
|
||||||
|
url = "github:hoob3rt/lualine.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Autocompletes
|
||||||
|
nvim-compe = {
|
||||||
|
url = "github:hrsh7th/nvim-compe";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvim-cmp = {
|
||||||
|
url = "github:hrsh7th/nvim-cmp";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
cmp-buffer = {
|
||||||
|
url = "github:hrsh7th/cmp-buffer";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
cmp-nvim-lsp = {
|
||||||
|
url = "github:hrsh7th/cmp-nvim-lsp";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
cmp-vsnip = {
|
||||||
|
url = "github:hrsh7th/cmp-vsnip";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
cmp-path = {
|
||||||
|
url = "github:hrsh7th/cmp-path";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
cmp-treesitter = {
|
||||||
|
url = "github:ray-x/cmp-treesitter";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# snippets
|
||||||
|
vim-vsnip = {
|
||||||
|
url = "github:hrsh7th/vim-vsnip";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Autopairs
|
||||||
|
nvim-autopairs = {
|
||||||
|
url = "github:windwp/nvim-autopairs";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvim-ts-autotag = {
|
||||||
|
url = "github:windwp/nvim-ts-autotag";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Commenting
|
||||||
|
kommentary = {
|
||||||
|
url = "github:b3nj5m1n/kommentary";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
todo-comments = {
|
||||||
|
url = "github:folke/todo-comments.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Buffer tools
|
||||||
|
bufdelete-nvim = {
|
||||||
|
url = "github:famiu/bufdelete.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Themes
|
||||||
|
tokyonight = {
|
||||||
|
url = "github:folke/tokyonight.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
onedark = {
|
||||||
|
url = "github:navarasu/onedark.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
catppuccin = {
|
||||||
|
url = "github:catppuccin/nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Rust crates
|
||||||
|
crates-nvim = {
|
||||||
|
url = "github:Saecki/crates.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Visuals
|
||||||
|
nvim-cursorline = {
|
||||||
|
url = "github:yamatsum/nvim-cursorline";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
indent-blankline = {
|
||||||
|
url = "github:lukas-reineke/indent-blankline.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvim-web-devicons = {
|
||||||
|
url = "github:kyazdani42/nvim-web-devicons";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
gitsigns-nvim = {
|
||||||
|
url = "github:lewis6991/gitsigns.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Key binding help
|
||||||
|
which-key = {
|
||||||
|
url = "github:folke/which-key.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Markdown
|
||||||
|
glow-nvim = {
|
||||||
|
url = "github:ellisonleao/glow.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Tidal cycles
|
||||||
|
tidalcycles = {
|
||||||
|
url = "github:mitchmindtree/tidalcycles.nix";
|
||||||
|
inputs.vim-tidal-src.url = "github:tidalcycles/vim-tidal";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Plenary (required by crates-nvim)
|
||||||
|
plenary-nvim = {
|
||||||
|
url = "github:nvim-lua/plenary.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = {
|
||||||
|
nixpkgs,
|
||||||
|
flake-utils,
|
||||||
|
...
|
||||||
|
} @ inputs: let
|
||||||
|
modulesWithInputs = import ./modules {inherit inputs;};
|
||||||
|
|
||||||
|
neovimConfiguration = {
|
||||||
|
modules ? [],
|
||||||
|
pkgs,
|
||||||
|
lib ? pkgs.lib,
|
||||||
|
check ? true,
|
||||||
|
extraSpecialArgs ? {},
|
||||||
|
}:
|
||||||
|
modulesWithInputs {
|
||||||
|
inherit pkgs lib check extraSpecialArgs;
|
||||||
|
configuration = {...}: {
|
||||||
|
imports = modules;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
nvimBin = pkg: "${pkg}/bin/nvim";
|
||||||
|
|
||||||
|
buildPkg = pkgs: modules:
|
||||||
|
(neovimConfiguration {
|
||||||
|
inherit pkgs modules;
|
||||||
|
})
|
||||||
|
.neovim;
|
||||||
|
|
||||||
|
tidalConfig = {
|
||||||
|
config = {
|
||||||
|
vim.tidal.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
mainConfig = isMaximal: {
|
||||||
|
config = {
|
||||||
|
vim.viAlias = false;
|
||||||
|
vim.vimAlias = true;
|
||||||
|
vim.lsp = {
|
||||||
|
enable = true;
|
||||||
|
formatOnSave = true;
|
||||||
|
lightbulb.enable = true;
|
||||||
|
lspsaga.enable = false;
|
||||||
|
nvimCodeActionMenu.enable = true;
|
||||||
|
trouble.enable = true;
|
||||||
|
lspSignature.enable = true;
|
||||||
|
nix = {
|
||||||
|
enable = true;
|
||||||
|
formatter = "alejandra";
|
||||||
|
};
|
||||||
|
rust.enable = isMaximal;
|
||||||
|
python = isMaximal;
|
||||||
|
clang.enable = isMaximal;
|
||||||
|
sql = isMaximal;
|
||||||
|
ts = isMaximal;
|
||||||
|
go = isMaximal;
|
||||||
|
zig.enable = isMaximal;
|
||||||
|
};
|
||||||
|
vim.visuals = {
|
||||||
|
enable = true;
|
||||||
|
nvimWebDevicons.enable = true;
|
||||||
|
lspkind.enable = true;
|
||||||
|
indentBlankline = {
|
||||||
|
enable = true;
|
||||||
|
fillChar = "";
|
||||||
|
eolChar = "";
|
||||||
|
showCurrContext = true;
|
||||||
|
};
|
||||||
|
cursorWordline = {
|
||||||
|
enable = true;
|
||||||
|
lineTimeout = 0;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
vim.statusline.lualine = {
|
||||||
|
enable = true;
|
||||||
|
theme = "catppuccin";
|
||||||
|
};
|
||||||
|
vim.theme = {
|
||||||
|
enable = true;
|
||||||
|
name = "catppuccin";
|
||||||
|
style = "mocha";
|
||||||
|
};
|
||||||
|
vim.autopairs.enable = true;
|
||||||
|
vim.autocomplete = {
|
||||||
|
enable = true;
|
||||||
|
type = "nvim-cmp";
|
||||||
|
};
|
||||||
|
vim.filetree.nvimTreeLua.enable = true;
|
||||||
|
vim.tabline.nvimBufferline.enable = true;
|
||||||
|
vim.treesitter = {
|
||||||
|
enable = true;
|
||||||
|
context.enable = true;
|
||||||
|
};
|
||||||
|
vim.keys = {
|
||||||
|
enable = true;
|
||||||
|
whichKey.enable = true;
|
||||||
|
};
|
||||||
|
vim.telescope = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
vim.markdown = {
|
||||||
|
enable = true;
|
||||||
|
glow.enable = true;
|
||||||
|
};
|
||||||
|
vim.git = {
|
||||||
|
enable = true;
|
||||||
|
gitsigns.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
nixConfig = mainConfig false;
|
||||||
|
maximalConfig = mainConfig true;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
lib = {
|
||||||
|
nvim = (import ./modules/lib/stdlib-extended.nix nixpkgs.lib).nvim;
|
||||||
|
inherit neovimConfiguration;
|
||||||
|
};
|
||||||
|
|
||||||
|
overlays.default = final: prev: {
|
||||||
|
inherit neovimConfiguration;
|
||||||
|
neovim-nix = buildPkg prev [nixConfig];
|
||||||
|
neovim-maximal = buildPkg prev [maximalConfig];
|
||||||
|
neovim-tidal = buildPkg prev [tidalConfig];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// (flake-utils.lib.eachDefaultSystem (system: let
|
||||||
|
pkgs = import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
overlays = [
|
||||||
|
inputs.tidalcycles.overlays.default
|
||||||
|
(final: prev: {
|
||||||
|
rnix-lsp = inputs.rnix-lsp.defaultPackage.${system};
|
||||||
|
nil = inputs.nil.packages.${system}.default;
|
||||||
|
})
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
docs = import ./docs {
|
||||||
|
inherit pkgs;
|
||||||
|
nmdSrc = inputs.nmd;
|
||||||
|
};
|
||||||
|
|
||||||
|
tidalPkg = buildPkg pkgs [tidalConfig];
|
||||||
|
nixPkg = buildPkg pkgs [nixConfig];
|
||||||
|
maximalPkg = buildPkg pkgs [maximalConfig];
|
||||||
|
in {
|
||||||
|
apps =
|
||||||
|
rec {
|
||||||
|
nix = {
|
||||||
|
type = "app";
|
||||||
|
program = nvimBin nixPkg;
|
||||||
|
};
|
||||||
|
maximal = {
|
||||||
|
type = "app";
|
||||||
|
program = nvimBin maximalPkg;
|
||||||
|
};
|
||||||
|
default = nix;
|
||||||
|
}
|
||||||
|
// (
|
||||||
|
if !(builtins.elem system ["aarch64-darwin" "x86_64-darwin"])
|
||||||
|
then {
|
||||||
|
tidal = {
|
||||||
|
type = "app";
|
||||||
|
program = nvimBin tidalPkg;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {}
|
||||||
|
);
|
||||||
|
|
||||||
|
devShells.default = pkgs.mkShell {nativeBuildInputs = [nixPkg];};
|
||||||
|
|
||||||
|
packages =
|
||||||
|
{
|
||||||
|
docs-html = docs.manual.html;
|
||||||
|
docs-manpages = docs.manPages;
|
||||||
|
docs-json = docs.options.json;
|
||||||
|
default = nixPkg;
|
||||||
|
nix = nixPkg;
|
||||||
|
maximal = maximalPkg;
|
||||||
|
}
|
||||||
|
// (
|
||||||
|
if !(builtins.elem system ["aarch64-darwin" "x86_64-darwin"])
|
||||||
|
then {
|
||||||
|
tidal = tidalPkg;
|
||||||
|
}
|
||||||
|
else {}
|
||||||
|
);
|
||||||
|
}));
|
||||||
|
}
|
43
modules/autopairs/default.nix
Normal file
43
modules/autopairs/default.nix
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.autopairs;
|
||||||
|
in {
|
||||||
|
options.vim = {
|
||||||
|
autopairs = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "enable autopairs";
|
||||||
|
};
|
||||||
|
|
||||||
|
type = mkOption {
|
||||||
|
type = types.enum ["nvim-autopairs"];
|
||||||
|
default = "nvim-autopairs";
|
||||||
|
description = "Set the autopairs type. Options: nvim-autopairs [nvim-autopairs]";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config =
|
||||||
|
mkIf cfg.enable
|
||||||
|
{
|
||||||
|
vim.startPlugins = ["nvim-autopairs"];
|
||||||
|
|
||||||
|
vim.luaConfigRC.autopairs = nvim.dag.entryAnywhere ''
|
||||||
|
require("nvim-autopairs").setup{}
|
||||||
|
${optionalString (config.vim.autocomplete.type == "nvim-compe") ''
|
||||||
|
require('nvim-autopairs.completion.compe').setup({
|
||||||
|
map_cr = true,
|
||||||
|
map_complete = true,
|
||||||
|
auto_select = false,
|
||||||
|
})
|
||||||
|
''}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
225
modules/basic/default.nix
Normal file
225
modules/basic/default.nix
Normal file
|
@ -0,0 +1,225 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim;
|
||||||
|
in {
|
||||||
|
options.vim = {
|
||||||
|
colourTerm = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "Set terminal up for 256 colours";
|
||||||
|
};
|
||||||
|
|
||||||
|
disableArrows = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Set to prevent arrow keys from moving cursor";
|
||||||
|
};
|
||||||
|
|
||||||
|
hideSearchHighlight = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Hide search highlight so it doesn't stay highlighted";
|
||||||
|
};
|
||||||
|
|
||||||
|
scrollOffset = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = 8;
|
||||||
|
description = "Start scrolling this number of lines from the top or bottom of the page.";
|
||||||
|
};
|
||||||
|
|
||||||
|
wordWrap = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "Enable word wrapping.";
|
||||||
|
};
|
||||||
|
|
||||||
|
syntaxHighlighting = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "Enable syntax highlighting";
|
||||||
|
};
|
||||||
|
|
||||||
|
mapLeaderSpace = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "Map the space key to leader key";
|
||||||
|
};
|
||||||
|
|
||||||
|
useSystemClipboard = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "Make use of the clipboard for default yank and paste operations. Don't use * and +";
|
||||||
|
};
|
||||||
|
|
||||||
|
mouseSupport = mkOption {
|
||||||
|
type = with types; enum ["a" "n" "v" "i" "c"];
|
||||||
|
default = "a";
|
||||||
|
description = "Set modes for mouse support. a - all, n - normal, v - visual, i - insert, c - command";
|
||||||
|
};
|
||||||
|
|
||||||
|
lineNumberMode = mkOption {
|
||||||
|
type = with types; enum ["relative" "number" "relNumber" "none"];
|
||||||
|
default = "relNumber";
|
||||||
|
description = "How line numbers are displayed. none, relative, number, relNumber";
|
||||||
|
};
|
||||||
|
|
||||||
|
preventJunkFiles = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Prevent swapfile, backupfile from being created";
|
||||||
|
};
|
||||||
|
|
||||||
|
tabWidth = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = 4;
|
||||||
|
description = "Set the width of tabs";
|
||||||
|
};
|
||||||
|
|
||||||
|
autoIndent = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "Enable auto indent";
|
||||||
|
};
|
||||||
|
|
||||||
|
cmdHeight = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = 1;
|
||||||
|
description = "Height of the command pane";
|
||||||
|
};
|
||||||
|
|
||||||
|
updateTime = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = 300;
|
||||||
|
description = "The number of milliseconds till Cursor Hold event is fired";
|
||||||
|
};
|
||||||
|
|
||||||
|
showSignColumn = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "Show the sign column";
|
||||||
|
};
|
||||||
|
|
||||||
|
bell = mkOption {
|
||||||
|
type = types.enum ["none" "visual" "on"];
|
||||||
|
default = "none";
|
||||||
|
description = "Set how bells are handled. Options: on, visual or none";
|
||||||
|
};
|
||||||
|
|
||||||
|
mapTimeout = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = 500;
|
||||||
|
description = "Timeout in ms that neovim will wait for mapped action to complete";
|
||||||
|
};
|
||||||
|
|
||||||
|
splitBelow = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "New splits will open below instead of on top";
|
||||||
|
};
|
||||||
|
|
||||||
|
splitRight = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "New splits will open to the right";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
vim.startPlugins = ["plenary-nvim"];
|
||||||
|
|
||||||
|
vim.nmap = mkIf cfg.disableArrows {
|
||||||
|
"<up>" = "<nop>";
|
||||||
|
"<down>" = "<nop>";
|
||||||
|
"<left>" = "<nop>";
|
||||||
|
"<right>" = "<nop>";
|
||||||
|
};
|
||||||
|
|
||||||
|
vim.imap = mkIf cfg.disableArrows {
|
||||||
|
"<up>" = "<nop>";
|
||||||
|
"<down>" = "<nop>";
|
||||||
|
"<left>" = "<nop>";
|
||||||
|
"<right>" = "<nop>";
|
||||||
|
};
|
||||||
|
|
||||||
|
vim.nnoremap = mkIf cfg.mapLeaderSpace {"<space>" = "<nop>";};
|
||||||
|
|
||||||
|
vim.configRC.basic = nvim.dag.entryAfter ["globalsScript"] ''
|
||||||
|
" Settings that are set for everything
|
||||||
|
set encoding=utf-8
|
||||||
|
set mouse=${cfg.mouseSupport}
|
||||||
|
set tabstop=${toString cfg.tabWidth}
|
||||||
|
set shiftwidth=${toString cfg.tabWidth}
|
||||||
|
set softtabstop=${toString cfg.tabWidth}
|
||||||
|
set expandtab
|
||||||
|
set cmdheight=${toString cfg.cmdHeight}
|
||||||
|
set updatetime=${toString cfg.updateTime}
|
||||||
|
set shortmess+=c
|
||||||
|
set tm=${toString cfg.mapTimeout}
|
||||||
|
set hidden
|
||||||
|
${optionalString cfg.splitBelow ''
|
||||||
|
set splitbelow
|
||||||
|
''}
|
||||||
|
${optionalString cfg.splitRight ''
|
||||||
|
set splitright
|
||||||
|
''}
|
||||||
|
${optionalString cfg.showSignColumn ''
|
||||||
|
set signcolumn=yes
|
||||||
|
''}
|
||||||
|
${optionalString cfg.autoIndent ''
|
||||||
|
set autoindent
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString cfg.preventJunkFiles ''
|
||||||
|
set noswapfile
|
||||||
|
set nobackup
|
||||||
|
set nowritebackup
|
||||||
|
''}
|
||||||
|
${optionalString (cfg.bell == "none") ''
|
||||||
|
set noerrorbells
|
||||||
|
set novisualbell
|
||||||
|
''}
|
||||||
|
${optionalString (cfg.bell == "on") ''
|
||||||
|
set novisualbell
|
||||||
|
''}
|
||||||
|
${optionalString (cfg.bell == "visual") ''
|
||||||
|
set noerrorbells
|
||||||
|
''}
|
||||||
|
${optionalString (cfg.lineNumberMode == "relative") ''
|
||||||
|
set relativenumber
|
||||||
|
''}
|
||||||
|
${optionalString (cfg.lineNumberMode == "number") ''
|
||||||
|
set number
|
||||||
|
''}
|
||||||
|
${optionalString (cfg.lineNumberMode == "relNumber") ''
|
||||||
|
set number relativenumber
|
||||||
|
''}
|
||||||
|
${optionalString cfg.useSystemClipboard ''
|
||||||
|
set clipboard+=unnamedplus
|
||||||
|
''}
|
||||||
|
${optionalString cfg.mapLeaderSpace ''
|
||||||
|
let mapleader=" "
|
||||||
|
let maplocalleader=" "
|
||||||
|
''}
|
||||||
|
${optionalString cfg.syntaxHighlighting ''
|
||||||
|
syntax on
|
||||||
|
''}
|
||||||
|
${optionalString (!cfg.wordWrap) ''
|
||||||
|
set nowrap
|
||||||
|
''}
|
||||||
|
${optionalString cfg.hideSearchHighlight ''
|
||||||
|
set nohlsearch
|
||||||
|
set incsearch
|
||||||
|
''}
|
||||||
|
${optionalString cfg.colourTerm ''
|
||||||
|
set termguicolors
|
||||||
|
set t_Co=256
|
||||||
|
''}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
126
modules/completion/default.nix
Normal file
126
modules/completion/default.nix
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.autocomplete;
|
||||||
|
in {
|
||||||
|
options.vim = {
|
||||||
|
autocomplete = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "enable autocomplete";
|
||||||
|
};
|
||||||
|
|
||||||
|
type = mkOption {
|
||||||
|
type = types.enum ["nvim-cmp"];
|
||||||
|
default = "nvim-cmp";
|
||||||
|
description = "Set the autocomplete plugin. Options: [nvim-cmp]";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
vim.startPlugins = [
|
||||||
|
"nvim-cmp"
|
||||||
|
"cmp-buffer"
|
||||||
|
"cmp-vsnip"
|
||||||
|
"cmp-path"
|
||||||
|
"cmp-treesitter"
|
||||||
|
];
|
||||||
|
|
||||||
|
vim.luaConfigRC.completion = mkIf (cfg.type == "nvim-cmp") (nvim.dag.entryAnywhere ''
|
||||||
|
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
|
||||||
|
|
||||||
|
local feedkey = function(key, mode)
|
||||||
|
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(key, true, true, true), mode, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
local cmp = require'cmp'
|
||||||
|
cmp.setup({
|
||||||
|
snippet = {
|
||||||
|
expand = function(args)
|
||||||
|
vim.fn["vsnip#anonymous"](args.body)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
sources = {
|
||||||
|
${optionalString (config.vim.lsp.enable) "{ name = 'nvim_lsp' },"}
|
||||||
|
${optionalString (config.vim.lsp.rust.enable) "{ name = 'crates' },"}
|
||||||
|
{ name = 'vsnip' },
|
||||||
|
{ name = 'treesitter' },
|
||||||
|
{ name = 'path' },
|
||||||
|
{ name = 'buffer' },
|
||||||
|
},
|
||||||
|
mapping = {
|
||||||
|
['<C-d>'] = cmp.mapping(cmp.mapping.scroll_docs(-4), { 'i', 'c' }),
|
||||||
|
['<C-f>'] = cmp.mapping(cmp.mapping.scroll_docs(4), { 'i', 'c'}),
|
||||||
|
['<C-Space>'] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c'}),
|
||||||
|
['<C-y>'] = cmp.config.disable,
|
||||||
|
['<C-e>'] = cmp.mapping({
|
||||||
|
i = cmp.mapping.abort(),
|
||||||
|
c = cmp.mapping.close(),
|
||||||
|
}),
|
||||||
|
['<CR>'] = cmp.mapping.confirm({
|
||||||
|
select = true,
|
||||||
|
}),
|
||||||
|
['<Tab>'] = cmp.mapping(function (fallback)
|
||||||
|
if cmp.visible() then
|
||||||
|
cmp.select_next_item()
|
||||||
|
elseif vim.fn['vsnip#available'](1) == 1 then
|
||||||
|
feedkey("<Plug>(vsnip-expand-or-jump)", "")
|
||||||
|
elseif has_words_before() then
|
||||||
|
cmp.complete()
|
||||||
|
else
|
||||||
|
fallback()
|
||||||
|
end
|
||||||
|
end, { 'i', 's' }),
|
||||||
|
['<S-Tab>'] = cmp.mapping(function (fallback)
|
||||||
|
if cmp.visible() then
|
||||||
|
cmp.select_prev_item()
|
||||||
|
elseif vim.fn['vsnip#available'](-1) == 1 then
|
||||||
|
feedkeys("<Plug>(vsnip-jump-prev)", "")
|
||||||
|
end
|
||||||
|
end, { 'i', 's' })
|
||||||
|
},
|
||||||
|
completion = {
|
||||||
|
completeopt = 'menu,menuone,noinsert',
|
||||||
|
},
|
||||||
|
formatting = {
|
||||||
|
format = function(entry, vim_item)
|
||||||
|
-- type of kind
|
||||||
|
vim_item.kind = ${
|
||||||
|
optionalString (config.vim.visuals.lspkind.enable)
|
||||||
|
"require('lspkind').presets.default[vim_item.kind] .. ' ' .."
|
||||||
|
} vim_item.kind
|
||||||
|
|
||||||
|
-- name for each source
|
||||||
|
vim_item.menu = ({
|
||||||
|
buffer = "[Buffer]",
|
||||||
|
nvim_lsp = "[LSP]",
|
||||||
|
vsnip = "[VSnip]",
|
||||||
|
crates = "[Crates]",
|
||||||
|
path = "[Path]",
|
||||||
|
})[entry.source.name]
|
||||||
|
return vim_item
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
${optionalString (config.vim.autopairs.enable && config.vim.autopairs.type == "nvim-autopairs") ''
|
||||||
|
local cmp_autopairs = require('nvim-autopairs.completion.cmp')
|
||||||
|
cmp.event:on('confirm_done', cmp_autopairs.on_confirm_done({ map_char = { text = ""} }))
|
||||||
|
''}
|
||||||
|
'');
|
||||||
|
|
||||||
|
vim.snippets.vsnip.enable =
|
||||||
|
if (cfg.type == "nvim-cmp")
|
||||||
|
then true
|
||||||
|
else config.vim.snippets.vsnip.enable;
|
||||||
|
};
|
||||||
|
}
|
225
modules/core/default.nix
Normal file
225
modules/core/default.nix
Normal file
|
@ -0,0 +1,225 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim;
|
||||||
|
|
||||||
|
wrapLuaConfig = luaConfig: ''
|
||||||
|
lua << EOF
|
||||||
|
${luaConfig}
|
||||||
|
EOF
|
||||||
|
'';
|
||||||
|
|
||||||
|
mkMappingOption = it:
|
||||||
|
mkOption ({
|
||||||
|
default = {};
|
||||||
|
type = with types; attrsOf (nullOr str);
|
||||||
|
}
|
||||||
|
// it);
|
||||||
|
in {
|
||||||
|
options.vim = {
|
||||||
|
viAlias = mkOption {
|
||||||
|
description = "Enable vi alias";
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
vimAlias = mkOption {
|
||||||
|
description = "Enable vim alias";
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
configRC = mkOption {
|
||||||
|
description = "vimrc contents";
|
||||||
|
type = nvim.types.dagOf types.lines;
|
||||||
|
default = {};
|
||||||
|
};
|
||||||
|
|
||||||
|
luaConfigRC = mkOption {
|
||||||
|
description = "vim lua config";
|
||||||
|
type = nvim.types.dagOf types.lines;
|
||||||
|
default = {};
|
||||||
|
};
|
||||||
|
|
||||||
|
builtConfigRC = mkOption {
|
||||||
|
internal = true;
|
||||||
|
type = types.lines;
|
||||||
|
description = "The built config for neovim after resolving the DAG";
|
||||||
|
};
|
||||||
|
|
||||||
|
startPlugins = nvim.types.pluginsOpt {
|
||||||
|
default = [];
|
||||||
|
description = "List of plugins to startup.";
|
||||||
|
};
|
||||||
|
|
||||||
|
optPlugins = nvim.types.pluginsOpt {
|
||||||
|
default = [];
|
||||||
|
description = "List of plugins to optionally load";
|
||||||
|
};
|
||||||
|
|
||||||
|
globals = mkOption {
|
||||||
|
default = {};
|
||||||
|
description = "Set containing global variable values";
|
||||||
|
type = types.attrs;
|
||||||
|
};
|
||||||
|
|
||||||
|
nnoremap =
|
||||||
|
mkMappingOption {description = "Defines 'Normal mode' mappings";};
|
||||||
|
|
||||||
|
inoremap = mkMappingOption {
|
||||||
|
description = "Defines 'Insert and Replace mode' mappings";
|
||||||
|
};
|
||||||
|
|
||||||
|
vnoremap = mkMappingOption {
|
||||||
|
description = "Defines 'Visual and Select mode' mappings";
|
||||||
|
};
|
||||||
|
|
||||||
|
xnoremap =
|
||||||
|
mkMappingOption {description = "Defines 'Visual mode' mappings";};
|
||||||
|
|
||||||
|
snoremap =
|
||||||
|
mkMappingOption {description = "Defines 'Select mode' mappings";};
|
||||||
|
|
||||||
|
cnoremap =
|
||||||
|
mkMappingOption {description = "Defines 'Command-line mode' mappings";};
|
||||||
|
|
||||||
|
onoremap = mkMappingOption {
|
||||||
|
description = "Defines 'Operator pending mode' mappings";
|
||||||
|
};
|
||||||
|
|
||||||
|
tnoremap =
|
||||||
|
mkMappingOption {description = "Defines 'Terminal mode' mappings";};
|
||||||
|
|
||||||
|
nmap = mkMappingOption {description = "Defines 'Normal mode' mappings";};
|
||||||
|
|
||||||
|
imap = mkMappingOption {
|
||||||
|
description = "Defines 'Insert and Replace mode' mappings";
|
||||||
|
};
|
||||||
|
|
||||||
|
vmap = mkMappingOption {
|
||||||
|
description = "Defines 'Visual and Select mode' mappings";
|
||||||
|
};
|
||||||
|
|
||||||
|
xmap = mkMappingOption {description = "Defines 'Visual mode' mappings";};
|
||||||
|
|
||||||
|
smap = mkMappingOption {description = "Defines 'Select mode' mappings";};
|
||||||
|
|
||||||
|
cmap =
|
||||||
|
mkMappingOption {description = "Defines 'Command-line mode' mappings";};
|
||||||
|
|
||||||
|
omap = mkMappingOption {
|
||||||
|
description = "Defines 'Operator pending mode' mappings";
|
||||||
|
};
|
||||||
|
|
||||||
|
tmap =
|
||||||
|
mkMappingOption {description = "Defines 'Terminal mode' mappings";};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = let
|
||||||
|
mkVimBool = val:
|
||||||
|
if val
|
||||||
|
then "1"
|
||||||
|
else "0";
|
||||||
|
valToVim = val:
|
||||||
|
if (isInt val)
|
||||||
|
then (builtins.toString val)
|
||||||
|
else
|
||||||
|
(
|
||||||
|
if (isBool val)
|
||||||
|
then (mkVimBool val)
|
||||||
|
else (toJSON val)
|
||||||
|
);
|
||||||
|
|
||||||
|
filterNonNull = mappings: filterAttrs (name: value: value != null) mappings;
|
||||||
|
globalsScript =
|
||||||
|
mapAttrsFlatten (name: value: "let g:${name}=${valToVim value}")
|
||||||
|
(filterNonNull cfg.globals);
|
||||||
|
|
||||||
|
matchCtrl = it: match "Ctrl-(.)(.*)" it;
|
||||||
|
mapKeyBinding = it: let
|
||||||
|
groups = matchCtrl it;
|
||||||
|
in
|
||||||
|
if groups == null
|
||||||
|
then it
|
||||||
|
else "<C-${toUpper (head groups)}>${head (tail groups)}";
|
||||||
|
mapVimBinding = prefix: mappings:
|
||||||
|
mapAttrsFlatten (name: value: "${prefix} ${mapKeyBinding name} ${value}")
|
||||||
|
(filterNonNull mappings);
|
||||||
|
|
||||||
|
nmap = mapVimBinding "nmap" config.vim.nmap;
|
||||||
|
imap = mapVimBinding "imap" config.vim.imap;
|
||||||
|
vmap = mapVimBinding "vmap" config.vim.vmap;
|
||||||
|
xmap = mapVimBinding "xmap" config.vim.xmap;
|
||||||
|
smap = mapVimBinding "smap" config.vim.smap;
|
||||||
|
cmap = mapVimBinding "cmap" config.vim.cmap;
|
||||||
|
omap = mapVimBinding "omap" config.vim.omap;
|
||||||
|
tmap = mapVimBinding "tmap" config.vim.tmap;
|
||||||
|
|
||||||
|
nnoremap = mapVimBinding "nnoremap" config.vim.nnoremap;
|
||||||
|
inoremap = mapVimBinding "inoremap" config.vim.inoremap;
|
||||||
|
vnoremap = mapVimBinding "vnoremap" config.vim.vnoremap;
|
||||||
|
xnoremap = mapVimBinding "xnoremap" config.vim.xnoremap;
|
||||||
|
snoremap = mapVimBinding "snoremap" config.vim.snoremap;
|
||||||
|
cnoremap = mapVimBinding "cnoremap" config.vim.cnoremap;
|
||||||
|
onoremap = mapVimBinding "onoremap" config.vim.onoremap;
|
||||||
|
tnoremap = mapVimBinding "tnoremap" config.vim.tnoremap;
|
||||||
|
|
||||||
|
resolveDag = {
|
||||||
|
name,
|
||||||
|
dag,
|
||||||
|
mapResult,
|
||||||
|
}: let
|
||||||
|
sortedDag = nvim.dag.topoSort dag;
|
||||||
|
result =
|
||||||
|
if sortedDag ? result
|
||||||
|
then mapResult sortedDag.result
|
||||||
|
else abort ("Dependency cycle in ${name}: " + toJSON sortedConfig);
|
||||||
|
in
|
||||||
|
result;
|
||||||
|
in {
|
||||||
|
vim = {
|
||||||
|
configRC = {
|
||||||
|
globalsScript = nvim.dag.entryAnywhere (concatStringsSep "\n" globalsScript);
|
||||||
|
|
||||||
|
luaScript = let
|
||||||
|
mkSection = r: ''
|
||||||
|
-- SECTION: ${r.name}
|
||||||
|
${r.data}
|
||||||
|
'';
|
||||||
|
mapResult = r: (wrapLuaConfig (concatStringsSep "\n" (map mkSection r)));
|
||||||
|
luaConfig = resolveDag {
|
||||||
|
name = "lua config script";
|
||||||
|
dag = cfg.luaConfigRC;
|
||||||
|
inherit mapResult;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
nvim.dag.entryAfter ["globalsScript"] luaConfig;
|
||||||
|
|
||||||
|
mappings = let
|
||||||
|
maps = [nmap imap vmap xmap smap cmap omap tmap nnoremap inoremap vnoremap xnoremap snoremap cnoremap onoremap tnoremap];
|
||||||
|
mapConfig = concatStringsSep "\n" (map (v: concatStringsSep "\n" v) maps);
|
||||||
|
in
|
||||||
|
nvim.dag.entryAfter ["globalsScript"] mapConfig;
|
||||||
|
};
|
||||||
|
|
||||||
|
builtConfigRC = let
|
||||||
|
mkSection = r: ''
|
||||||
|
" SECTION: ${r.name}
|
||||||
|
${r.data}
|
||||||
|
'';
|
||||||
|
mapResult = r: (concatStringsSep "\n" (map mkSection r));
|
||||||
|
vimConfig = resolveDag {
|
||||||
|
name = "vim config script";
|
||||||
|
dag = cfg.configRC;
|
||||||
|
inherit mapResult;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
vimConfig;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
72
modules/default.nix
Normal file
72
modules/default.nix
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
{inputs}: {
|
||||||
|
configuration,
|
||||||
|
pkgs,
|
||||||
|
lib ? pkgs.lib,
|
||||||
|
check ? true,
|
||||||
|
extraSpecialArgs ? {},
|
||||||
|
}: let
|
||||||
|
inherit (pkgs) neovim-unwrapped wrapNeovim vimPlugins;
|
||||||
|
inherit (builtins) map filter isString toString getAttr hasAttr attrNames;
|
||||||
|
inherit (pkgs.vimUtils) buildVimPluginFrom2Nix;
|
||||||
|
|
||||||
|
extendedLib = import ./lib/stdlib-extended.nix lib;
|
||||||
|
|
||||||
|
nvimModules = import ./modules.nix {
|
||||||
|
inherit check pkgs;
|
||||||
|
lib = extendedLib;
|
||||||
|
};
|
||||||
|
|
||||||
|
module = extendedLib.evalModules {
|
||||||
|
modules = [configuration] ++ nvimModules;
|
||||||
|
specialArgs =
|
||||||
|
{
|
||||||
|
modulesPath = toString ./.;
|
||||||
|
}
|
||||||
|
// extraSpecialArgs;
|
||||||
|
};
|
||||||
|
|
||||||
|
buildPlug = name:
|
||||||
|
buildVimPluginFrom2Nix rec {
|
||||||
|
pname = name;
|
||||||
|
version = "master";
|
||||||
|
src = assert lib.asserts.assertMsg (name != "nvim-treesitter") "Use buildTreesitterPlug for building nvim-treesitter.";
|
||||||
|
getAttr pname inputs;
|
||||||
|
};
|
||||||
|
|
||||||
|
buildTreesitterPlug = grammars: vimPlugins.nvim-treesitter.withPlugins (_: grammars);
|
||||||
|
|
||||||
|
vimOptions = module.config.vim;
|
||||||
|
|
||||||
|
buildConfigPlugins = plugins:
|
||||||
|
map
|
||||||
|
(plug: (
|
||||||
|
if (isString plug)
|
||||||
|
then
|
||||||
|
(
|
||||||
|
if (plug == "nvim-treesitter")
|
||||||
|
then (buildTreesitterPlug vimOptions.treesitter.grammars)
|
||||||
|
else (buildPlug plug)
|
||||||
|
)
|
||||||
|
else plug
|
||||||
|
))
|
||||||
|
(filter
|
||||||
|
(f: f != null)
|
||||||
|
plugins);
|
||||||
|
|
||||||
|
neovim = wrapNeovim neovim-unwrapped {
|
||||||
|
viAlias = vimOptions.viAlias;
|
||||||
|
vimAlias = vimOptions.vimAlias;
|
||||||
|
configure = {
|
||||||
|
customRC = vimOptions.builtConfigRC;
|
||||||
|
|
||||||
|
packages.myVimPackage = {
|
||||||
|
start = buildConfigPlugins vimOptions.startPlugins;
|
||||||
|
opt = buildConfigPlugins vimOptions.optPlugins;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
inherit (module) options config;
|
||||||
|
inherit (module._module.args) pkgs;
|
||||||
|
inherit neovim;
|
||||||
|
}
|
10
modules/filetree/default.nix
Normal file
10
modules/filetree/default.nix
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
./nvimtreelua.nix
|
||||||
|
];
|
||||||
|
}
|
186
modules/filetree/nvimtreelua.nix
Normal file
186
modules/filetree/nvimtreelua.nix
Normal file
|
@ -0,0 +1,186 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.filetree.nvimTreeLua;
|
||||||
|
in {
|
||||||
|
options.vim.filetree.nvimTreeLua = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Enable nvim-tree-lua";
|
||||||
|
};
|
||||||
|
|
||||||
|
treeSide = mkOption {
|
||||||
|
default = "left";
|
||||||
|
description = "Side the tree will appear on left or right";
|
||||||
|
type = types.enum ["left" "right"];
|
||||||
|
};
|
||||||
|
|
||||||
|
treeWidth = mkOption {
|
||||||
|
default = 25;
|
||||||
|
description = "Width of the tree in charecters";
|
||||||
|
type = types.int;
|
||||||
|
};
|
||||||
|
|
||||||
|
hideFiles = mkOption {
|
||||||
|
default = [".git" "node_modules" ".cache"];
|
||||||
|
description = "Files to hide in the file view by default.";
|
||||||
|
type = with types; listOf str;
|
||||||
|
};
|
||||||
|
|
||||||
|
hideIgnoredGitFiles = mkOption {
|
||||||
|
default = false;
|
||||||
|
description = "Hide files ignored by git";
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
openOnSetup = mkOption {
|
||||||
|
default = true;
|
||||||
|
description = "Open when vim is started on a directory";
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
closeOnLastWindow = mkOption {
|
||||||
|
default = true;
|
||||||
|
description = "Close when tree is last window open";
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
ignoreFileTypes = mkOption {
|
||||||
|
default = [];
|
||||||
|
description = "Ignore file types";
|
||||||
|
type = with types; listOf str;
|
||||||
|
};
|
||||||
|
|
||||||
|
closeOnFileOpen = mkOption {
|
||||||
|
default = false;
|
||||||
|
description = "Closes the tree when a file is opened.";
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
resizeOnFileOpen = mkOption {
|
||||||
|
default = false;
|
||||||
|
description = "Resizes the tree when opening a file.";
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
followBufferFile = mkOption {
|
||||||
|
default = true;
|
||||||
|
description = "Follow file that is in current buffer on tree";
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
indentMarkers = mkOption {
|
||||||
|
default = true;
|
||||||
|
description = "Show indent markers";
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
hideDotFiles = mkOption {
|
||||||
|
default = false;
|
||||||
|
description = "Hide dotfiles";
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
openTreeOnNewTab = mkOption {
|
||||||
|
default = false;
|
||||||
|
description = "Opens the tree view when opening a new tab";
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
disableNetRW = mkOption {
|
||||||
|
default = false;
|
||||||
|
description = "Disables netrw and replaces it with tree";
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
hijackNetRW = mkOption {
|
||||||
|
default = true;
|
||||||
|
description = "Prevents netrw from automatically opening when opening directories";
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
trailingSlash = mkOption {
|
||||||
|
default = true;
|
||||||
|
description = "Add a trailing slash to all folders";
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
groupEmptyFolders = mkOption {
|
||||||
|
default = true;
|
||||||
|
description = "Compact empty folders trees into a single item";
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
lspDiagnostics = mkOption {
|
||||||
|
default = true;
|
||||||
|
description = "Shows lsp diagnostics in the tree";
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
systemOpenCmd = mkOption {
|
||||||
|
default = "${pkgs.xdg-utils}/bin/xdg-open";
|
||||||
|
description = "The command used to open a file with the associated default program";
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
vim.startPlugins = ["nvim-tree-lua"];
|
||||||
|
|
||||||
|
vim.nnoremap = {
|
||||||
|
"<C-n>" = ":NvimTreeToggle<CR>";
|
||||||
|
"<leader>tr" = ":NvimTreeRefresh<CR>";
|
||||||
|
"<leader>tg" = ":NvimTreeFindFile<CR>";
|
||||||
|
"<leader>tf" = ":NvimTreeFocus<CR>";
|
||||||
|
};
|
||||||
|
|
||||||
|
vim.luaConfigRC.nvimtreelua = nvim.dag.entryAnywhere ''
|
||||||
|
require'nvim-tree'.setup({
|
||||||
|
disable_netrw = ${boolToString cfg.disableNetRW},
|
||||||
|
hijack_netrw = ${boolToString cfg.hijackNetRW},
|
||||||
|
open_on_tab = ${boolToString cfg.openTreeOnNewTab},
|
||||||
|
open_on_setup = ${boolToString cfg.openOnSetup},
|
||||||
|
open_on_setup_file = ${boolToString cfg.openOnSetup},
|
||||||
|
system_open = {
|
||||||
|
cmd = ${"'" + cfg.systemOpenCmd + "'"},
|
||||||
|
},
|
||||||
|
diagnostics = {
|
||||||
|
enable = ${boolToString cfg.lspDiagnostics},
|
||||||
|
},
|
||||||
|
view = {
|
||||||
|
width = ${toString cfg.treeWidth},
|
||||||
|
side = ${"'" + cfg.treeSide + "'"},
|
||||||
|
},
|
||||||
|
renderer = {
|
||||||
|
indent_markers = {
|
||||||
|
enable = ${boolToString cfg.indentMarkers},
|
||||||
|
},
|
||||||
|
add_trailing = ${boolToString cfg.trailingSlash},
|
||||||
|
group_empty = ${boolToString cfg.groupEmptyFolders},
|
||||||
|
},
|
||||||
|
actions = {
|
||||||
|
open_file = {
|
||||||
|
quit_on_open = ${boolToString cfg.closeOnFileOpen},
|
||||||
|
resize_window = ${boolToString cfg.resizeOnFileOpen},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
git = {
|
||||||
|
enable = true,
|
||||||
|
ignore = ${boolToString cfg.hideIgnoredGitFiles},
|
||||||
|
},
|
||||||
|
filters = {
|
||||||
|
dotfiles = ${boolToString cfg.hideDotFiles},
|
||||||
|
custom = {
|
||||||
|
${builtins.concatStringsSep "\n" (builtins.map (s: "\"" + s + "\",") cfg.hideFiles)}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
14
modules/git/config.nix
Normal file
14
modules/git/config.nix
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; {
|
||||||
|
config = {
|
||||||
|
vim.git = {
|
||||||
|
enable = mkDefault false;
|
||||||
|
gitsigns.enable = mkDefault false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
11
modules/git/default.nix
Normal file
11
modules/git/default.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
./config.nix
|
||||||
|
./git.nix
|
||||||
|
];
|
||||||
|
}
|
69
modules/git/git.nix
Normal file
69
modules/git/git.nix
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.git;
|
||||||
|
in {
|
||||||
|
options.vim.git = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
description = "Enable git plugins";
|
||||||
|
};
|
||||||
|
|
||||||
|
gitsigns.enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
description = "Enable git options";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config =
|
||||||
|
mkIf cfg.enable
|
||||||
|
(
|
||||||
|
let
|
||||||
|
mkVimBool = val:
|
||||||
|
if val
|
||||||
|
then "1"
|
||||||
|
else "0";
|
||||||
|
in {
|
||||||
|
vim.startPlugins =
|
||||||
|
if (cfg.gitsigns.enable)
|
||||||
|
then ["gitsigns-nvim"]
|
||||||
|
else [];
|
||||||
|
|
||||||
|
vim.luaConfigRC.gitsigns = mkIf (cfg.gitsigns.enable) (nvim.dag.entryAnywhere ''
|
||||||
|
-- GitSigns setup
|
||||||
|
require('gitsigns').setup {
|
||||||
|
keymaps = {
|
||||||
|
noremap = true,
|
||||||
|
|
||||||
|
['n <leader>gn'] = { expr = true, "&diff ? \'\' : '<cmd>Gitsigns next_hunk<CR>'"},
|
||||||
|
['n <leader>gp'] = { expr = true, "&diff ? \'\' : '<cmd>Gitsigns prev_hunk<CR>'"},
|
||||||
|
|
||||||
|
['n <leader>gs'] = '<cmd>Gitsigns stage_hunk<CR>',
|
||||||
|
['v <leader>gs'] = ':Gitsigns stage_hunk<CR>',
|
||||||
|
['n <leader>gu'] = '<cmd>Gitsigns undo_stage_hunk<CR>',
|
||||||
|
['n <leader>gr'] = '<cmd>Gitsigns reset_hunk<CR>',
|
||||||
|
['v <leader>gr'] = ':Gitsigns reset_hunk<CR>',
|
||||||
|
['n <leader>gR'] = '<cmd>Gitsigns reset_buffer<CR>',
|
||||||
|
['n <leader>gp'] = '<cmd>Gitsigns preview_hunk<CR>',
|
||||||
|
['n <leader>gb'] = '<cmd>lua require"gitsigns".blame_line{full=true}<CR>',
|
||||||
|
['n <leader>gS'] = '<cmd>Gitsigns stage_buffer<CR>',
|
||||||
|
['n <leader>gU'] = '<cmd>Gitsigns reset_buffer_index<CR>',
|
||||||
|
['n <leader>gts'] = ':Gitsigns toggle_signs<CR>',
|
||||||
|
['n <leader>gtn'] = ':Gitsigns toggle_numhl<CR>',
|
||||||
|
['n <leader>gtl'] = ':Gitsigns toggle_linehl<CR>',
|
||||||
|
['n <leader>gtw'] = ':Gitsigns toggle_word_diff<CR>',
|
||||||
|
|
||||||
|
-- Text objects
|
||||||
|
['o ih'] = ':<C-U>Gitsigns select_hunk<CR>',
|
||||||
|
['x ih'] = ':<C-U>Gitsigns select_hunk<CR>'
|
||||||
|
},
|
||||||
|
}
|
||||||
|
'');
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
6
modules/keys/default.nix
Normal file
6
modules/keys/default.nix
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {imports = [./which-key.nix];}
|
24
modules/keys/which-key.nix
Normal file
24
modules/keys/which-key.nix
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.keys;
|
||||||
|
in {
|
||||||
|
options.vim.keys = {
|
||||||
|
enable = mkEnableOption "key binding plugins";
|
||||||
|
|
||||||
|
whichKey = {
|
||||||
|
enable = mkEnableOption "which-key menu";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable && cfg.whichKey.enable) {
|
||||||
|
vim.startPlugins = ["which-key"];
|
||||||
|
|
||||||
|
vim.luaConfigRC.whichkey = nvim.dag.entryAnywhere ''local wk = require("which-key").setup {}'';
|
||||||
|
};
|
||||||
|
}
|
9
modules/lib/booleans.nix
Normal file
9
modules/lib/booleans.nix
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# From home-manager: https://github.com/nix-community/home-manager/blob/master/modules/lib/booleans.nix
|
||||||
|
{lib}: {
|
||||||
|
# Converts a boolean to a yes/no string. This is used in lots of
|
||||||
|
# configuration formats.
|
||||||
|
yesNo = value:
|
||||||
|
if value
|
||||||
|
then "yes"
|
||||||
|
else "no";
|
||||||
|
}
|
105
modules/lib/dag.nix
Normal file
105
modules/lib/dag.nix
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
# From home-manager: https://github.com/nix-community/home-manager/blob/master/modules/lib/dag.nix
|
||||||
|
# A generalization of Nixpkgs's `strings-with-deps.nix`.
|
||||||
|
#
|
||||||
|
# The main differences from the Nixpkgs version are
|
||||||
|
#
|
||||||
|
# - not specific to strings, i.e., any payload is OK,
|
||||||
|
#
|
||||||
|
# - the addition of the function `entryBefore` indicating a "wanted
|
||||||
|
# by" relationship.
|
||||||
|
{lib}: let
|
||||||
|
inherit (lib) all filterAttrs nvim mapAttrs toposort;
|
||||||
|
in {
|
||||||
|
empty = {};
|
||||||
|
|
||||||
|
isEntry = e: e ? data && e ? after && e ? before;
|
||||||
|
isDag = dag:
|
||||||
|
builtins.isAttrs dag && all nvim.dag.isEntry (builtins.attrValues dag);
|
||||||
|
|
||||||
|
# Takes an attribute set containing entries built by entryAnywhere,
|
||||||
|
# entryAfter, and entryBefore to a topologically sorted list of
|
||||||
|
# entries.
|
||||||
|
#
|
||||||
|
# Internally this function uses the `toposort` function in
|
||||||
|
# `<nixpkgs/lib/lists.nix>` and its value is accordingly.
|
||||||
|
#
|
||||||
|
# Specifically, the result on success is
|
||||||
|
#
|
||||||
|
# { result = [ { name = ?; data = ?; } … ] }
|
||||||
|
#
|
||||||
|
# For example
|
||||||
|
#
|
||||||
|
# nix-repl> topoSort {
|
||||||
|
# a = entryAnywhere "1";
|
||||||
|
# b = entryAfter [ "a" "c" ] "2";
|
||||||
|
# c = entryBefore [ "d" ] "3";
|
||||||
|
# d = entryBefore [ "e" ] "4";
|
||||||
|
# e = entryAnywhere "5";
|
||||||
|
# } == {
|
||||||
|
# result = [
|
||||||
|
# { data = "1"; name = "a"; }
|
||||||
|
# { data = "3"; name = "c"; }
|
||||||
|
# { data = "2"; name = "b"; }
|
||||||
|
# { data = "4"; name = "d"; }
|
||||||
|
# { data = "5"; name = "e"; }
|
||||||
|
# ];
|
||||||
|
# }
|
||||||
|
# true
|
||||||
|
#
|
||||||
|
# And the result on error is
|
||||||
|
#
|
||||||
|
# {
|
||||||
|
# cycle = [ { after = ?; name = ?; data = ? } … ];
|
||||||
|
# loops = [ { after = ?; name = ?; data = ? } … ];
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# For example
|
||||||
|
#
|
||||||
|
# nix-repl> topoSort {
|
||||||
|
# a = entryAnywhere "1";
|
||||||
|
# b = entryAfter [ "a" "c" ] "2";
|
||||||
|
# c = entryAfter [ "d" ] "3";
|
||||||
|
# d = entryAfter [ "b" ] "4";
|
||||||
|
# e = entryAnywhere "5";
|
||||||
|
# } == {
|
||||||
|
# cycle = [
|
||||||
|
# { after = [ "a" "c" ]; data = "2"; name = "b"; }
|
||||||
|
# { after = [ "d" ]; data = "3"; name = "c"; }
|
||||||
|
# { after = [ "b" ]; data = "4"; name = "d"; }
|
||||||
|
# ];
|
||||||
|
# loops = [
|
||||||
|
# { after = [ "a" "c" ]; data = "2"; name = "b"; }
|
||||||
|
# ];
|
||||||
|
# }
|
||||||
|
# true
|
||||||
|
topoSort = dag: let
|
||||||
|
dagBefore = dag: name:
|
||||||
|
builtins.attrNames
|
||||||
|
(filterAttrs (n: v: builtins.elem name v.before) dag);
|
||||||
|
normalizedDag =
|
||||||
|
mapAttrs (n: v: {
|
||||||
|
name = n;
|
||||||
|
data = v.data;
|
||||||
|
after = v.after ++ dagBefore dag n;
|
||||||
|
})
|
||||||
|
dag;
|
||||||
|
before = a: b: builtins.elem a.name b.after;
|
||||||
|
sorted = toposort before (builtins.attrValues normalizedDag);
|
||||||
|
in
|
||||||
|
if sorted ? result
|
||||||
|
then {
|
||||||
|
result = map (v: {inherit (v) name data;}) sorted.result;
|
||||||
|
}
|
||||||
|
else sorted;
|
||||||
|
|
||||||
|
# Applies a function to each element of the given DAG.
|
||||||
|
map = f: mapAttrs (n: v: v // {data = f n v.data;});
|
||||||
|
|
||||||
|
entryBetween = before: after: data: {inherit data before after;};
|
||||||
|
|
||||||
|
# Create a DAG entry with no particular dependency information.
|
||||||
|
entryAnywhere = nvim.dag.entryBetween [] [];
|
||||||
|
|
||||||
|
entryAfter = nvim.dag.entryBetween [];
|
||||||
|
entryBefore = before: nvim.dag.entryBetween before [];
|
||||||
|
}
|
5
modules/lib/default.nix
Normal file
5
modules/lib/default.nix
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{lib}: {
|
||||||
|
dag = import ./dag.nix {inherit lib;};
|
||||||
|
booleans = import ./booleans.nix {inherit lib;};
|
||||||
|
types = import ./types.nix {inherit lib;};
|
||||||
|
}
|
13
modules/lib/stdlib-extended.nix
Normal file
13
modules/lib/stdlib-extended.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# From home-manager: https://github.com/nix-community/home-manager/blob/master/modules/lib/stdlib-extended.nix
|
||||||
|
# Just a convenience function that returns the given Nixpkgs standard
|
||||||
|
# library extended with the HM library.
|
||||||
|
nixpkgsLib: let
|
||||||
|
mkNvimLib = import ./.;
|
||||||
|
in
|
||||||
|
nixpkgsLib.extend (self: super: {
|
||||||
|
nvim = mkNvimLib {lib = self;};
|
||||||
|
|
||||||
|
# For forward compatibility.
|
||||||
|
literalExpression = super.literalExpression or super.literalExample;
|
||||||
|
literalDocBook = super.literalDocBook or super.literalExample;
|
||||||
|
})
|
68
modules/lib/types-dag.nix
Normal file
68
modules/lib/types-dag.nix
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
# From home-manager: https://github.com/nix-community/home-manager/blob/master/modules/lib/types-dag.nix
|
||||||
|
# Used for ordering config text.
|
||||||
|
{lib}: let
|
||||||
|
inherit
|
||||||
|
(lib)
|
||||||
|
defaultFunctor
|
||||||
|
nvim
|
||||||
|
mkIf
|
||||||
|
mkOrder
|
||||||
|
mkOption
|
||||||
|
mkOptionType
|
||||||
|
types
|
||||||
|
;
|
||||||
|
|
||||||
|
dagEntryOf = elemType: let
|
||||||
|
submoduleType = types.submodule ({name, ...}: {
|
||||||
|
options = {
|
||||||
|
data = mkOption {type = elemType;};
|
||||||
|
after = mkOption {type = with types; listOf str;};
|
||||||
|
before = mkOption {type = with types; listOf str;};
|
||||||
|
};
|
||||||
|
config = mkIf (elemType.name == "submodule") {
|
||||||
|
data._module.args.dagName = name;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
maybeConvert = def:
|
||||||
|
if nvim.dag.isEntry def.value
|
||||||
|
then def.value
|
||||||
|
else
|
||||||
|
nvim.dag.entryAnywhere (
|
||||||
|
if def ? priority
|
||||||
|
then mkOrder def.priority def.value
|
||||||
|
else def.value
|
||||||
|
);
|
||||||
|
in
|
||||||
|
mkOptionType {
|
||||||
|
name = "dagEntryOf";
|
||||||
|
description = "DAG entry of ${elemType.description}";
|
||||||
|
# leave the checking to the submodule type
|
||||||
|
merge = loc: defs:
|
||||||
|
submoduleType.merge loc (map (def: {
|
||||||
|
inherit (def) file;
|
||||||
|
value = maybeConvert def;
|
||||||
|
})
|
||||||
|
defs);
|
||||||
|
};
|
||||||
|
in rec {
|
||||||
|
# A directed acyclic graph of some inner type.
|
||||||
|
#
|
||||||
|
# Note, if the element type is a submodule then the `name` argument
|
||||||
|
# will always be set to the string "data" since it picks up the
|
||||||
|
# internal structure of the DAG values. To give access to the
|
||||||
|
# "actual" attribute name a new submodule argument is provided with
|
||||||
|
# the name `dagName`.
|
||||||
|
dagOf = elemType: let
|
||||||
|
attrEquivalent = types.attrsOf (dagEntryOf elemType);
|
||||||
|
in
|
||||||
|
mkOptionType rec {
|
||||||
|
name = "dagOf";
|
||||||
|
description = "DAG of ${elemType.description}";
|
||||||
|
inherit (attrEquivalent) check merge emptyValue;
|
||||||
|
getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["<name>"]);
|
||||||
|
getSubModules = elemType.getSubModules;
|
||||||
|
substSubModules = m: dagOf (elemType.substSubModules m);
|
||||||
|
functor = (defaultFunctor name) // {wrapped = elemType;};
|
||||||
|
nestedTypes.elemType = elemType;
|
||||||
|
};
|
||||||
|
}
|
55
modules/lib/types-plugin.nix
Normal file
55
modules/lib/types-plugin.nix
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
{lib}:
|
||||||
|
with lib; let
|
||||||
|
# Plugin must be same as input name
|
||||||
|
availablePlugins = [
|
||||||
|
"nvim-treesitter-context"
|
||||||
|
"gitsigns-nvim"
|
||||||
|
"plenary-nvim"
|
||||||
|
"nvim-lspconfig"
|
||||||
|
"nvim-treesitter"
|
||||||
|
"lspsaga"
|
||||||
|
"lspkind"
|
||||||
|
"nvim-lightbulb"
|
||||||
|
"lsp-signature"
|
||||||
|
"nvim-tree-lua"
|
||||||
|
"nvim-bufferline-lua"
|
||||||
|
"lualine"
|
||||||
|
"nvim-compe"
|
||||||
|
"nvim-autopairs"
|
||||||
|
"nvim-ts-autotag"
|
||||||
|
"nvim-web-devicons"
|
||||||
|
"tokyonight"
|
||||||
|
"bufdelete-nvim"
|
||||||
|
"nvim-cmp"
|
||||||
|
"cmp-nvim-lsp"
|
||||||
|
"cmp-buffer"
|
||||||
|
"cmp-vsnip"
|
||||||
|
"cmp-path"
|
||||||
|
"cmp-treesitter"
|
||||||
|
"crates-nvim"
|
||||||
|
"vim-vsnip"
|
||||||
|
"nvim-code-action-menu"
|
||||||
|
"trouble"
|
||||||
|
"null-ls"
|
||||||
|
"which-key"
|
||||||
|
"indent-blankline"
|
||||||
|
"nvim-cursorline"
|
||||||
|
"sqls-nvim"
|
||||||
|
"glow-nvim"
|
||||||
|
"telescope"
|
||||||
|
"rust-tools"
|
||||||
|
"onedark"
|
||||||
|
"catppuccin"
|
||||||
|
];
|
||||||
|
|
||||||
|
pluginsType = with types; listOf (nullOr (either (enum availablePlugins) package));
|
||||||
|
in {
|
||||||
|
pluginsOpt = {
|
||||||
|
description,
|
||||||
|
default ? [],
|
||||||
|
}:
|
||||||
|
mkOption {
|
||||||
|
inherit description default;
|
||||||
|
type = pluginsType;
|
||||||
|
};
|
||||||
|
}
|
7
modules/lib/types.nix
Normal file
7
modules/lib/types.nix
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{lib}: let
|
||||||
|
typesDag = import ./types-dag.nix {inherit lib;};
|
||||||
|
typesPlugin = import ./types-plugin.nix {inherit lib;};
|
||||||
|
in {
|
||||||
|
inherit (typesDag) dagOf;
|
||||||
|
inherit (typesPlugin) pluginsOpt;
|
||||||
|
}
|
15
modules/lsp/default.nix
Normal file
15
modules/lsp/default.nix
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
./lsp.nix
|
||||||
|
./lspsaga.nix
|
||||||
|
./nvim-code-action-menu.nix
|
||||||
|
./trouble.nix
|
||||||
|
./lsp-signature.nix
|
||||||
|
./lightbulb.nix
|
||||||
|
];
|
||||||
|
}
|
29
modules/lsp/lightbulb.nix
Normal file
29
modules/lsp/lightbulb.nix
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.lsp;
|
||||||
|
in {
|
||||||
|
options.vim.lsp = {
|
||||||
|
lightbulb = {
|
||||||
|
enable = mkEnableOption "lightbulb for code actions. Requires emoji font";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable && cfg.lightbulb.enable) {
|
||||||
|
vim.startPlugins = ["nvim-lightbulb"];
|
||||||
|
|
||||||
|
vim.configRC.lightbulb = nvim.dag.entryAnywhere ''
|
||||||
|
autocmd CursorHold,CursorHoldI * lua require'nvim-lightbulb'.update_lightbulb()
|
||||||
|
'';
|
||||||
|
|
||||||
|
vim.luaConfigRC.lightbulb = nvim.dag.entryAnywhere ''
|
||||||
|
-- Enable trouble diagnostics viewer
|
||||||
|
require'nvim-lightbulb'.setup()
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
25
modules/lsp/lsp-signature.nix
Normal file
25
modules/lsp/lsp-signature.nix
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.lsp;
|
||||||
|
in {
|
||||||
|
options.vim.lsp = {
|
||||||
|
lspSignature = {
|
||||||
|
enable = mkEnableOption "lsp signature viewer";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable && cfg.lspSignature.enable) {
|
||||||
|
vim.startPlugins = ["lsp-signature"];
|
||||||
|
|
||||||
|
vim.luaConfigRC.lsp-signature = nvim.dag.entryAnywhere ''
|
||||||
|
-- Enable lsp signature viewer
|
||||||
|
require("lsp_signature").setup()
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
405
modules/lsp/lsp.nix
Normal file
405
modules/lsp/lsp.nix
Normal file
|
@ -0,0 +1,405 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.lsp;
|
||||||
|
in {
|
||||||
|
options.vim.lsp = {
|
||||||
|
enable = mkEnableOption "neovim lsp support";
|
||||||
|
formatOnSave = mkEnableOption "Format on save";
|
||||||
|
nix = {
|
||||||
|
enable = mkEnableOption "Nix LSP";
|
||||||
|
server = mkOption {
|
||||||
|
type = with types; enum ["rnix" "nil"];
|
||||||
|
default = "nil";
|
||||||
|
description = "Which LSP to use";
|
||||||
|
};
|
||||||
|
|
||||||
|
pkg = mkOption {
|
||||||
|
type = types.package;
|
||||||
|
default =
|
||||||
|
if (cfg.nix.server == "rnix")
|
||||||
|
then pkgs.rnix-lsp
|
||||||
|
else pkgs.nil;
|
||||||
|
description = "The LSP package to use";
|
||||||
|
};
|
||||||
|
|
||||||
|
formatter = mkOption {
|
||||||
|
type = with types; enum ["nixpkgs-fmt" "alejandra"];
|
||||||
|
default = "alejandra";
|
||||||
|
description = "Which nix formatter to use";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
rust = {
|
||||||
|
enable = mkEnableOption "Rust LSP";
|
||||||
|
rustAnalyzerOpts = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = ''
|
||||||
|
["rust-analyzer"] = {
|
||||||
|
experimental = {
|
||||||
|
procAttrMacros = true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'';
|
||||||
|
description = "options to pass to rust analyzer";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
python = mkEnableOption "Python LSP";
|
||||||
|
clang = {
|
||||||
|
enable = mkEnableOption "C language LSP";
|
||||||
|
c_header = mkEnableOption "C syntax header files";
|
||||||
|
cclsOpts = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
sql = mkEnableOption "SQL Language LSP";
|
||||||
|
go = mkEnableOption "Go language LSP";
|
||||||
|
ts = mkEnableOption "TS language LSP";
|
||||||
|
zig.enable = mkEnableOption "Zig language LSP";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable (
|
||||||
|
let
|
||||||
|
writeIf = cond: msg:
|
||||||
|
if cond
|
||||||
|
then msg
|
||||||
|
else "";
|
||||||
|
in {
|
||||||
|
vim.startPlugins =
|
||||||
|
[
|
||||||
|
"nvim-lspconfig"
|
||||||
|
"null-ls"
|
||||||
|
(
|
||||||
|
if (config.vim.autocomplete.enable && (config.vim.autocomplete.type == "nvim-cmp"))
|
||||||
|
then "cmp-nvim-lsp"
|
||||||
|
else null
|
||||||
|
)
|
||||||
|
(
|
||||||
|
if cfg.sql
|
||||||
|
then "sqls-nvim"
|
||||||
|
else null
|
||||||
|
)
|
||||||
|
]
|
||||||
|
++ (
|
||||||
|
if cfg.rust.enable
|
||||||
|
then [
|
||||||
|
"crates-nvim"
|
||||||
|
"rust-tools"
|
||||||
|
]
|
||||||
|
else []
|
||||||
|
);
|
||||||
|
|
||||||
|
vim.configRC.lsp = nvim.dag.entryAnywhere ''
|
||||||
|
${
|
||||||
|
if cfg.nix.enable
|
||||||
|
then ''
|
||||||
|
autocmd filetype nix setlocal tabstop=2 shiftwidth=2 softtabstop=2
|
||||||
|
''
|
||||||
|
else ""
|
||||||
|
}
|
||||||
|
|
||||||
|
${
|
||||||
|
if cfg.clang.c_header
|
||||||
|
then ''
|
||||||
|
" c syntax for header (otherwise breaks treesitter highlighting)
|
||||||
|
" https://www.reddit.com/r/neovim/comments/orfpcd/question_does_the_c_parser_from_nvimtreesitter/
|
||||||
|
let g:c_syntax_for_h = 1
|
||||||
|
''
|
||||||
|
else ""
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
vim.luaConfigRC.lsp = nvim.dag.entryAnywhere ''
|
||||||
|
|
||||||
|
local attach_keymaps = function(client, bufnr)
|
||||||
|
local opts = { noremap=true, silent=true }
|
||||||
|
|
||||||
|
vim.api.nvim_buf_set_keymap(bufnr, 'n', '<leader>lgD', '<cmd>lua vim.lsp.buf.declaration()<CR>', opts)
|
||||||
|
vim.api.nvim_buf_set_keymap(bufnr, 'n', '<leader>lgd', '<cmd>lua vim.lsp.buf.definition()<CR>', opts)
|
||||||
|
vim.api.nvim_buf_set_keymap(bufnr, 'n', '<leader>lgt', '<cmd>lua vim.lsp.buf.type_definition()<CR>', opts)
|
||||||
|
vim.api.nvim_buf_set_keymap(bufnr, 'n', '<leader>lgn', '<cmd>lua vim.diagnostic.goto_next()<CR>', opts)
|
||||||
|
vim.api.nvim_buf_set_keymap(bufnr, 'n', '<leader>lgp', '<cmd>lua vim.diagnostic.goto_prev()<CR>', opts)
|
||||||
|
|
||||||
|
vim.api.nvim_buf_set_keymap(bufnr, 'n', '<leader>lwa', '<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>', opts)
|
||||||
|
vim.api.nvim_buf_set_keymap(bufnr, 'n', '<leader>lwr', '<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>', opts)
|
||||||
|
vim.api.nvim_buf_set_keymap(bufnr, 'n', '<leader>lwl', '<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>', opts)
|
||||||
|
|
||||||
|
vim.api.nvim_buf_set_keymap(bufnr, 'n', '<leader>lh', '<cmd>lua vim.lsp.buf.hover()<CR>', opts)
|
||||||
|
vim.api.nvim_buf_set_keymap(bufnr, 'n', '<leader>ls', '<cmd>lua vim.lsp.buf.signature_help()<CR>', opts)
|
||||||
|
vim.api.nvim_buf_set_keymap(bufnr, 'n', '<leader>ln', '<cmd>lua vim.lsp.buf.rename()<CR>', opts)
|
||||||
|
end
|
||||||
|
|
||||||
|
local null_ls = require("null-ls")
|
||||||
|
local null_helpers = require("null-ls.helpers")
|
||||||
|
local null_methods = require("null-ls.methods")
|
||||||
|
|
||||||
|
local ls_sources = {
|
||||||
|
${writeIf cfg.python
|
||||||
|
''
|
||||||
|
null_ls.builtins.formatting.black.with({
|
||||||
|
command = "${pkgs.black}/bin/black",
|
||||||
|
}),
|
||||||
|
''}
|
||||||
|
|
||||||
|
-- Commented out for now
|
||||||
|
--${writeIf (config.vim.git.enable && config.vim.git.gitsigns.enable) ''
|
||||||
|
-- null_ls.builtins.code_actions.gitsigns,
|
||||||
|
--''}
|
||||||
|
|
||||||
|
${writeIf cfg.sql
|
||||||
|
''
|
||||||
|
null_helpers.make_builtin({
|
||||||
|
method = null_methods.internal.FORMATTING,
|
||||||
|
filetypes = { "sql" },
|
||||||
|
generator_opts = {
|
||||||
|
to_stdin = true,
|
||||||
|
ignore_stderr = true,
|
||||||
|
suppress_errors = true,
|
||||||
|
command = "${pkgs.sqlfluff}/bin/sqlfluff",
|
||||||
|
args = {
|
||||||
|
"fix",
|
||||||
|
"-",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
factory = null_helpers.formatter_factory,
|
||||||
|
}),
|
||||||
|
|
||||||
|
null_ls.builtins.diagnostics.sqlfluff.with({
|
||||||
|
command = "${pkgs.sqlfluff}/bin/sqlfluff",
|
||||||
|
extra_args = {"--dialect", "postgres"}
|
||||||
|
}),
|
||||||
|
''}
|
||||||
|
|
||||||
|
${writeIf
|
||||||
|
(cfg.nix.enable
|
||||||
|
&& cfg.nix.server == "rnix"
|
||||||
|
&& cfg.nix.formatter == "alejandra")
|
||||||
|
''
|
||||||
|
null_ls.builtins.formatting.alejandra.with({
|
||||||
|
command = "${pkgs.alejandra}/bin/alejandra"
|
||||||
|
}),
|
||||||
|
''}
|
||||||
|
|
||||||
|
${writeIf cfg.ts
|
||||||
|
''
|
||||||
|
null_ls.builtins.diagnostics.eslint,
|
||||||
|
null_ls.builtins.formatting.prettier,
|
||||||
|
''}
|
||||||
|
}
|
||||||
|
|
||||||
|
vim.g.formatsave = ${
|
||||||
|
if cfg.formatOnSave
|
||||||
|
then "true"
|
||||||
|
else "false"
|
||||||
|
};
|
||||||
|
|
||||||
|
-- Enable formatting
|
||||||
|
format_callback = function(client, bufnr)
|
||||||
|
vim.api.nvim_create_autocmd("BufWritePre", {
|
||||||
|
group = augroup,
|
||||||
|
buffer = bufnr,
|
||||||
|
callback = function()
|
||||||
|
if vim.g.formatsave then
|
||||||
|
local params = require'vim.lsp.util'.make_formatting_params({})
|
||||||
|
client.request('textDocument/formatting', params, nil, bufnr)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
default_on_attach = function(client, bufnr)
|
||||||
|
attach_keymaps(client, bufnr)
|
||||||
|
format_callback(client, bufnr)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Enable null-ls
|
||||||
|
require('null-ls').setup({
|
||||||
|
diagnostics_format = "[#{m}] #{s} (#{c})",
|
||||||
|
debounce = 250,
|
||||||
|
default_timeout = 5000,
|
||||||
|
sources = ls_sources,
|
||||||
|
on_attach=default_on_attach
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Enable lspconfig
|
||||||
|
local lspconfig = require('lspconfig')
|
||||||
|
|
||||||
|
local capabilities = vim.lsp.protocol.make_client_capabilities()
|
||||||
|
${
|
||||||
|
let
|
||||||
|
cfg = config.vim.autocomplete;
|
||||||
|
in
|
||||||
|
writeIf cfg.enable (
|
||||||
|
if cfg.type == "nvim-cmp"
|
||||||
|
then ''
|
||||||
|
capabilities = require('cmp_nvim_lsp').default_capabilities()
|
||||||
|
''
|
||||||
|
else ""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
${writeIf cfg.rust.enable ''
|
||||||
|
-- Rust config
|
||||||
|
local rt = require('rust-tools')
|
||||||
|
|
||||||
|
rust_on_attach = function(client, bufnr)
|
||||||
|
default_on_attach(client, bufnr)
|
||||||
|
local opts = { noremap=true, silent=true, buffer = bufnr }
|
||||||
|
vim.keymap.set("n", "<leader>ris", rt.inlay_hints.set, opts)
|
||||||
|
vim.keymap.set("n", "<leader>riu", rt.inlay_hints.unset, opts)
|
||||||
|
vim.keymap.set("n", "<leader>rr", rt.runnables.runnables, opts)
|
||||||
|
vim.keymap.set("n", "<leader>rp", rt.parent_module.parent_module, opts)
|
||||||
|
vim.keymap.set("n", "<leader>rm", rt.expand_macro.expand_macro, opts)
|
||||||
|
vim.keymap.set("n", "<leader>rc", rt.open_cargo_toml.open_cargo_toml, opts)
|
||||||
|
vim.keymap.set("n", "<leader>rg", function() rt.crate_graph.view_crate_graph("x11", nil) end, opts)
|
||||||
|
end
|
||||||
|
|
||||||
|
local rustopts = {
|
||||||
|
tools = {
|
||||||
|
autoSetHints = true,
|
||||||
|
hover_with_actions = false,
|
||||||
|
inlay_hints = {
|
||||||
|
only_current_line = false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
server = {
|
||||||
|
capabilities = capabilities,
|
||||||
|
on_attach = rust_on_attach,
|
||||||
|
cmd = {"${pkgs.rust-analyzer}/bin/rust-analyzer"},
|
||||||
|
settings = {
|
||||||
|
${cfg.rust.rustAnalyzerOpts}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
require('crates').setup {
|
||||||
|
null_ls = {
|
||||||
|
enabled = true,
|
||||||
|
name = "crates.nvim",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rt.setup(rustopts)
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString cfg.zig.enable ''
|
||||||
|
-- Zig config
|
||||||
|
lspconfig.zls.setup {
|
||||||
|
capabilities = capabilities,
|
||||||
|
on_attach=default_on_attach,
|
||||||
|
cmd = {"${pkgs.zls}/bin/zls"},
|
||||||
|
settings = {
|
||||||
|
["zls"] = {
|
||||||
|
zig_exe_path = "${pkgs.zig}/bin/zig",
|
||||||
|
zig_lib_path = "${pkgs.zig}/lib/zig",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
''}
|
||||||
|
|
||||||
|
${writeIf cfg.python ''
|
||||||
|
-- Python config
|
||||||
|
lspconfig.pyright.setup{
|
||||||
|
capabilities = capabilities;
|
||||||
|
on_attach=default_on_attach;
|
||||||
|
cmd = {"${pkgs.nodePackages.pyright}/bin/pyright-langserver", "--stdio"}
|
||||||
|
}
|
||||||
|
''}
|
||||||
|
|
||||||
|
${writeIf cfg.nix.enable (
|
||||||
|
(writeIf (cfg.nix.server == "rnix") ''
|
||||||
|
-- Nix (rnix) config
|
||||||
|
lspconfig.rnix.setup{
|
||||||
|
capabilities = capabilities,
|
||||||
|
${writeIf (cfg.nix.formatter == "alejandra")
|
||||||
|
''
|
||||||
|
on_attach = function(client, bufnr)
|
||||||
|
attach_keymaps(client, bufnr)
|
||||||
|
end,
|
||||||
|
''}
|
||||||
|
${writeIf (cfg.nix.formatter == "nixpkgs-fmt")
|
||||||
|
''
|
||||||
|
on_attach = default_on_attach,
|
||||||
|
''}
|
||||||
|
cmd = {"${cfg.nix.pkg}/bin/rnix-lsp"},
|
||||||
|
}
|
||||||
|
'')
|
||||||
|
+ (writeIf (cfg.nix.server == "nil") ''
|
||||||
|
-- Nix (nil) config
|
||||||
|
lspconfig.nil_ls.setup{
|
||||||
|
capabilities = capabilities,
|
||||||
|
on_attach=default_on_attach,
|
||||||
|
cmd = {"${cfg.nix.pkg}/bin/nil"},
|
||||||
|
settings = {
|
||||||
|
["nil"] = {
|
||||||
|
${writeIf (cfg.nix.formatter == "alejandra")
|
||||||
|
''
|
||||||
|
formatting = {
|
||||||
|
command = {"${pkgs.alejandra}/bin/alejandra", "--quiet"},
|
||||||
|
},
|
||||||
|
''}
|
||||||
|
${writeIf (cfg.nix.formatter == "nixpkgs-fmt")
|
||||||
|
''
|
||||||
|
formatting = {
|
||||||
|
command = {"${pkgs.nixpkgs-fmt}/bin/nixpkgs-fmt"},
|
||||||
|
},
|
||||||
|
''}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
'')
|
||||||
|
)}
|
||||||
|
|
||||||
|
|
||||||
|
${writeIf cfg.clang.enable ''
|
||||||
|
-- CCLS (clang) config
|
||||||
|
lspconfig.ccls.setup{
|
||||||
|
capabilities = capabilities;
|
||||||
|
on_attach=default_on_attach;
|
||||||
|
cmd = {"${pkgs.ccls}/bin/ccls"};
|
||||||
|
${
|
||||||
|
if cfg.clang.cclsOpts == ""
|
||||||
|
then ""
|
||||||
|
else "init_options = ${cfg.clang.cclsOpts}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
''}
|
||||||
|
|
||||||
|
${writeIf cfg.sql ''
|
||||||
|
-- SQLS config
|
||||||
|
lspconfig.sqls.setup {
|
||||||
|
on_attach = function(client)
|
||||||
|
client.server_capabilities.execute_command = true
|
||||||
|
on_attach_keymaps(client, bufnr)
|
||||||
|
require'sqls'.setup{}
|
||||||
|
end,
|
||||||
|
cmd = {"${pkgs.sqls}/bin/sqls", "-config", string.format("%s/config.yml", vim.fn.getcwd()) }
|
||||||
|
}
|
||||||
|
''}
|
||||||
|
|
||||||
|
${writeIf cfg.go ''
|
||||||
|
-- Go config
|
||||||
|
lspconfig.gopls.setup {
|
||||||
|
capabilities = capabilities;
|
||||||
|
on_attach = default_on_attach;
|
||||||
|
cmd = {"${pkgs.gopls}/bin/gopls", "serve"},
|
||||||
|
}
|
||||||
|
''}
|
||||||
|
|
||||||
|
${writeIf cfg.ts ''
|
||||||
|
-- TS config
|
||||||
|
lspconfig.tsserver.setup {
|
||||||
|
capabilities = capabilities;
|
||||||
|
on_attach = function(client, bufnr)
|
||||||
|
attach_keymaps(client, bufnr)
|
||||||
|
end,
|
||||||
|
cmd = { "${pkgs.nodePackages.typescript-language-server}/bin/typescript-language-server", "--stdio" }
|
||||||
|
}
|
||||||
|
''}
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
54
modules/lsp/lspsaga.nix
Normal file
54
modules/lsp/lspsaga.nix
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.lsp;
|
||||||
|
in {
|
||||||
|
options.vim.lsp = {lspsaga = {enable = mkEnableOption "LSP Saga";};};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable && cfg.lspsaga.enable) {
|
||||||
|
vim.startPlugins = ["lspsaga"];
|
||||||
|
|
||||||
|
vim.vnoremap = {
|
||||||
|
"<silent><leader>ca" = ":<C-U>lua require('lspsaga.codeaction').range_code_action()<CR>";
|
||||||
|
};
|
||||||
|
|
||||||
|
vim.nnoremap =
|
||||||
|
{
|
||||||
|
"<silent><leader>lf" = "<cmd>lua require'lspsaga.provider'.lsp_finder()<CR>";
|
||||||
|
"<silent><leader>lh" = "<cmd>lua require('lspsaga.hover').render_hover_doc()<CR>";
|
||||||
|
"<silent><C-f>" = "<cmd>lua require('lspsaga.action').smart_scroll_with_saga(1)<CR>";
|
||||||
|
"<silent><C-b>" = "<cmd>lua require('lspsaga.action').smart_scroll_with_saga(-1)<CR>";
|
||||||
|
"<silent><leader>lr" = "<cmd>lua require'lspsaga.rename'.rename()<CR>";
|
||||||
|
"<silent><leader>ld" = "<cmd>lua require'lspsaga.provider'.preview_definition()<CR>";
|
||||||
|
"<silent><leader>ll" = "<cmd>lua require'lspsaga.diagnostic'.show_line_diagnostics()<CR>";
|
||||||
|
"<silent><leader>lc" = "<cmd>lua require'lspsaga.diagnostic'.show_cursor_diagnostics()<CR>";
|
||||||
|
"<silent><leader>lp" = "<cmd>lua require'lspsaga.diagnostic'.lsp_jump_diagnostic_prev()<CR>";
|
||||||
|
"<silent><leader>ln" = "<cmd>lua require'lspsaga.diagnostic'.lsp_jump_diagnostic_next()<CR>";
|
||||||
|
}
|
||||||
|
// (
|
||||||
|
if (!cfg.nvimCodeActionMenu.enable)
|
||||||
|
then {
|
||||||
|
"<silent><leader>ca" = "<cmd>lua require('lspsaga.codeaction').code_action()<CR>";
|
||||||
|
}
|
||||||
|
else {}
|
||||||
|
)
|
||||||
|
// (
|
||||||
|
if (!cfg.lspSignature.enable)
|
||||||
|
then {
|
||||||
|
"<silent><leader>ls" = "<cmd>lua require('lspsaga.signaturehelp').signature_help()<CR>";
|
||||||
|
}
|
||||||
|
else {}
|
||||||
|
);
|
||||||
|
|
||||||
|
vim.luaConfigRC.lspsage = nvim.dag.entryAnywhere ''
|
||||||
|
-- Enable lspsaga
|
||||||
|
local saga = require 'lspsaga'
|
||||||
|
saga.init_lsp_saga()
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
24
modules/lsp/nvim-code-action-menu.nix
Normal file
24
modules/lsp/nvim-code-action-menu.nix
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.lsp;
|
||||||
|
in {
|
||||||
|
options.vim.lsp = {
|
||||||
|
nvimCodeActionMenu = {
|
||||||
|
enable = mkEnableOption "nvim code action menu";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable && cfg.nvimCodeActionMenu.enable) {
|
||||||
|
vim.startPlugins = ["nvim-code-action-menu"];
|
||||||
|
|
||||||
|
vim.nnoremap = {
|
||||||
|
"<silent><leader>ca" = ":CodeActionMenu<CR>";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
34
modules/lsp/trouble.nix
Normal file
34
modules/lsp/trouble.nix
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.lsp;
|
||||||
|
in {
|
||||||
|
options.vim.lsp = {
|
||||||
|
trouble = {
|
||||||
|
enable = mkEnableOption "trouble diagnostics viewer";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable && cfg.trouble.enable) {
|
||||||
|
vim.startPlugins = ["trouble"];
|
||||||
|
|
||||||
|
vim.nnoremap = {
|
||||||
|
"<leader>xx" = "<cmd>TroubleToggle<CR>";
|
||||||
|
"<leader>lwd" = "<cmd>TroubleToggle workspace_diagnostics<CR>";
|
||||||
|
"<leader>ld" = "<cmd>TroubleToggle document_diagnostics<CR>";
|
||||||
|
"<leader>lr" = "<cmd>TroubleToggle lsp_references<CR>";
|
||||||
|
"<leader>xq" = "<cmd>TroubleToggle quickfix<CR>";
|
||||||
|
"<leader>xl" = "<cmd>TroubleToggle loclist<CR>";
|
||||||
|
};
|
||||||
|
|
||||||
|
vim.luaConfigRC.trouble = nvim.dag.entryAnywhere ''
|
||||||
|
-- Enable trouble diagnostics viewer
|
||||||
|
require("trouble").setup {}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
14
modules/markdown/config.nix
Normal file
14
modules/markdown/config.nix
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; {
|
||||||
|
config = {
|
||||||
|
vim.markdown = {
|
||||||
|
enable = mkDefault false;
|
||||||
|
glow.enable = mkDefault false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
11
modules/markdown/default.nix
Normal file
11
modules/markdown/default.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
./config.nix
|
||||||
|
./glow.nix
|
||||||
|
];
|
||||||
|
}
|
38
modules/markdown/glow.nix
Normal file
38
modules/markdown/glow.nix
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.markdown;
|
||||||
|
in {
|
||||||
|
options.vim.markdown = {
|
||||||
|
enable = mkEnableOption "markdown tools and plugins";
|
||||||
|
|
||||||
|
glow.enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "Enable markdown preview in neovim with glow";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable) {
|
||||||
|
vim.startPlugins = [
|
||||||
|
(
|
||||||
|
if cfg.glow.enable
|
||||||
|
then "glow-nvim"
|
||||||
|
else null
|
||||||
|
)
|
||||||
|
];
|
||||||
|
|
||||||
|
vim.globals = mkIf (cfg.glow.enable) {
|
||||||
|
"glow_binary_path" = "${pkgs.glow}/bin";
|
||||||
|
};
|
||||||
|
|
||||||
|
vim.configRC.glow = mkIf (cfg.glow.enable) (nvim.dag.entryAnywhere ''
|
||||||
|
autocmd FileType markdown noremap <leader>p :Glow<CR>
|
||||||
|
'');
|
||||||
|
};
|
||||||
|
}
|
35
modules/modules.nix
Normal file
35
modules/modules.nix
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
check ? true,
|
||||||
|
}: let
|
||||||
|
modules = [
|
||||||
|
./completion
|
||||||
|
./theme
|
||||||
|
./core
|
||||||
|
./basic
|
||||||
|
./statusline
|
||||||
|
./tabline
|
||||||
|
./filetree
|
||||||
|
./visuals
|
||||||
|
./lsp
|
||||||
|
./treesitter
|
||||||
|
./tidal
|
||||||
|
./autopairs
|
||||||
|
./snippets
|
||||||
|
./keys
|
||||||
|
./markdown
|
||||||
|
./telescope
|
||||||
|
./git
|
||||||
|
];
|
||||||
|
|
||||||
|
pkgsModule = {config, ...}: {
|
||||||
|
config = {
|
||||||
|
_module.args.baseModules = modules;
|
||||||
|
_module.args.pkgsPath = lib.mkDefault pkgs.path;
|
||||||
|
_module.args.pkgs = lib.mkDefault pkgs;
|
||||||
|
_module.check = check;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
modules ++ [pkgsModule]
|
10
modules/snippets/default.nix
Normal file
10
modules/snippets/default.nix
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
./vsnip.nix
|
||||||
|
];
|
||||||
|
}
|
18
modules/snippets/vsnip.nix
Normal file
18
modules/snippets/vsnip.nix
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.snippets.vsnip;
|
||||||
|
in {
|
||||||
|
options.vim.snippets.vsnip = {
|
||||||
|
enable = mkEnableOption "Enable vim-vsnip";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
vim.startPlugins = ["vim-vsnip"];
|
||||||
|
};
|
||||||
|
}
|
65
modules/statusline/config.nix
Normal file
65
modules/statusline/config.nix
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; {
|
||||||
|
config = {
|
||||||
|
vim.statusline.lualine = {
|
||||||
|
enable = mkDefault false;
|
||||||
|
|
||||||
|
icons = mkDefault true;
|
||||||
|
theme = mkDefault "auto";
|
||||||
|
sectionSeparator = {
|
||||||
|
left = mkDefault "";
|
||||||
|
right = mkDefault "";
|
||||||
|
};
|
||||||
|
|
||||||
|
componentSeparator = {
|
||||||
|
left = mkDefault "⏽";
|
||||||
|
right = mkDefault "⏽";
|
||||||
|
};
|
||||||
|
|
||||||
|
activeSection = {
|
||||||
|
a = mkDefault "{'mode'}";
|
||||||
|
b = ''
|
||||||
|
{
|
||||||
|
{
|
||||||
|
"branch",
|
||||||
|
separator = '',
|
||||||
|
},
|
||||||
|
"diff",
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
c = mkDefault "{'filename'}";
|
||||||
|
x = mkDefault ''
|
||||||
|
{
|
||||||
|
{
|
||||||
|
"diagnostics",
|
||||||
|
sources = {'nvim_lsp'},
|
||||||
|
separator = '',
|
||||||
|
symbols = {error = '', warn = '', info = '', hint = ''},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filetype",
|
||||||
|
},
|
||||||
|
"fileformat",
|
||||||
|
"encoding",
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
y = mkDefault "{'progress'}";
|
||||||
|
z = mkDefault "{'location'}";
|
||||||
|
};
|
||||||
|
|
||||||
|
inactiveSection = {
|
||||||
|
a = mkDefault "{}";
|
||||||
|
b = mkDefault "{}";
|
||||||
|
c = mkDefault "{'filename'}";
|
||||||
|
x = mkDefault "{'location'}";
|
||||||
|
y = mkDefault "{}";
|
||||||
|
z = mkDefault "{}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
11
modules/statusline/default.nix
Normal file
11
modules/statusline/default.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
./lualine.nix
|
||||||
|
./config.nix
|
||||||
|
];
|
||||||
|
}
|
205
modules/statusline/lualine.nix
Normal file
205
modules/statusline/lualine.nix
Normal file
|
@ -0,0 +1,205 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.statusline.lualine;
|
||||||
|
supported_themes = import ./supported_lualine_themes.nix;
|
||||||
|
in {
|
||||||
|
options.vim.statusline.lualine = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
description = "Enable lualine";
|
||||||
|
};
|
||||||
|
|
||||||
|
icons = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
description = "Enable icons for lualine";
|
||||||
|
};
|
||||||
|
|
||||||
|
theme = mkOption {
|
||||||
|
type = types.enum (
|
||||||
|
[
|
||||||
|
"auto"
|
||||||
|
"16color"
|
||||||
|
"gruvbox"
|
||||||
|
"ayu_dark"
|
||||||
|
"ayu_light"
|
||||||
|
"ayu_mirage"
|
||||||
|
"codedark"
|
||||||
|
"dracula"
|
||||||
|
"everforest"
|
||||||
|
"gruvbox"
|
||||||
|
"gruvbox_light"
|
||||||
|
"gruvbox_material"
|
||||||
|
"horizon"
|
||||||
|
"iceberg_dark"
|
||||||
|
"iceberg_light"
|
||||||
|
"jellybeans"
|
||||||
|
"material"
|
||||||
|
"modus_vivendi"
|
||||||
|
"molokai"
|
||||||
|
"nightfly"
|
||||||
|
"nord"
|
||||||
|
"oceanicnext"
|
||||||
|
"onelight"
|
||||||
|
"palenight"
|
||||||
|
"papercolor_dark"
|
||||||
|
"papercolor_light"
|
||||||
|
"powerline"
|
||||||
|
"seoul256"
|
||||||
|
"solarized_dark"
|
||||||
|
"tomorrow"
|
||||||
|
"wombat"
|
||||||
|
]
|
||||||
|
++ (
|
||||||
|
if elem config.vim.theme.name supported_themes
|
||||||
|
then [config.vim.theme.name]
|
||||||
|
else []
|
||||||
|
)
|
||||||
|
);
|
||||||
|
description = "Theme for lualine";
|
||||||
|
};
|
||||||
|
|
||||||
|
sectionSeparator = {
|
||||||
|
left = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "Section separator for left side";
|
||||||
|
};
|
||||||
|
|
||||||
|
right = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "Section separator for right side";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
componentSeparator = {
|
||||||
|
left = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "Component separator for left side";
|
||||||
|
};
|
||||||
|
|
||||||
|
right = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "Component separator for right side";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
activeSection = {
|
||||||
|
a = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "active config for: | (A) | B | C X | Y | Z |";
|
||||||
|
};
|
||||||
|
|
||||||
|
b = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "active config for: | A | (B) | C X | Y | Z |";
|
||||||
|
};
|
||||||
|
|
||||||
|
c = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "active config for: | A | B | (C) X | Y | Z |";
|
||||||
|
};
|
||||||
|
|
||||||
|
x = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "active config for: | A | B | C (X) | Y | Z |";
|
||||||
|
};
|
||||||
|
|
||||||
|
y = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "active config for: | A | B | C X | (Y) | Z |";
|
||||||
|
};
|
||||||
|
|
||||||
|
z = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "active config for: | A | B | C X | Y | (Z) |";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
inactiveSection = {
|
||||||
|
a = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "inactive config for: | (A) | B | C X | Y | Z |";
|
||||||
|
};
|
||||||
|
|
||||||
|
b = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "inactive config for: | A | (B) | C X | Y | Z |";
|
||||||
|
};
|
||||||
|
|
||||||
|
c = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "inactive config for: | A | B | (C) X | Y | Z |";
|
||||||
|
};
|
||||||
|
|
||||||
|
x = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "inactive config for: | A | B | C (X) | Y | Z |";
|
||||||
|
};
|
||||||
|
|
||||||
|
y = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "inactive config for: | A | B | C X | (Y) | Z |";
|
||||||
|
};
|
||||||
|
|
||||||
|
z = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "inactive config for: | A | B | C X | Y | (Z) |";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config =
|
||||||
|
mkIf cfg.enable
|
||||||
|
{
|
||||||
|
#assertions = [
|
||||||
|
# ({
|
||||||
|
# assertion = if cfg.icons then (config.vim.visuals.enable && config.vim.visuals.nvimWebDevicons.enable) else true;
|
||||||
|
# message = "Must enable config.vim.visual.nvimWebDevicons if using config.vim.visuals.lualine.icons";
|
||||||
|
# })
|
||||||
|
#];
|
||||||
|
|
||||||
|
vim.startPlugins = ["lualine"];
|
||||||
|
vim.luaConfigRC.lualine = nvim.dag.entryAnywhere ''
|
||||||
|
require'lualine'.setup {
|
||||||
|
options = {
|
||||||
|
icons_enabled = ${
|
||||||
|
if cfg.icons
|
||||||
|
then "true"
|
||||||
|
else "false"
|
||||||
|
},
|
||||||
|
theme = "${cfg.theme}",
|
||||||
|
component_separators = {"${cfg.componentSeparator.left}","${cfg.componentSeparator.right}"},
|
||||||
|
section_separators = {"${cfg.sectionSeparator.left}","${cfg.sectionSeparator.right}"},
|
||||||
|
disabled_filetypes = {},
|
||||||
|
},
|
||||||
|
sections = {
|
||||||
|
lualine_a = ${cfg.activeSection.a},
|
||||||
|
lualine_b = ${cfg.activeSection.b},
|
||||||
|
lualine_c = ${cfg.activeSection.c},
|
||||||
|
lualine_x = ${cfg.activeSection.x},
|
||||||
|
lualine_y = ${cfg.activeSection.y},
|
||||||
|
lualine_z = ${cfg.activeSection.z},
|
||||||
|
},
|
||||||
|
inactive_sections = {
|
||||||
|
lualine_a = ${cfg.inactiveSection.a},
|
||||||
|
lualine_b = ${cfg.inactiveSection.b},
|
||||||
|
lualine_c = ${cfg.inactiveSection.c},
|
||||||
|
lualine_x = ${cfg.inactiveSection.x},
|
||||||
|
lualine_y = ${cfg.inactiveSection.y},
|
||||||
|
lualine_z = ${cfg.inactiveSection.z},
|
||||||
|
},
|
||||||
|
tabline = {},
|
||||||
|
extensions = {${
|
||||||
|
if config.vim.filetree.nvimTreeLua.enable
|
||||||
|
then "\"nvim-tree\""
|
||||||
|
else ""
|
||||||
|
}},
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
5
modules/statusline/supported_lualine_themes.nix
Normal file
5
modules/statusline/supported_lualine_themes.nix
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
[
|
||||||
|
"tokyonight"
|
||||||
|
"onedark"
|
||||||
|
"catppuccin"
|
||||||
|
]
|
10
modules/tabline/default.nix
Normal file
10
modules/tabline/default.nix
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
./nvim-bufferline.nix
|
||||||
|
];
|
||||||
|
}
|
100
modules/tabline/nvim-bufferline.nix
Normal file
100
modules/tabline/nvim-bufferline.nix
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.tabline.nvimBufferline;
|
||||||
|
in {
|
||||||
|
options.vim.tabline.nvimBufferline = {
|
||||||
|
enable = mkEnableOption "nvim-bufferline-lua";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable (
|
||||||
|
let
|
||||||
|
mouse = {
|
||||||
|
right = "'vertical sbuffer %d'";
|
||||||
|
close = ''
|
||||||
|
function(bufnum)
|
||||||
|
require("bufdelete").bufdelete(bufnum, false)
|
||||||
|
end
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
vim.startPlugins = [
|
||||||
|
(assert config.vim.visuals.nvimWebDevicons.enable == true; "nvim-bufferline-lua")
|
||||||
|
"bufdelete-nvim"
|
||||||
|
];
|
||||||
|
|
||||||
|
vim.nnoremap = {
|
||||||
|
"<silent><leader>bn" = ":BufferLineCycleNext<CR>";
|
||||||
|
"<silent><leader>bp" = ":BufferLineCyclePrev<CR>";
|
||||||
|
"<silent><leader>bc" = ":BufferLinePick<CR>";
|
||||||
|
"<silent><leader>bse" = ":BufferLineSortByExtension<CR>";
|
||||||
|
"<silent><leader>bsd" = ":BufferLineSortByDirectory<CR>";
|
||||||
|
"<silent><leader>bsi" = ":lua require'bufferline'.sort_buffers_by(function (buf_a, buf_b) return buf_a.id < buf_b.id end)<CR>";
|
||||||
|
"<silent><leader>bmn" = ":BufferLineMoveNext<CR>";
|
||||||
|
"<silent><leader>bmp" = ":BufferLineMovePrev<CR>";
|
||||||
|
"<silent><leader>b1" = "<Cmd>BufferLineGoToBuffer 1<CR>";
|
||||||
|
"<silent><leader>b2" = "<Cmd>BufferLineGoToBuffer 2<CR>";
|
||||||
|
"<silent><leader>b3" = "<Cmd>BufferLineGoToBuffer 3<CR>";
|
||||||
|
"<silent><leader>b4" = "<Cmd>BufferLineGoToBuffer 4<CR>";
|
||||||
|
"<silent><leader>b5" = "<Cmd>BufferLineGoToBuffer 5<CR>";
|
||||||
|
"<silent><leader>b6" = "<Cmd>BufferLineGoToBuffer 6<CR>";
|
||||||
|
"<silent><leader>b7" = "<Cmd>BufferLineGoToBuffer 7<CR>";
|
||||||
|
"<silent><leader>b8" = "<Cmd>BufferLineGoToBuffer 8<CR>";
|
||||||
|
"<silent><leader>b9" = "<Cmd>BufferLineGoToBuffer 9<CR>";
|
||||||
|
};
|
||||||
|
|
||||||
|
vim.luaConfigRC.nvimBufferline = nvim.dag.entryAnywhere ''
|
||||||
|
require("bufferline").setup{
|
||||||
|
options = {
|
||||||
|
numbers = "both",
|
||||||
|
close_command = ${mouse.close},
|
||||||
|
right_mouse_command = ${mouse.right},
|
||||||
|
indicator = {
|
||||||
|
indicator_icon = '▎',
|
||||||
|
style = 'icon',
|
||||||
|
},
|
||||||
|
buffer_close_icon = '',
|
||||||
|
modified_icon = '●',
|
||||||
|
close_icon = '',
|
||||||
|
left_trunc_marker = '',
|
||||||
|
right_trunc_marker = '',
|
||||||
|
separator_style = "thin",
|
||||||
|
max_name_length = 18,
|
||||||
|
max_prefix_length = 15,
|
||||||
|
tab_size = 18,
|
||||||
|
show_buffer_icons = true,
|
||||||
|
show_buffer_close_icons = true,
|
||||||
|
show_close_icon = true,
|
||||||
|
show_tab_indicators = true,
|
||||||
|
persist_buffer_sort = true,
|
||||||
|
enforce_regular_tabs = false,
|
||||||
|
always_show_bufferline = true,
|
||||||
|
offsets = {{filetype = "NvimTree", text = "File Explorer", text_align = "left"}},
|
||||||
|
sort_by = 'extension',
|
||||||
|
diagnostics = "nvim_lsp",
|
||||||
|
diagnostics_update_in_insert = true,
|
||||||
|
diagnostics_indicator = function(count, level, diagnostics_dict, context)
|
||||||
|
local s = ""
|
||||||
|
for e, n in pairs(diagnostics_dict) do
|
||||||
|
local sym = e == "error" and ""
|
||||||
|
or (e == "warning" and "" or "" )
|
||||||
|
if(sym ~= "") then
|
||||||
|
s = s .. " " .. n .. sym
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return s
|
||||||
|
end,
|
||||||
|
numbers = function(opts)
|
||||||
|
return string.format('%s·%s', opts.raise(opts.id), opts.lower(opts.ordinal))
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
77
modules/telescope/default.nix
Normal file
77
modules/telescope/default.nix
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.telescope;
|
||||||
|
in {
|
||||||
|
options.vim.telescope = {
|
||||||
|
enable = mkEnableOption "enable telescope";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable) {
|
||||||
|
vim.startPlugins = [
|
||||||
|
"telescope"
|
||||||
|
];
|
||||||
|
|
||||||
|
vim.nnoremap =
|
||||||
|
{
|
||||||
|
"<leader>ff" = "<cmd> Telescope find_files<CR>";
|
||||||
|
"<leader>fg" = "<cmd> Telescope live_grep<CR>";
|
||||||
|
"<leader>fb" = "<cmd> Telescope buffers<CR>";
|
||||||
|
"<leader>fh" = "<cmd> Telescope help_tags<CR>";
|
||||||
|
"<leader>ft" = "<cmd> Telescope<CR>";
|
||||||
|
|
||||||
|
"<leader>fvcw" = "<cmd> Telescope git_commits<CR>";
|
||||||
|
"<leader>fvcb" = "<cmd> Telescope git_bcommits<CR>";
|
||||||
|
"<leader>fvb" = "<cmd> Telescope git_branches<CR>";
|
||||||
|
"<leader>fvs" = "<cmd> Telescope git_status<CR>";
|
||||||
|
"<leader>fvx" = "<cmd> Telescope git_stash<CR>";
|
||||||
|
}
|
||||||
|
// (
|
||||||
|
if config.vim.lsp.enable
|
||||||
|
then {
|
||||||
|
"<leader>flsb" = "<cmd> Telescope lsp_document_symbols<CR>";
|
||||||
|
"<leader>flsw" = "<cmd> Telescope lsp_workspace_symbols<CR>";
|
||||||
|
|
||||||
|
"<leader>flr" = "<cmd> Telescope lsp_references<CR>";
|
||||||
|
"<leader>fli" = "<cmd> Telescope lsp_implementations<CR>";
|
||||||
|
"<leader>flD" = "<cmd> Telescope lsp_definitions<CR>";
|
||||||
|
"<leader>flt" = "<cmd> Telescope lsp_type_definitions<CR>";
|
||||||
|
"<leader>fld" = "<cmd> Telescope diagnostics<CR>";
|
||||||
|
}
|
||||||
|
else {}
|
||||||
|
)
|
||||||
|
// (
|
||||||
|
if config.vim.treesitter.enable
|
||||||
|
then {
|
||||||
|
"<leader>fs" = "<cmd> Telescope treesitter<CR>";
|
||||||
|
}
|
||||||
|
else {}
|
||||||
|
);
|
||||||
|
|
||||||
|
vim.luaConfigRC.telescope = nvim.dag.entryAnywhere ''
|
||||||
|
require("telescope").setup {
|
||||||
|
defaults = {
|
||||||
|
vimgrep_arguments = {
|
||||||
|
"${pkgs.ripgrep}/bin/rg",
|
||||||
|
"--color=never",
|
||||||
|
"--no-heading",
|
||||||
|
"--with-filename",
|
||||||
|
"--line-number",
|
||||||
|
"--column",
|
||||||
|
"--smart-case"
|
||||||
|
},
|
||||||
|
pickers = {
|
||||||
|
find_command = {
|
||||||
|
"${pkgs.fd}/bin/fd",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
11
modules/theme/config.nix
Normal file
11
modules/theme/config.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{ pkgs, config, lib, ... }:
|
||||||
|
with lib; {
|
||||||
|
config = {
|
||||||
|
vim.theme = {
|
||||||
|
enable = mkDefault false;
|
||||||
|
name = mkDefault "onedark";
|
||||||
|
style = mkDefault "darker";
|
||||||
|
extraConfig = mkDefault "";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
11
modules/theme/default.nix
Normal file
11
modules/theme/default.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
./theme.nix
|
||||||
|
./config.nix
|
||||||
|
];
|
||||||
|
}
|
33
modules/theme/supported_themes.nix
Normal file
33
modules/theme/supported_themes.nix
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
{
|
||||||
|
onedark = {
|
||||||
|
setup = { style ? "dark" }: ''
|
||||||
|
-- OneDark theme
|
||||||
|
require('onedark').setup {
|
||||||
|
style = "${style}"
|
||||||
|
}
|
||||||
|
require('onedark').load()
|
||||||
|
'';
|
||||||
|
styles = [ "dark" "darker" "cool" "deep" "warm" "warmer" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
tokyonight = {
|
||||||
|
setup = { style ? "night" }: ''
|
||||||
|
-- need to set style before colorscheme to apply
|
||||||
|
vim.g.tokyonight_style = '${style}'
|
||||||
|
vim.cmd[[colorscheme tokyonight]]
|
||||||
|
'';
|
||||||
|
styles = [ "day" "night" "storm" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
catppuccin = {
|
||||||
|
setup = { style ? "mocha" }: ''
|
||||||
|
-- Catppuccin theme
|
||||||
|
require('catppuccin').setup {
|
||||||
|
flavour = "${style}"
|
||||||
|
}
|
||||||
|
-- setup must be called before loading
|
||||||
|
vim.cmd.colorscheme "catppuccin"
|
||||||
|
'';
|
||||||
|
styles = [ "latte" "frappe" "macchiato" "mocha" ];
|
||||||
|
};
|
||||||
|
}
|
40
modules/theme/theme.nix
Normal file
40
modules/theme/theme.nix
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with lib.attrsets;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.theme;
|
||||||
|
supported_themes = import ./supported_themes.nix;
|
||||||
|
in {
|
||||||
|
options.vim.theme = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
description = "Enable Theme";
|
||||||
|
};
|
||||||
|
|
||||||
|
name = mkOption {
|
||||||
|
type = types.enum (attrNames supported_themes);
|
||||||
|
description = "Supported themes can be found in `supported_themes.nix`";
|
||||||
|
};
|
||||||
|
|
||||||
|
style = mkOption {
|
||||||
|
type = with types; enum supported_themes.${cfg.name}.styles;
|
||||||
|
description = "Specific style for theme if it supports it";
|
||||||
|
};
|
||||||
|
|
||||||
|
extraConfig = mkOption {
|
||||||
|
type = with types; lines;
|
||||||
|
description = "Additional lua configuration to add before setup";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
vim.startPlugins = [cfg.name];
|
||||||
|
vim.luaConfigRC.themeSetup = nvim.dag.entryBefore ["theme"] cfg.extraConfig;
|
||||||
|
vim.luaConfigRC.theme = supported_themes.${cfg.name}.setup {style = cfg.style;};
|
||||||
|
};
|
||||||
|
}
|
6
modules/tidal/default.nix
Normal file
6
modules/tidal/default.nix
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {imports = [./tidal.nix];}
|
39
modules/tidal/tidal.nix
Normal file
39
modules/tidal/tidal.nix
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.tidal;
|
||||||
|
in {
|
||||||
|
options.vim.tidal = {
|
||||||
|
enable = mkEnableOption "tidal tools and plugins";
|
||||||
|
|
||||||
|
flash = mkOption {
|
||||||
|
description = ''When sending a paragraph or a single line, vim-tidal will "flash" the selection for some milliseconds'';
|
||||||
|
type = types.int;
|
||||||
|
default = 150;
|
||||||
|
};
|
||||||
|
|
||||||
|
openSC = mkOption {
|
||||||
|
description = "Automatically run the supercollider CLI, sclang, alongside the Tidal GHCI terminal.";
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable) {
|
||||||
|
vim.startPlugins = [
|
||||||
|
# From tidalcycles flake
|
||||||
|
pkgs.vimPlugins.vim-tidal
|
||||||
|
];
|
||||||
|
|
||||||
|
vim.globals = {
|
||||||
|
"tidal_target" = "terminal";
|
||||||
|
"tidal_flash_duration" = 150;
|
||||||
|
"tidal_sc_enable" = cfg.openSC;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
31
modules/treesitter/context.nix
Normal file
31
modules/treesitter/context.nix
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.treesitter;
|
||||||
|
in {
|
||||||
|
options.vim.treesitter.context.enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "enable function context [nvim-treesitter-context]";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable && cfg.context.enable) {
|
||||||
|
vim.startPlugins = [
|
||||||
|
"nvim-treesitter-context"
|
||||||
|
];
|
||||||
|
|
||||||
|
vim.luaConfigRC.treesitter-context = nvim.dag.entryAnywhere ''
|
||||||
|
-- Treesitter Context config
|
||||||
|
require'treesitter-context'.setup {
|
||||||
|
enable = true,
|
||||||
|
throttle = true,
|
||||||
|
max_lines = 0
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
11
modules/treesitter/default.nix
Normal file
11
modules/treesitter/default.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
./treesitter.nix
|
||||||
|
./context.nix
|
||||||
|
];
|
||||||
|
}
|
111
modules/treesitter/treesitter.nix
Normal file
111
modules/treesitter/treesitter.nix
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.treesitter;
|
||||||
|
in {
|
||||||
|
options.vim.treesitter = {
|
||||||
|
enable = mkOption {
|
||||||
|
default = false;
|
||||||
|
type = types.bool;
|
||||||
|
description = "enable tree-sitter [nvim-treesitter]";
|
||||||
|
};
|
||||||
|
|
||||||
|
fold = mkOption {
|
||||||
|
default = false;
|
||||||
|
type = types.bool;
|
||||||
|
description = "enable fold with tree-sitter";
|
||||||
|
};
|
||||||
|
|
||||||
|
autotagHtml = mkOption {
|
||||||
|
default = false;
|
||||||
|
type = types.bool;
|
||||||
|
description = "enable autoclose and rename html tag [nvim-ts-autotag]";
|
||||||
|
};
|
||||||
|
|
||||||
|
grammars = mkOption {
|
||||||
|
type = with types; listOf package;
|
||||||
|
default = with (pkgs.vimPlugins.nvim-treesitter.builtGrammars); [
|
||||||
|
c
|
||||||
|
cpp
|
||||||
|
nix
|
||||||
|
python
|
||||||
|
rust
|
||||||
|
markdown
|
||||||
|
comment
|
||||||
|
toml
|
||||||
|
make
|
||||||
|
tsx
|
||||||
|
html
|
||||||
|
javascript
|
||||||
|
css
|
||||||
|
graphql
|
||||||
|
json
|
||||||
|
zig
|
||||||
|
];
|
||||||
|
description = ''
|
||||||
|
List of treesitter grammars to install.
|
||||||
|
When enabling a language, its treesitter grammar is added for you.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable (
|
||||||
|
let
|
||||||
|
writeIf = cond: msg:
|
||||||
|
if cond
|
||||||
|
then msg
|
||||||
|
else "";
|
||||||
|
in {
|
||||||
|
vim.startPlugins = [
|
||||||
|
"nvim-treesitter"
|
||||||
|
(
|
||||||
|
if cfg.autotagHtml
|
||||||
|
then "nvim-ts-autotag"
|
||||||
|
else null
|
||||||
|
)
|
||||||
|
];
|
||||||
|
|
||||||
|
# For some reason treesitter highlighting does not work on start if this is set before syntax on
|
||||||
|
vim.configRC.treesitter = writeIf cfg.fold (nvim.dag.entryBefore ["basic"] ''
|
||||||
|
" Tree-sitter based folding
|
||||||
|
set foldmethod=expr
|
||||||
|
set foldexpr=nvim_treesitter#foldexpr()
|
||||||
|
set nofoldenable
|
||||||
|
'');
|
||||||
|
|
||||||
|
vim.luaConfigRC.treesitter = nvim.dag.entryAnywhere ''
|
||||||
|
-- Treesitter config
|
||||||
|
require'nvim-treesitter.configs'.setup {
|
||||||
|
highlight = {
|
||||||
|
enable = true,
|
||||||
|
disable = {},
|
||||||
|
},
|
||||||
|
|
||||||
|
auto_install = false,
|
||||||
|
ensure_installed = {},
|
||||||
|
|
||||||
|
incremental_selection = {
|
||||||
|
enable = true,
|
||||||
|
keymaps = {
|
||||||
|
init_selection = "gnn",
|
||||||
|
node_incremental = "grn",
|
||||||
|
scope_incremental = "grc",
|
||||||
|
node_decremental = "grm",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
${writeIf cfg.autotagHtml ''
|
||||||
|
autotag = {
|
||||||
|
enable = true,
|
||||||
|
},
|
||||||
|
''}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
28
modules/visuals/config.nix
Normal file
28
modules/visuals/config.nix
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
{ pkgs
|
||||||
|
, config
|
||||||
|
, lib
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
with lib; {
|
||||||
|
config = {
|
||||||
|
vim.visuals = {
|
||||||
|
enable = mkDefault false;
|
||||||
|
|
||||||
|
nvimWebDevicons.enable = mkDefault false;
|
||||||
|
lspkind.enable = mkDefault false;
|
||||||
|
|
||||||
|
cursorWordline = {
|
||||||
|
enable = mkDefault false;
|
||||||
|
lineTimeout = mkDefault 500;
|
||||||
|
};
|
||||||
|
|
||||||
|
indentBlankline = {
|
||||||
|
enable = mkDefault false;
|
||||||
|
listChar = mkDefault "│";
|
||||||
|
fillChar = mkDefault "⋅";
|
||||||
|
eolChar = mkDefault "↴";
|
||||||
|
showCurrContext = mkDefault true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
11
modules/visuals/default.nix
Normal file
11
modules/visuals/default.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
./config.nix
|
||||||
|
./visuals.nix
|
||||||
|
];
|
||||||
|
}
|
135
modules/visuals/visuals.nix
Normal file
135
modules/visuals/visuals.nix
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.visuals;
|
||||||
|
in {
|
||||||
|
options.vim.visuals = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
description = "visual enhancements";
|
||||||
|
};
|
||||||
|
|
||||||
|
nvimWebDevicons.enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
description = "enable dev icons. required for certain plugins [nvim-web-devicons]";
|
||||||
|
};
|
||||||
|
|
||||||
|
lspkind.enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
description = "enable vscode-like pictograms for lsp [lspkind]";
|
||||||
|
};
|
||||||
|
|
||||||
|
cursorWordline = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
description = "enable word and delayed line highlight [nvim-cursorline]";
|
||||||
|
};
|
||||||
|
|
||||||
|
lineTimeout = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
description = "time in milliseconds for cursorline to appear";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
indentBlankline = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
description = "enable indentation guides [indent-blankline]";
|
||||||
|
};
|
||||||
|
|
||||||
|
listChar = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "Character for indentation line";
|
||||||
|
};
|
||||||
|
|
||||||
|
fillChar = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "Character to fill indents";
|
||||||
|
};
|
||||||
|
|
||||||
|
eolChar = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "Character at end of line";
|
||||||
|
};
|
||||||
|
|
||||||
|
showCurrContext = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
description = "Highlight current context from treesitter";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config =
|
||||||
|
mkIf cfg.enable
|
||||||
|
{
|
||||||
|
vim.startPlugins = [
|
||||||
|
(
|
||||||
|
if cfg.nvimWebDevicons.enable
|
||||||
|
then "nvim-web-devicons"
|
||||||
|
else null
|
||||||
|
)
|
||||||
|
(
|
||||||
|
if cfg.lspkind.enable
|
||||||
|
then "lspkind"
|
||||||
|
else null
|
||||||
|
)
|
||||||
|
(
|
||||||
|
if cfg.cursorWordline.enable
|
||||||
|
then "nvim-cursorline"
|
||||||
|
else null
|
||||||
|
)
|
||||||
|
(
|
||||||
|
if cfg.indentBlankline.enable
|
||||||
|
then "indent-blankline"
|
||||||
|
else null
|
||||||
|
)
|
||||||
|
];
|
||||||
|
|
||||||
|
vim.luaConfigRC.visuals = nvim.dag.entryAnywhere ''
|
||||||
|
${
|
||||||
|
if cfg.lspkind.enable
|
||||||
|
then "require'lspkind'.init()"
|
||||||
|
else ""
|
||||||
|
}
|
||||||
|
${
|
||||||
|
if cfg.indentBlankline.enable
|
||||||
|
then ''
|
||||||
|
-- highlight error: https://github.com/lukas-reineke/indent-blankline.nvim/issues/59
|
||||||
|
vim.wo.colorcolumn = "99999"
|
||||||
|
vim.opt.list = true
|
||||||
|
|
||||||
|
|
||||||
|
${
|
||||||
|
if cfg.indentBlankline.eolChar == ""
|
||||||
|
then ""
|
||||||
|
else ''vim.opt.listchars:append({ eol = "${cfg.indentBlankline.eolChar}" })''
|
||||||
|
}
|
||||||
|
|
||||||
|
${
|
||||||
|
if cfg.indentBlankline.fillChar == ""
|
||||||
|
then ""
|
||||||
|
else ''vim.opt.listchars:append({ space = "${cfg.indentBlankline.fillChar}"})''
|
||||||
|
}
|
||||||
|
|
||||||
|
require("indent_blankline").setup {
|
||||||
|
char = "${cfg.indentBlankline.listChar}",
|
||||||
|
show_current_context = ${boolToString cfg.indentBlankline.showCurrContext},
|
||||||
|
show_end_of_line = true,
|
||||||
|
}
|
||||||
|
''
|
||||||
|
else ""
|
||||||
|
}
|
||||||
|
|
||||||
|
${
|
||||||
|
if cfg.cursorWordline.enable
|
||||||
|
then "vim.g.cursorline_timeout = ${toString cfg.cursorWordline.lineTimeout}"
|
||||||
|
else ""
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
BIN
screenshot.png
Normal file
BIN
screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 204 KiB |
Loading…
Reference in a new issue