diff --git a/.github/README.md b/.github/README.md
index 06c9eb7d..1c3e22c3 100644
--- a/.github/README.md
+++ b/.github/README.md
@@ -33,10 +33,9 @@
+[Features]: #features
[Get Started]: #get-started
[Documentation]: #documentation
[Help]: #help
@@ -51,119 +51,150 @@
[FAQ]: #faq
[Credits]: #credits
-**[
Get Started
][Get Started]**
-**[
Documentation
][Documentation]**
-**[
Help
][Help]**
-**[
Contribute
][Contribute]**
-**[
FAQ
][Faq]**
-**[
Credits
][Credits]**
+**[
Features
][Features]**
+**[
Get Started
][Get Started]**
+**[
Documentation
][Documentation]**
+**[
Help
][Help]**
+**[
Contribute
][Contribute]**
+**[
FAQ
][Faq]** **[
Credits
][Credits]**
---
+## Features
+
+- **Reproducible**: Your configuration will behave the same _anywhere_. No
+ surprises, promise!
+- **Portable**: nvf depends _solely_ on your Nix store, and nothing else. No
+ more global binaries! Works on all platforms, without hassle.
+- **Customizable**: There are _almost no defaults_ to annoy you. nvf is fully
+ customizable through the Nix module system.
+- **Well-documented**: Documentation is priority. You will _never_ face
+ undocumented, obscure behaviour.
+- **Idiomatic**: nvf does things ✨ _the right way_ ✨ - the codebase is, and
+ will, remain maintainable for myself and any contributors.
+
## Get Started
-### Using `nix` CLI
+[nvf manual]: https://notashelf.github.io/nvf/
+[issue tracker]: https://github.com/NotAShelf/nvf/issues
-If you would like to try out the configuration before even thinking about
-installing it, you can run the following command
+If you are not sold on the concepts of **nvf**, and would like to try out the
+default configuration before even _thinking about_ installing it, you may run
+the following in order to take **nvf** out for a spin.
-```console
+```bash
+# Run the default package
nix run github:notashelf/nvf
```
-This will get you a feel for the base configuration and UI design.
-The flake exposes `#nix` as the default package, providing minimal
-language support and various utilities.You may also use `#nix`,
-`#tidal` or `#maximal` to get try out different configurations.
+This will get you a feel for the base configuration and UI design. Though, none
+of the configuration options are final as **nvf** is designed to be modular and
+configurable.
-It is as simple as changing the target output to get a different
-configuration. For example, to get a configuration with `tidal` support, run:
+> [!TIP]
+> The flake exposes `#nix` as the default package, providing minimal language
+> support and various utilities. You may also use the `#nix` or `#maximal`
+> packages provided by the this flake to get try out different configurations.
-```console
-nix run github:notashelf/nvf#tidal
+It is as simple as changing the target output to get a different configuration.
+For example, to get a configuration with large language coverage, run:
+
+```bash
+# Run the maximal package
+nix run github:notashelf/nvf#maximal
```
Similar instructions will apply for `nix profile install`. However, you are
recommended to instead use the module system as described in the manual.
-> [!NOTE]
-> The `maximal` configuration is _massive_ and will take a while to build.
-> To get a feel for the configuration, use the default `nix` or `tidal`
-> configurations. Should you choose to try out the `maximal` configuration,
-> using the binary cache as described in the manual is _strongly_ recommended.
+> [!NOTE]
+> The `maximal` configuration is quite large, and might take a while to build.
+> To get a feel for the configuration, use the default `nix` configuration.
+> Should you choose to try out the `maximal` configuration, using the binary
+> cache as described in the manual is _strongly_ recommended.
+
+If you are convinced, proceed to the next section to view the installation
+instructions.
## Documentation
-See the [**nvf** Manual](https://notashelf.github.io/nvf/) for
-detailed installation guides, configurations, available options, release notes
-and more. Tips for installing userspace plugins is also contained in the
-documentation.
+The _recommended_ way of installing **nvf** is using either the NixOS or the
+Home-Manager module, though it is completely possible and no less supported to
+install **nvf** as a standalone package, or a flake output.
-If you want to dive right into trying **nvf** you can get a fully
-featured configuration with `nix` language support by running:
+See the [**nvf** manual] for detailed and up-to-date installation guides,
+configurations, available options, release notes and more. Tips for installing
+userspace plugins is also contained in the documentation.
-```console
-nix run github:notashelf/nvf#nix
-```
-
-[Issues]: https://github.com/NotAShelf/nvf/issues
-
-Please create an issue on the [issue tracker](issues) if you find
-the documentation lacking or confusing. I also appreciate any contributions
-to the documentation.
+Please create an issue on the [issue tracker] if you find the documentation
+lacking or confusing. Any improvements to the documentation through pull
+requests are also welcome, and appreciated.
## Help
-You can create an issue on the [issue tracker](issues) to ask questions
-or report bugs. I am not yet on spaces like matrix or IRC, so please use the issue
-tracker for now.
+You can create an issue on the [issue tracker] to ask questions or report bugs.
+I am not yet on spaces like matrix or IRC, so please use the issue tracker for
+now.
## Contributing
I am always looking for new ways to help improve this flake. If you would like
to contribute, please read the [contributing guide](CONTRIBUTING.md) before
-submitting a pull request. You can also create an issue on the
-[issue tracker](issues) before submitting a pull request if you would
-like to discuss a feature or bug fix.
+submitting a pull request. You can also create an issue on the [issue tracker]
+before submitting a pull request if you would like to discuss a feature or bug
+fix.
## FAQ
+[appropriate issue template]: https://github.com/NotAShelf/nvf/issues/new/choose
+[list of branches]: https://github.com/NotAShelf/nvf/branches
+[list of open pull requests]: https://github.com/NotAShelf/nvf/pulls
+
+**Q**: What platforms are supported?
+
diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml
new file mode 100644
index 00000000..204dcba7
--- /dev/null
+++ b/.github/workflows/cleanup.yml
@@ -0,0 +1,22 @@
+name: Cleanup
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: "0 4 1 * *" # 4AM on 1st of every month
+ - cron: "0 4 15 * *" # 4AM on the 15th of every month
+jobs:
+ branches:
+ name: Cleanup old branches
+ runs-on: ubuntu-latest
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Delete old branches"
+ uses: beatlabs/delete-old-branches-action@v0.0.10
+ with:
+ repo_token: "${{ secrets.GITHUB_TOKEN }}"
+ date: "1 months ago"
+ dry_run: false
+ delete_tags: false
+ exclude_open_pr_branches: true
diff --git a/configuration.nix b/configuration.nix
index 08b0f9b6..b21b26aa 100644
--- a/configuration.nix
+++ b/configuration.nix
@@ -19,6 +19,7 @@ isMaximal: {
lspsaga.enable = false;
trouble.enable = true;
lspSignature.enable = true;
+ otter-nvim.enable = isMaximal;
lsplines.enable = isMaximal;
nvim-docs-view.enable = isMaximal;
};
@@ -155,7 +156,7 @@ isMaximal: {
};
utility = {
- ccc.enable = isMaximal;
+ ccc.enable = false;
vim-wakatime.enable = false;
icon-picker.enable = isMaximal;
surround.enable = isMaximal;
diff --git a/docs/release-notes/rl-0.7.md b/docs/release-notes/rl-0.7.md
index d93bb2c6..55746f2b 100644
--- a/docs/release-notes/rl-0.7.md
+++ b/docs/release-notes/rl-0.7.md
@@ -202,3 +202,5 @@ everyone.
[Soliprem](https://github.com/Soliprem)
- Add LSP and Treesitter support for R under `vim.languages.R`.
+- Add Otter support under `vim.lsp.otter` and an assert to prevent conflict with
+ ccc
diff --git a/flake.lock b/flake.lock
index 91fc5060..ecc02f27 100644
--- a/flake.lock
+++ b/flake.lock
@@ -1373,6 +1373,22 @@
"type": "github"
}
},
+ "plugin-otter-nvim": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1724585935,
+ "narHash": "sha256-euHwoK2WHLF/hrjLY2P4yGrIbYyBN38FL3q4CKNZmLY=",
+ "owner": "jmbuhr",
+ "repo": "otter.nvim",
+ "rev": "ca9ce67d0399380b659923381b58d174344c9ee7",
+ "type": "github"
+ },
+ "original": {
+ "owner": "jmbuhr",
+ "repo": "otter.nvim",
+ "type": "github"
+ }
+ },
"plugin-oxocarbon": {
"flake": false,
"locked": {
@@ -1861,6 +1877,7 @@
"plugin-obsidian-nvim": "plugin-obsidian-nvim",
"plugin-onedark": "plugin-onedark",
"plugin-orgmode-nvim": "plugin-orgmode-nvim",
+ "plugin-otter-nvim": "plugin-otter-nvim",
"plugin-oxocarbon": "plugin-oxocarbon",
"plugin-plenary-nvim": "plugin-plenary-nvim",
"plugin-project-nvim": "plugin-project-nvim",
diff --git a/flake.nix b/flake.nix
index c4996fcf..987e3e59 100644
--- a/flake.nix
+++ b/flake.nix
@@ -13,8 +13,8 @@
inherit inputs;
specialArgs = {inherit lib;};
} {
- # provide overridable systems
- # https://github.com/nix-systems/nix-systems
+ # Allow users to bring their own systems.
+ # «https://github.com/nix-systems/nix-systems»
systems = import inputs.systems;
imports = [
./flake/apps.nix
@@ -62,7 +62,6 @@
pkgs,
...
}: {
- formatter = pkgs.alejandra;
devShells = {
default = self'.devShells.lsp;
nvim-nix = pkgs.mkShell {packages = [config.packages.nix];};
@@ -70,6 +69,21 @@
packages = with pkgs; [nil statix deadnix alejandra];
};
};
+
+ # Provide the default formatter. `nix fmt` in project root
+ # will format available files with the correct formatter.
+ # P.S: Please do not format with nixfmt! It messes with many
+ # syntax elements and results in unreadable code.
+ formatter = pkgs.alejandra;
+
+ # Check if codebase is properly formatted.
+ # This can be initiated with `nix build .#checks.
.nix-fmt`
+ # or with `nix flake check`
+ checks = {
+ nix-fmt = pkgs.runCommand "nix-fmt-check" {nativeBuildInputs = [pkgs.alejandra];} ''
+ alejandra --check ${self} < /dev/null | tee $out
+ '';
+ };
};
};
@@ -156,6 +170,11 @@
flake = false;
};
+ plugin-otter-nvim = {
+ url = "github:jmbuhr/otter.nvim";
+ flake = false;
+ };
+
# Language support
plugin-sqls-nvim = {
url = "github:nanotee/sqls.nvim";
diff --git a/modules/plugins/languages/ts.nix b/modules/plugins/languages/ts.nix
index e6e718ed..5ceccecf 100644
--- a/modules/plugins/languages/ts.nix
+++ b/modules/plugins/languages/ts.nix
@@ -226,7 +226,7 @@ in {
{
assertion = cfg.lsp.enable -> cfg.lsp.server != "tsserver";
message = ''
- As of a recent lspconfig update, he `tsserver` configuration has been renamed
+ As of a recent lspconfig update, the `tsserver` configuration has been renamed
to `ts_ls` to match upstream behaviour of `lspconfig`, and the name `tsserver`
is no longer considered valid by nvf. Please set `vim.languages.ts.lsp.server`
to `"ts_ls"` instead of to `${cfg.lsp.server}`
diff --git a/modules/plugins/lsp/default.nix b/modules/plugins/lsp/default.nix
index a5d5163d..421f5fda 100644
--- a/modules/plugins/lsp/default.nix
+++ b/modules/plugins/lsp/default.nix
@@ -13,6 +13,7 @@
./trouble
./lsp-signature
./lightbulb
+ ./otter
./lspkind
./lsplines
./nvim-docs-view
diff --git a/modules/plugins/lsp/otter/config.nix b/modules/plugins/lsp/otter/config.nix
new file mode 100644
index 00000000..e5df92f7
--- /dev/null
+++ b/modules/plugins/lsp/otter/config.nix
@@ -0,0 +1,39 @@
+{
+ config,
+ lib,
+ ...
+}: let
+ inherit (lib.modules) mkIf mkMerge;
+ inherit (lib.nvim.dag) entryAnywhere;
+ inherit (lib.nvim.lua) toLuaObject;
+ inherit (lib.nvim.binds) addDescriptionsToMappings mkSetBinding;
+
+ cfg = config.vim.lsp;
+
+ self = import ./otter.nix {inherit lib;};
+ mappingDefinitions = self.options.vim.lsp.otter-nvim.mappings;
+ mappings = addDescriptionsToMappings cfg.otter-nvim.mappings mappingDefinitions;
+in {
+ config = mkIf (cfg.enable && cfg.otter-nvim.enable) {
+ assertions = [
+ {
+ assertion = !config.vim.utility.ccc.enable;
+ message = ''
+ ccc and otter have a breaking conflict. It's been reported upstream. Until it's fixed, disable one of them
+ '';
+ }
+ ];
+ vim = {
+ startPlugins = ["otter-nvim"];
+
+ maps.normal = mkMerge [
+ (mkSetBinding mappings.toggle "lua require'otter'.activate()")
+ ];
+
+ pluginRC.otter-nvim = entryAnywhere ''
+ -- Enable otter diagnostics viewer
+ require("otter").setup({${toLuaObject cfg.otter-nvim.setupOpts}})
+ '';
+ };
+ };
+}
diff --git a/modules/plugins/lsp/otter/default.nix b/modules/plugins/lsp/otter/default.nix
new file mode 100644
index 00000000..935f1447
--- /dev/null
+++ b/modules/plugins/lsp/otter/default.nix
@@ -0,0 +1,6 @@
+{
+ imports = [
+ ./otter.nix
+ ./config.nix
+ ];
+}
diff --git a/modules/plugins/lsp/otter/otter.nix b/modules/plugins/lsp/otter/otter.nix
new file mode 100644
index 00000000..79797aaf
--- /dev/null
+++ b/modules/plugins/lsp/otter/otter.nix
@@ -0,0 +1,64 @@
+{lib, ...}: let
+ inherit (lib.options) mkOption mkEnableOption;
+ inherit (lib.nvim.binds) mkMappingOption;
+ inherit (lib.types) bool str listOf;
+ inherit (lib.nvim.types) mkPluginSetupOption;
+in {
+ options.vim.lsp = {
+ otter-nvim = {
+ enable = mkEnableOption ''
+ lsp features and a code completion source for code embedded in other documents [otter-nvim]
+ '';
+ mappings = {
+ toggle = mkMappingOption "Activate LSP on Cursor Position [otter-nvim]" "lo";
+ };
+ setupOpts = mkPluginSetupOption "otter.nvim" {
+ lsp = {
+ diagnostic_update_event = mkOption {
+ type = listOf str;
+ default = ["BufWritePost"];
+ description = ''
+ `:h events` that cause the diagnostic to update.
+ Set to: {"BufWritePost", "InsertLeave", "TextChanged" }
+ for less performant but more instant diagnostic updates
+ '';
+ };
+ };
+ buffers = {
+ set_filetype = mkOption {
+ type = bool;
+ default = false;
+ description = ''
+ if set to true, the filetype of the otterbuffers will be set. Other wide only
+ the autocommand of lspconfig that attaches the language server will be
+ executed without stting the filetype
+ '';
+ };
+ write_to_disk = mkOption {
+ type = bool;
+ default = false;
+ description = ''
+ write .otter. files to disk on save of main buffer.
+ Useful for some linters that require actual files.
+ Otter files are deleted on quit or main buffer close
+ '';
+ };
+ };
+ strip_wrapping_quote_characters = mkOption {
+ type = listOf str;
+ default = ["'" ''"'' "`"];
+ description = ''
+ '';
+ };
+ handle_leading_whitespace = mkOption {
+ type = bool;
+ default = false;
+ description = ''
+ otter may not work the way you expect when entire code blocks are indented
+ (eg. in Org files) When true, otter handles these cases fully.
+ '';
+ };
+ };
+ };
+ };
+}