diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 19f02879..10371c90 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -30,22 +30,21 @@ Here are the overall boundaries I would like you to follow while contributing to #### Documentation -If you are making a pull request to add a - +If you are making a pull request to add a #### Style **Nix** -We use Alejandra for formatting nix code, which can be invoked directly with `nix fmt` in the repository. +We use Alejandra for formatting nix code, which can be invoked directly by running `nix fmt` in the repository. While Alejandra is mostly opinionated on how code looks after formatting, certain formattings are done at the user's discretion. Please use one line code for attribute sets that contain only one subset. For example: -```nix +```nix # parent modules should always be unfolded -module = { +module = { value = mkEnableOption "some description" // { default = true; }; # same as parent modules, unfold submodules subModule = { @@ -65,15 +64,16 @@ If you move a line down after the merge operator, Alejandra will automatically u module = { key = mkEnableOption "some description" // { default = true; # we want this to be inline - }; + }; # ... } ``` For lists, it's up mostly to your discretion but please try to avoid unfolded lists if there is only one item in the list. + ```nix -# ok +# ok acceptableList = [ item1 item2 @@ -85,10 +85,11 @@ acceptableList = [ listToBeAvoided = [item1 item2 item3 item4]; ``` -*This will be moved elsewhere, disregard unless you are adding a new plugin with keybinds* +_This will be moved elsewhere, disregard unless you are adding a new plugin with keybinds_ + #### Keybinds -##### Custom key mappings support for a plugin +##### Custom key mappings support for a plugin To add custom keymappings to a plugin, a couple of helper functions are available in the project. @@ -237,5 +238,3 @@ in { ``` If you have come across a plugin that has an API that doesn't seem to easily allow custom keybindings, don't be scared to implement a draft PR. We'll help you get it done. - - diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 14e8cbe0..c9270b26 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -7,7 +7,7 @@ body: id: no-duplicate-issues attributes: label: "⚠️ Please verify that this bug has NOT been reported before." - description: "Search in the issues sections by clicking [HERE](https://github.com/notashelf/neovim-flake4/issues?q=)" + description: "Search in the issues sections by clicking [HERE](https://github.com/notashelf/neovim-flake/issues?q=)" options: - label: "I checked all existing issues and didn't find a similar issue" required: true diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md index c50c5aa6..ca65c8b2 100644 --- a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -18,11 +18,10 @@ Please delete any options that are not relevant. ## Checklist -Please try to check at least a majority of the checklist before opening your pull request. PRs -Exceptions to this will be reviewed on a case by case basis. +Please try to check at least a majority of the checklist before opening your pull request. Exceptions to this will be reviewed on a case by case basis. - [ ] My code follows the style and contributing guidelines of this project. -- [ ] I ran Alejandra to format my code. +- [ ] I ran Alejandra to format my code (`nix fmt`). - [ ] I have performed a self-review of my own code and tested it. - [ ] I have commented my code, particularly in hard-to-understand areas. - [ ] My changes generate no new warnings. diff --git a/.github/README.md b/.github/README.md index e208bf33..e7dcdb3e 100644 --- a/.github/README.md +++ b/.github/README.md @@ -1,4 +1,7 @@ -

neovim-flake

+
+ Logo +
+

❄️ neovim-flake

@@ -49,7 +52,7 @@

-[Get Started]: #try-it-out +[Get Started]: #get-started [Documentation]: #documentation [Help]: #help [Contribute]: #contributing @@ -60,7 +63,7 @@ ## Get Started -### Using `nix` +### Using `nix` CLI If you would like to try out the configuration before even thinking about installing it, you can run: @@ -104,8 +107,7 @@ I am always looking for new ways to help improve this flake. If you would like t The philosophy behind this flake configuration is to create an easily configurable and reproducible Neovim environment. While it does sacrifice in size (which I know some users will find _disagreeable_), it offers a lot of flexibility and customizability in exchange for the large size of the flake inputs. -The KISS (Keep it simple, stupid) principle has been abandoned here, however, you _can_ ultimately leverage the flexibility of this flake to declare a configuration that follows KISS principles, it is very easy to bring your own plugins and configurations from non-nix. What this flake is meant to be does eventually fall into your hands. Whether you are a developer, writer, or live coder, you can 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). +The KISS (Keep it simple, stupid) principle has been abandoned here, however, you _can_ ultimately leverage the flexibility of this flake to declare a configuration that follows KISS principles, it is very easy to bring your own plugins and configurations from non-nix. What this flake is meant to be does eventually fall into your hands. Whether you are a developer, writer, or live coder, you can quickly craft a config that suits every project's need. Think of it like a distributionof Neovim that takes advantage of pinning vim plugins and third party dependencies (such as tree-sitter grammars, language servers, and more). 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. @@ -142,6 +144,8 @@ Special thanks to - [@FlafyDev](https://github.com/FlafyDev) - For getting the home-manager to work - [@n3oney](https://github.com/n3oney) - For making custom keybinds finally possible - [@horriblename](https://github.com/horriblename) - For actively implementing planned features and quality of life updates +- [@Yavko](https://github.com/Yavko) - For the amazing neovim-flake logo +- [@FrothyMarrow](https://github.com/FrothyMarrow) - For seeing mistakes that I could not and everyone who has submitted issues or pull requests! diff --git a/.github/workflows/cachix.yml b/.github/workflows/cachix.yml index 536061a5..c217234d 100644 --- a/.github/workflows/cachix.yml +++ b/.github/workflows/cachix.yml @@ -11,15 +11,16 @@ on: - .gitignore jobs: - cahix: + cachix: runs-on: ubuntu-latest + strategy: matrix: package: - - default - - nix - - tidal - - maximal + - default + - nix + - tidal + - maximal steps: - uses: easimon/maximize-build-space@v6 with: @@ -30,7 +31,7 @@ jobs: - uses: actions/checkout@v3 - uses: cachix/install-nix-action@v20 with: - extra_nix_config: | + extra_nix_config: | access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} auto-optimise-store = true experimental-features = nix-command flakes diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 91bbb8f6..c6d46d65 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -20,10 +20,11 @@ jobs: extra_nix_config: | access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - run: nix flake check + format-with-alejandra: name: Formatting via Alejandra runs-on: ubuntu-latest - steps: + steps: - uses: actions/checkout@v3 - uses: cachix/install-nix-action@v20 with: @@ -32,4 +33,3 @@ jobs: auto-optimise-store = true experimental-features = nix-command flakes - run: nix run nixpkgs#alejandra -- -c . - diff --git a/assets/alternative_prompt.png b/assets/alternative_prompt.png deleted file mode 100644 index b6537ae3..00000000 Binary files a/assets/alternative_prompt.png and /dev/null differ diff --git a/assets/dashboard.png b/assets/dashboard.png deleted file mode 100644 index 59b6d93b..00000000 Binary files a/assets/dashboard.png and /dev/null differ diff --git a/assets/ide_mode.png b/assets/ide_mode.png deleted file mode 100644 index 5ee47aa1..00000000 Binary files a/assets/ide_mode.png and /dev/null differ diff --git a/assets/neovim-flake-logo-work.svg b/assets/neovim-flake-logo-work.svg new file mode 100644 index 00000000..a5451f81 --- /dev/null +++ b/assets/neovim-flake-logo-work.svg @@ -0,0 +1,337 @@ + + + + diff --git a/assets/telescope.png b/assets/telescope.png deleted file mode 100644 index fd677d58..00000000 Binary files a/assets/telescope.png and /dev/null differ diff --git a/configuration.nix b/configuration.nix index 72c625a3..d62bf5e7 100644 --- a/configuration.nix +++ b/configuration.nix @@ -203,7 +203,10 @@ inputs: let }; vim.assistant = { - copilot.enable = isMaximal; + copilot = { + enable = isMaximal; + cmp.enable = isMaximal; + }; }; vim.session = { diff --git a/docs/home-manager.adoc b/docs/home-manager.adoc deleted file mode 100644 index f2380928..00000000 --- a/docs/home-manager.adoc +++ /dev/null @@ -1,77 +0,0 @@ -[[ch-hm-module]] -== Home Manager - -The Home Manager module allows us to customize the different `vim` options. To use it, we first add the input flake. - -[source,nix] ----- -{ - neovim-flake = { - url = github:notashelf/neovim-flake; - # you can override input nixpkgs - inputs.nixpkgs.follows = "nixpkgs"; - }; -} ----- - -Followed by importing the HM module. - -[source,nix] ----- -{ - imports = [ neovim-flake.homeManagerModules.default ]; -} ----- - -Then we should be able to use the given module. E.g. - -[source,nix] ----- -{ - programs.neovim-flake = { - - enable = true; - # your settings need to go into the settings attrset - settings = { - vim.viAlias = false; - vim.vimAlias = true; - vim.lsp = { - enable = true; - }; - }; - }; -} ----- - -=== Custom vim plugins - -It's possible to add custom vim plugins by using the startPlugins and lua DAG settings. First we install the plugin by adding it to startPlugins. This example uses nvim-surround, but the process will be similar for other plugins as well. - -[source,nix] ----- -{ - programs.neovim-flake = { - enable = true; - settings = { - vim.startPlugins = [ pkgs.vimPlugins.nvim-surround ]; - }; - }; -} ----- - -Then we continue by requiring the plugin in lua using DAG settings. Please note that you're able to name this setting to however you want, the name will add a `--SECTION ` in the init.vim, under which it will be initialized. - -[source,nix] ----- -{ - programs.neovim-flake = { - enable = true; - settings = { - vim.startPlugins = [ pkgs.vimPlugins.nvim-surround ]; - luaConfigRC.nvim-surround = nvim-flake.lib.nvim.dag.entryAnywhere '' # nvim-flake is a reference to the flake. Please change this accordingly to your config. - require("nvim-surround").setup() - ''; - }; - }; -} ----- \ No newline at end of file diff --git a/docs/release-notes/rl-0.4.adoc b/docs/release-notes/rl-0.4.adoc index 16f629c9..32e0b1ff 100644 --- a/docs/release-notes/rl-0.4.adoc +++ b/docs/release-notes/rl-0.4.adoc @@ -65,7 +65,9 @@ https://github.com/notashelf[notashelf]: * Added a module for enabling Neovim's spellchecker -* Replaced prettier with prettierd - the daemonized version of prettier +* Added prettierd as an alternative formatter to prettier - currently defaults to prettier + +* Fixed presence.nvim inheriting the wrong client id * Cleaned up documentation diff --git a/docs/release-notes/rl-0.5.adoc b/docs/release-notes/rl-0.5.adoc new file mode 100644 index 00000000..865ee3f7 --- /dev/null +++ b/docs/release-notes/rl-0.5.adoc @@ -0,0 +1,21 @@ +[[sec-release-0.5]] +== Release 0.5 + + +[[sec-release-0.5-changelog]] +=== Changelog + + +https://github.com/horriblename[horriblename]: + +* Add transparency support for tokyonight theme. + +* Fix bug where cmp's close and scrollDocs mappings wasn't working. + +https://github.com/amanse[amanse]: + +* Add daily notes options for obsidian plugin + +https://github.com/notashelf[notashelf]: + +* Add GitHub Copilot to completion sources diff --git a/flake.lock b/flake.lock index 69727eee..3741f250 100644 --- a/flake.lock +++ b/flake.lock @@ -224,6 +224,22 @@ "type": "github" } }, + "copilot-cmp": { + "flake": false, + "locked": { + "lastModified": 1683831407, + "narHash": "sha256-+MzEGnhlrYRvAfskOwmw69OC1CsPXt7s3z+xPe9XPqs=", + "owner": "zbirenbaum", + "repo": "copilot-cmp", + "rev": "c2cdb3c0f5078b0619055af192295830a7987790", + "type": "github" + }, + "original": { + "owner": "zbirenbaum", + "repo": "copilot-cmp", + "type": "github" + } + }, "copilot-lua": { "flake": false, "locked": { @@ -919,16 +935,15 @@ "nvim-bufferline-lua": { "flake": false, "locked": { - "lastModified": 1666171880, - "narHash": "sha256-hueIGT7KOhca0kP0M1nUYzBrzMz+DpuZSOt5iyuEa40=", + "lastModified": 1689661992, + "narHash": "sha256-0BJXUDGeUhPALEnPgO4ix+GgI/3P/Foiqi0tf2mgUXg=", "owner": "akinsho", "repo": "nvim-bufferline.lua", - "rev": "e70be6232f632d16d2412b1faf85554285036278", + "rev": "d24378edc14a675c820a303b4512af3bbc5761e9", "type": "github" }, "original": { "owner": "akinsho", - "ref": "v3.0.1", "repo": "nvim-bufferline.lua", "type": "github" } @@ -1353,6 +1368,7 @@ "cmp-vsnip": "cmp-vsnip", "codewindow-nvim": "codewindow-nvim", "comment-nvim": "comment-nvim", + "copilot-cmp": "copilot-cmp", "copilot-lua": "copilot-lua", "crates-nvim": "crates-nvim", "dashboard-nvim": "dashboard-nvim", diff --git a/flake.nix b/flake.nix index 67d38251..d207bff5 100644 --- a/flake.nix +++ b/flake.nix @@ -181,7 +181,7 @@ # Tablines nvim-bufferline-lua = { - url = "github:akinsho/nvim-bufferline.lua?ref=v3.0.1"; + url = "github:akinsho/nvim-bufferline.lua"; flake = false; }; @@ -481,6 +481,11 @@ flake = false; }; + copilot-cmp = { + url = "github:zbirenbaum/copilot-cmp"; + flake = false; + }; + # Session management nvim-session-manager = { url = "github:Shatur/neovim-session-manager"; diff --git a/lib/types/plugins.nix b/lib/types/plugins.nix index 111fd8c1..aed65f44 100644 --- a/lib/types/plugins.nix +++ b/lib/types/plugins.nix @@ -87,6 +87,7 @@ with lib; let "nvim-surround" "nvim-dap" "nvim-dap-ui" + "copilot-cmp" ]; # You can either use the name of the plugin or a package. pluginsType = with types; diff --git a/modules/assistant/copilot/config.nix b/modules/assistant/copilot/config.nix index c920e355..349d6106 100644 --- a/modules/assistant/copilot/config.nix +++ b/modules/assistant/copilot/config.nix @@ -21,16 +21,21 @@ with builtins; let ''; in { config = mkIf cfg.enable { - vim.startPlugins = [ - "copilot-lua" - cfg.copilotNodePackage - ]; + vim.startPlugins = + [ + "copilot-lua" + cfg.copilotNodePackage + ] + ++ lib.optionals (cfg.cmp.enable) [ + "copilot-cmp" + ]; vim.luaConfigRC.copilot = nvim.dag.entryAnywhere '' require("copilot").setup({ -- available options: https://github.com/zbirenbaum/copilot.lua - copilot_node_command = "${cfg.copilot_node_command}", + copilot_node_command = "${cfg.copilotNodeCommand}", panel = { + enabled = ${lib.boolToString (!cfg.cmp.enable)}, keymap = { jump_prev = false, jump_next = false, @@ -44,6 +49,7 @@ in { }, }, suggestion = { + enabled = ${lib.boolToString (!cfg.cmp.enable)}, keymap = { accept = false, accept_word = false, @@ -54,6 +60,10 @@ in { }, }, }) + + ${lib.optionalString (cfg.cmp.enable) '' + require("copilot_cmp").setup() + ''} ''; vim.maps.normal = mkMerge [ diff --git a/modules/assistant/copilot/copilot.nix b/modules/assistant/copilot/copilot.nix index 003308a0..927604ca 100644 --- a/modules/assistant/copilot/copilot.nix +++ b/modules/assistant/copilot/copilot.nix @@ -10,6 +10,7 @@ with builtins; let in { options.vim.assistant.copilot = { enable = mkEnableOption "GitHub Copilot AI assistant"; + cmp.enable = mkEnableOption "nvim-cmp integration for GitHub Copilot"; panel = { position = mkOption { @@ -91,16 +92,22 @@ in { }; }; - copilot_node_command = mkOption { + copilotNodeCommand = mkOption { type = types.str; default = "${lib.getExe cfg.copilotNodePackage}"; - description = "Path to nodejs"; + description = '' + The command that will be executed to initiate nodejs for GitHub Copilot. + Recommended to leave as default. + ''; }; copilotNodePackage = mkOption { - type = with types; nullOr package; # TODO - maybe accept a path as well? imperative users might want to use something like nvm - default = pkgs.nodejs-slim; # this will likely need to be downgraded because Copilot does not stay up to date with NodeJS - description = "The package that will be used for Copilot. NodeJS v18 is recommended."; + type = with types; nullOr package; + default = pkgs.nodejs-slim; + description = '' + The nodeJS package that will be used for GitHub Copilot. If you are using a custom node command + you may want to set this option to null so that the package is not pulled from nixpkgs. + ''; }; }; } diff --git a/modules/completion/nvim-cmp/config.nix b/modules/completion/nvim-cmp/config.nix index 1cc4fa46..52e89725 100644 --- a/modules/completion/nvim-cmp/config.nix +++ b/modules/completion/nvim-cmp/config.nix @@ -49,6 +49,7 @@ in { "buffer" = "[Buffer]"; "crates" = "[Crates]"; "path" = "[Path]"; + "copilot" = "[Copilot]"; }; vim.maps.insert = mkMerge [ @@ -106,17 +107,13 @@ in { end '') (mkSetLuaBinding mappings.close '' - require('cmp').mapping.abort + require('cmp').mapping.abort() '') (mkSetLuaBinding mappings.scrollDocsUp '' - function() - require('cmp').mapping.scroll_docs(-4) - end + require('cmp').mapping.scroll_docs(-4) '') (mkSetLuaBinding mappings.scrollDocsDown '' - function() - require('cmp').mapping.scroll_docs(4) - end + require('cmp').mapping.scroll_docs(4) '') ]; @@ -125,17 +122,13 @@ in { require('cmp').complete '') (mkSetLuaBinding mappings.close '' - require('cmp').mapping.close + require('cmp').mapping.close() '') (mkSetLuaBinding mappings.scrollDocsUp '' - function() - require('cmp').mapping.scroll_docs(-4) - end + require('cmp').mapping.scroll_docs(-4) '') (mkSetLuaBinding mappings.scrollDocsDown '' - function() - require('cmp').mapping.scroll_docs(4) - end + require('cmp').mapping.scroll_docs(4) '') ]; @@ -182,6 +175,8 @@ in { '') ]; + # TODO: alternative snippet engines to vsnip + # https://github.com/hrsh7th/nvim-cmp/blob/main/doc/cmp.txt#L82 vim.luaConfigRC.completion = mkIf (cfg.type == "nvim-cmp") (dagPlacement '' local nvim_cmp_menu_map = function(entry, vim_item) -- name for each source @@ -195,19 +190,30 @@ in { ${optionalString lspkindEnabled '' lspkind_opts.before = ${cfg.formatting.format} ''} + local cmp = require'cmp' cmp.setup({ + window = { + -- TODO: at some point, those need to be optional + -- but first nvim cmp module needs to be detached from "cfg.autocomplete" + completion = cmp.config.window.bordered(), + documentation = cmp.config.window.bordered(), + }, + snippet = { expand = function(args) vim.fn["vsnip#anonymous"](args.body) end, }, + sources = { ${builtSources} }, + completion = { completeopt = 'menu,menuone,noinsert', }, + formatting = { format = ${ diff --git a/modules/languages/ts.nix b/modules/languages/ts.nix index 44fc7655..8c2efe29 100644 --- a/modules/languages/ts.nix +++ b/modules/languages/ts.nix @@ -23,7 +23,7 @@ with builtins; let }; # TODO: specify packages - defaultFormat = "prettierd"; + defaultFormat = "prettier"; formats = { prettier = { package = pkgs.nodePackages.prettier; diff --git a/modules/notes/obsidian/config.nix b/modules/notes/obsidian/config.nix index 1107c35c..8f9c2d15 100644 --- a/modules/notes/obsidian/config.nix +++ b/modules/notes/obsidian/config.nix @@ -23,6 +23,18 @@ in { if (auto.type == "nvim-cmp") then "true" else "false" + } + }, + daily_notes = { + folder = ${ + if (cfg.daily-notes.folder == "") + then "nil," + else "'${cfg.daily-notes.folder}'," + } + date_format = ${ + if (cfg.daily-notes.date-format == "") + then "nil," + else "'${cfg.daily-notes.date-format}'," } } }) diff --git a/modules/notes/obsidian/obsidian.nix b/modules/notes/obsidian/obsidian.nix index 674c66b4..60ee71f8 100644 --- a/modules/notes/obsidian/obsidian.nix +++ b/modules/notes/obsidian/obsidian.nix @@ -14,6 +14,19 @@ with builtins; { description = "Obsidian vault directory"; }; + daily-notes = { + folder = mkOption { + type = types.str; + default = ""; + description = "Directory in which daily notes should be created"; + }; + date-format = mkOption { + type = types.str; + default = ""; + description = "Date format used for creating daily notes"; + }; + }; + completion = { nvim_cmp = mkOption { # if using nvim-cmp, otherwise set to false diff --git a/modules/rich-presence/presence-nvim/presence-nvim.nix b/modules/rich-presence/presence-nvim/presence-nvim.nix index f2cc90e6..b7acf485 100644 --- a/modules/rich-presence/presence-nvim/presence-nvim.nix +++ b/modules/rich-presence/presence-nvim/presence-nvim.nix @@ -22,9 +22,10 @@ with builtins; { client_id = mkOption { type = types.str; - default = "859194972255989790"; + default = "79327144129396737"; description = "Client ID of the application"; }; + auto_update = mkOption { type = types.bool; default = true; diff --git a/modules/theme/supported_themes.nix b/modules/theme/supported_themes.nix index 7338edbe..f4e2477e 100644 --- a/modules/theme/supported_themes.nix +++ b/modules/theme/supported_themes.nix @@ -18,6 +18,9 @@ style ? "night", transparent, }: '' + require('tokyonight').setup { + transparent = ${lib.boolToString transparent}; + } vim.cmd[[colorscheme tokyonight-${style}]] ''; styles = ["day" "night" "storm" "moon"]; diff --git a/modules/ui/notifications/nvim-notify/config.nix b/modules/ui/notifications/nvim-notify/config.nix index 3c4b573d..8eb50d83 100644 --- a/modules/ui/notifications/nvim-notify/config.nix +++ b/modules/ui/notifications/nvim-notify/config.nix @@ -23,8 +23,17 @@ in { DEBUG = "${cfg.icons.DEBUG}", TRACE = "${cfg.icons.TRACE}", }, - } + + -- required to fix offset_encoding errors + local notify = vim.notify + vim.notify = function(msg, ...) + if msg:match("warning: multiple different client offset_encodings") then + return + end + + notify(msg, ...) + end ''; }; }