From 1eddd990fc3be30292da34ed02030f7742e4bac1 Mon Sep 17 00:00:00 2001 From: alfarel Date: Fri, 31 Oct 2025 19:46:43 +0000 Subject: [PATCH] notes/obsidian-nvim: remove unnecessary options and add integrations/compat --- docs/manual/release-notes/rl-0.9.md | 75 +++++++++++++++++++ modules/plugins/notes/obsidian/config.nix | 57 +++++++++++++-- modules/plugins/notes/obsidian/obsidian.nix | 81 ++++++++++++--------- 3 files changed, 174 insertions(+), 39 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 396046ca..2adb8c1b 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -1,5 +1,26 @@ # Release 0.9 {#sec-release-0-9} +## Breaking changes + +- [obsidian.nvim] now uses a maintained fork which has removed the `dir` + setting. Use `workspaces` instead: + + ```nix + { + workspaces = [ + { + name = "any-string"; + path = "~/old/dir/path/value"; + } + ]; + } + ``` + + Some other settings and commands are now deprecated but are still supported. + +- [obsidian.nvim] has removed the `setupOpts.mappings` options. Use the built-in + Neovim settings (nvf's {option}`vim.keymaps`) + ## Changelog {#sec-release-0-9-changelog} [Ring-A-Ding-Ding-Baby](https://github.com/Ring-A-Ding-Ding-Baby): @@ -7,3 +28,57 @@ - Aligned `codelldb` adapter setup with [rustaceanvim]’s built-in logic. - Added `languages.rust.dap.backend` option to choose between `codelldb` and `lldb-dap` adapters. + +[alfarel](https://github.com/alfarelcynthesis): + +[obsidian.nvim]: https://github.com/obsidian-nvim/obsidian.nvim +[blink.cmp]: https://cmp.saghen.dev/ +[snacks.nvim]: https://github.com/folke/snacks.nvim +[mini.nvim]: https://nvim-mini.org/mini.nvim/ +[telescope.nvim]: https://github.com/nvim-telescope/telescope.nvim +[fzf-lua]: https://github.com/ibhagwan/fzf-lua +[render-markdown.nvim]: https://github.com/MeanderingProgrammer/render-markdown.nvim +[markview.nvim]: https://github.com/OXY2DEV/markview.nvim +[which-key.nvim]: https://github.com/folke/which-key.nvim + +- Upgrade [obsidian.nvim] to use a maintained fork, instead of the unmaintained + upstream. + - Various upstream improvements: + - Support [blink.cmp] and completion plugin autodetection. + - Support various pickers for prompts, including [snacks.nvim]'s + `snacks.picker`, [mini.nvim]'s `mini.pick`, [telescope.nvim], and + [fzf-lua]. + - Merge commands like `ObsidianBacklinks` into `Obisidian backlinks`. The + old format is still supported by default. + - Some `setupOpts` options have changed: + - `disable_frontmatter` -> `frontmatter.enabled` (and inverted), still + supported. + - `note_frontmatter_func` -> `frontmatter.func`, still supported. + - `statusline` module is now deprecated in favour of `footer`, still + supported. + - `dir` is no longer supported, use `workspaces`: + + ```nix + { + workspaces = [ + { + name = "any-string"; + path = "~/old/dir/path/value"; + } + ]; + } + ``` + + - `use_advanced_uri` -> `open.use_advanced_uri`. + - Mappings are now expected to be set using the built-in Neovim APIs, + managed by `vim.keymaps` in nvf, instead of `mappings` options. + - Some option defaults have changed. + - And more. + - Automatically configure an enabled picker in the order mentioned above, if + any are enabled. + - Add integration with `snacks.image` for rendering workspace/vault assets. + - Detect if [render-markdown.nvim] or [markview.nvim] are enabled and disable + the `ui` module if so. It should work without this, but `render-markdown`'s + {command}`:healthcheck` doesn't know that. + - Remove [which-key.nvim] `o` `+Notes` description which did not + actually correspond to any keybinds. diff --git a/modules/plugins/notes/obsidian/config.nix b/modules/plugins/notes/obsidian/config.nix index 835bc17c..145ddff7 100644 --- a/modules/plugins/notes/obsidian/config.nix +++ b/modules/plugins/notes/obsidian/config.nix @@ -3,9 +3,9 @@ lib, ... }: let - inherit (lib.modules) mkIf; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.generators) mkLuaInline; inherit (lib.nvim.dag) entryAnywhere; - inherit (lib.nvim.binds) pushDownDefault; inherit (lib.nvim.lua) toLuaObject; cfg = config.vim.notes.obsidian; @@ -18,13 +18,58 @@ in { "tabular" ]; - binds.whichKey.register = pushDownDefault { - "o" = "+Notes"; - }; - pluginRC.obsidian = entryAnywhere '' require("obsidian").setup(${toLuaObject cfg.setupOpts}) ''; + + notes.obsidian.setupOpts = let + # may not be defined + snacks-picker.enable = config.vim.utility.snacks-nvim.setupOpts.picker.enabled or false; + mini-pick = config.vim.mini.pick; + inherit (config.vim) telescope fzf-lua; + + inherit (config.vim.languages.markdown.extensions) render-markdown-nvim markview-nvim; + in + mkMerge [ + # Don't set option unless we have a useful setting for it. + (mkIf (snacks-picker.enable || mini-pick.enable || telescope.enable || fzf-lua.enable) { + # It doesn't detect/choose this. + # Some pickers and completion plugins don't get detected correctly by the checkhealth, but they all work. + # Values taken from the [config's](https://github.com/obsidian-nvim/obsidian.nvim/blob/main/lua/obsidian/config/init.lua) valid ones. + picker.name = + if snacks-picker.enable + then "snacks.pick" + else if mini-pick.enable + then "mini.pick" + else if telescope.enable + then "telescope.nvim" + else if fzf-lua.enable + then "fzf-lua" + # NOTE: Shouldn't happen with the if-guard. + else null; + }) + + # Should be disabled automatically, but still shows up in render-markdown's checkhealth. + # This is also useful in that it will conflict with a user explicitly enabling it + # without mkForce, which is probably a copy paste issue and a sign to look at + # whether this option is useful. + (mkIf (render-markdown-nvim.enable || markview-nvim.enable) {ui.enable = false;}) + ]; + + # Resolve markdown image paths in the vault. + # Only actually used by snacks if image.enabled is set to true and + # required programs are supplied and `attachments.img_folder` is correct. + # From https://github.com/obsidian-nvim/obsidian.nvim/wiki/Images, + # which notes the API might change. + utility.snacks-nvim.setupOpts = mkIf config.vim.utility.snacks-nvim.enable { + image.resolve = mkLuaInline '' + function(path, src) + if require("obsidian.api").path_is_note(path) then + return require("obsidian.api").resolve_image_path(src) + end + end + ''; + }; }; }; } diff --git a/modules/plugins/notes/obsidian/obsidian.nix b/modules/plugins/notes/obsidian/obsidian.nix index 17369b88..15cdf33f 100644 --- a/modules/plugins/notes/obsidian/obsidian.nix +++ b/modules/plugins/notes/obsidian/obsidian.nix @@ -1,14 +1,7 @@ -{ - config, - lib, - ... -}: let - inherit (lib.options) mkEnableOption mkOption; - inherit (lib.types) bool str nullOr; - inherit (lib.modules) mkRenamedOptionModule; +{lib, ...}: let + inherit (lib.options) mkEnableOption; + inherit (lib.modules) mkRenamedOptionModule mkRemovedOptionModule; inherit (lib.nvim.types) mkPluginSetupOption; - - autocompleteCfg = config.vim.autocomplete; in { imports = let renamedSetupOption = oldPath: newPath: @@ -16,38 +9,60 @@ in { (["vim" "notes" "obsidian"] ++ oldPath) (["vim" "notes" "obsidian" "setupOpts"] ++ newPath); in [ - (renamedSetupOption ["dir"] ["dir"]) + ( + mkRemovedOptionModule ["vim" "notes" "obsidian" "dir"] + '' + `obsidian.nvim` has migrated to the `setupOpts.workspaces` option to support multiple vaults with a single interface. + + To continue using a single vault, set: + + ```nix + { + notes.obsidian.setupOpts.workspaces = [ + { + name = "any-string"; + path = "~/old/dir/path/value"; + } + ]; + } + ``` + + See the [wiki](https://github.com/obsidian-nvim/obsidian.nvim/wiki/Workspace#vault-based-workspaces) for more information. + '' + ) (renamedSetupOption ["daily-notes" "folder"] ["daily_notes" "folder"]) (renamedSetupOption ["daily-notes" "date-format"] ["daily_notes" "date_format"]) (renamedSetupOption ["completion"] ["completion"]) ]; + options.vim.notes = { obsidian = { - enable = mkEnableOption "complementary neovim plugins for Obsidian editor"; + enable = + mkEnableOption "" + // { + description = '' + Whether to enable plugins to complement the Obsidian markdown editor [obsidian.nvim]. - setupOpts = mkPluginSetupOption "Obsidian.nvim" { - daily_notes = { - folder = mkOption { - type = nullOr str; - default = null; - description = "Directory in which daily notes should be created"; - }; - date_format = mkOption { - type = nullOr str; - default = null; - description = "Date format used for creating daily notes"; - }; + Enables [vim-markdown] which automatically folds markdown headings inside and outside of workspaces/vaults. + Set {option}`vim.globals.vim_markdown_folding_disable = 1;` to disable automatic folding, + or {option}`vim.globals.vim_markdown_folding_level = ;` to set the default fold level for new buffers. + + nvf will choose one of `snacks.picker`, `mini.pick`, `telescope`, or `fzf-lua` as the `obsidian.nvim` picker based on whether they are enabled, in that order. + + You can enable one of them with one of the following: + + - {option}`vim.utility.snacks-nvim.setupOpts.picker.enabled` and {option}`vim.utility.snacks-nvim.enable` + - {option}`vim.mini.pick.enable` + - {option}`vim.telescope.enable` + - {option}`vim.fzf-lua.enable` + + {option}`vim.notes.obsidian.setupOpts.ui.enable` is automatically disabled if `render-markdown.nvim` or `markview.nvim` are enabled. + + [vim-markdown]: https://github.com/preservim/vim-markdown?tab=readme-ov-file#options + ''; }; - completion = { - nvim_cmp = mkOption { - # If using nvim-cmp, otherwise set to false - type = bool; - description = "If using nvim-cmp, otherwise set to false"; - default = autocompleteCfg.nvim-cmp.enable || autocompleteCfg.blink-cmp.enable; - }; - }; - }; + setupOpts = mkPluginSetupOption "obsidian.nvim" {}; }; }; }