diff --git a/configuration.nix b/configuration.nix index 1875eaa..8420bbf 100644 --- a/configuration.nix +++ b/configuration.nix @@ -178,10 +178,14 @@ inputs: let hop.enable = true; leap.enable = true; }; + + images = { + image-nvim.enable = false; + }; }; vim.notes = { - obsidian.enable = false; # FIXME neovim fails to build if obsidian is enabled + obsidian.enable = false; # FIXME: neovim fails to build if obsidian is enabled orgmode.enable = false; mind-nvim.enable = isMaximal; todo-comments.enable = true; diff --git a/flake.lock b/flake.lock index 01f880d..7ad4c53 100644 --- a/flake.lock +++ b/flake.lock @@ -596,6 +596,22 @@ "type": "github" } }, + "image-nvim": { + "flake": false, + "locked": { + "lastModified": 1707861531, + "narHash": "sha256-mh3J3lW2Co2uA7YJzSGum0ZmpJBP0ZzBWUvJLAI9bHw=", + "owner": "3rd", + "repo": "image.nvim", + "rev": "4c6cb5ad93ee93d8d7b7c84e1eb291cee99f0a0e", + "type": "github" + }, + "original": { + "owner": "3rd", + "repo": "image.nvim", + "type": "github" + } + }, "indent-blankline": { "flake": false, "locked": { @@ -1516,6 +1532,7 @@ "highlight-undo": "highlight-undo", "hop-nvim": "hop-nvim", "icon-picker-nvim": "icon-picker-nvim", + "image-nvim": "image-nvim", "indent-blankline": "indent-blankline", "kommentary": "kommentary", "leap-nvim": "leap-nvim", diff --git a/flake.nix b/flake.nix index a1f1797..25bf39e 100644 --- a/flake.nix +++ b/flake.nix @@ -162,6 +162,11 @@ flake = false; }; + image-nvim = { + url = "github:3rd/image.nvim"; + flake = false; + }; + # Tidal cycles tidalcycles = { url = "github:mitchmindtree/tidalcycles.nix"; diff --git a/lib/default.nix b/lib/default.nix index 0e0b73f..94db90b 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -5,5 +5,5 @@ dag = import ./dag.nix {inherit lib;}; languages = import ./languages.nix {inherit lib;}; lua = import ./lua.nix {inherit lib;}; - vim = import ./vim.nix {inherit lib;}; + vim = import ./vim.nix; } diff --git a/lib/types/plugins.nix b/lib/types/plugins.nix index f20a914..4db7542 100644 --- a/lib/types/plugins.nix +++ b/lib/types/plugins.nix @@ -98,6 +98,7 @@ with lib; let "vim-dirtytalk" "highlight-undo" "nvim-docs-view" + "image-nvim" ]; # You can either use the name of the plugin or a package. pluginType = with types; @@ -116,11 +117,13 @@ with lib; let type = pluginType; description = "Plugin Package."; }; + after = mkOption { type = listOf str; default = []; description = "Setup this plugin after the following ones."; }; + setup = mkOption { type = lines; default = ""; diff --git a/modules/utility/default.nix b/modules/utility/default.nix index 1fbd60a..a5a8892 100644 --- a/modules/utility/default.nix +++ b/modules/utility/default.nix @@ -1,11 +1,12 @@ -_: { +{ imports = [ ./binds + ./ccc ./gestures ./motion ./telescope - ./ccc ./icon-picker + ./images ./telescope ./diffview ./wakatime diff --git a/modules/utility/images/default.nix b/modules/utility/images/default.nix new file mode 100644 index 0000000..5b876e0 --- /dev/null +++ b/modules/utility/images/default.nix @@ -0,0 +1,5 @@ +{ + imports = [ + ./image-nvim + ]; +} diff --git a/modules/utility/images/image-nvim/config.nix b/modules/utility/images/image-nvim/config.nix new file mode 100644 index 0000000..49ca3e5 --- /dev/null +++ b/modules/utility/images/image-nvim/config.nix @@ -0,0 +1,37 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.modules) mkIf; + inherit (lib.nvim.dag) entryAnywhere; + inherit (lib.nvim.lua) toLuaObject; + + cfg = config.vim.utility.images.image-nvim; +in { + config = mkIf cfg.enable { + assertions = [ + { + assertion = pkgs.stdenv.isDarwin && cfg.setupOpts.backend != "ueberzug"; + message = "image-nvim: ueberzug backend is broken on ${pkgs.stdenv.hostPlatform.system}. if you are using kitty, please set `vim.utility.images.image-nvim.setupOpts.backend` option to `kitty` in your configuration, otherwise disable this module."; + } + ]; + + vim = { + startPlugins = [ + "image-nvim" + ]; + + luaPackages = [ + "magick" + ]; + + luaConfigRC.image-nvim = entryAnywhere '' + require("image").setup( + ${toLuaObject cfg.setupOpts} + ) + ''; + }; + }; +} diff --git a/modules/utility/images/image-nvim/default.nix b/modules/utility/images/image-nvim/default.nix new file mode 100644 index 0000000..f3cc02e --- /dev/null +++ b/modules/utility/images/image-nvim/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./config.nix + ./image-nvim.nix + ]; +} diff --git a/modules/utility/images/image-nvim/image-nvim.nix b/modules/utility/images/image-nvim/image-nvim.nix new file mode 100644 index 0000000..6433e50 --- /dev/null +++ b/modules/utility/images/image-nvim/image-nvim.nix @@ -0,0 +1,118 @@ +{ + config, + lib, + ... +}: let + inherit (lib.options) mkEnableOption mkOption; + + inherit (lib.types) enum listOf str nullOr int; + inherit (lib.nvim.types) mkPluginSetupOption; +in { + options.vim.utility.images.image-nvim = { + enable = mkEnableOption "image support in Neovim [image.nvim]"; + + setupOpts = mkPluginSetupOption "image.nvim" { + backend = mkOption { + type = enum ["kitty" "ueberzug"]; + default = "ueberzug"; + description = '' + The backend to use for rendering images. + + - kitty - best in class, works great and is very snappy + - ueberzug - backed by ueberzugpp, supports any terminal, + but has lower performance + ''; + }; + + integrations = { + markdown = { + enable = mkEnableOption " image.nvim in markdown files" // {default = true;}; + clearInInsertMode = mkEnableOption "clearing of images when entering insert mode"; + downloadRemoteImages = mkEnableOption "downloading remote images"; + onlyRenderAtCursor = mkEnableOption "only rendering images at cursor"; + filetypes = mkOption { + type = listOf str; + default = ["markdown" "vimwiki"]; + description = '' + Filetypes to enable image.nvim in. Markdown extensions + (i.e. quarto) can go here + ''; + }; + }; + + neorg = { + enable = mkEnableOption "image.nvim in Neorg files" // {default = true;}; + clearInInsertMode = mkEnableOption "clearing of images when entering insert mode"; + downloadRemoteImages = mkEnableOption "downloading remote images"; + onlyRenderAtCursor = mkEnableOption "only rendering images at cursor"; + filetypes = mkOption { + type = listOf str; + default = ["neorg"]; + description = '' + Filetypes to enable image.nvim in. + ''; + }; + }; + + maxWidth = mkOption { + type = nullOr int; + default = null; + description = '' + The maximum width of images to render. Images larger than + this will be scaled down to fit within this width. + ''; + }; + }; + + maxHeight = mkOption { + type = nullOr int; + default = null; + description = '' + The maximum height of images to render. Images larger than + this will be scaled down to fit within this height. + ''; + }; + + maxWidthWindowPercentage = mkOption { + type = nullOr int; + default = null; + description = '' + The maximum width of images to render as a percentage of the + window width. Images larger than this will be scaled down to + fit within this width. + ''; + }; + + maxHeightWindowPercentage = mkOption { + type = nullOr int; + default = 50; + description = '' + The maximum height of images to render as a percentage of the + window height. Images larger than this will be scaled down to + fit within this height. + ''; + }; + + windowOverlapClear = { + enable = mkEnableOption "clearing of images when they overlap with the window"; + ftIgnore = mkOption { + type = listOf str; + default = ["cmp_menu" "cmp_docs" ""]; + description = '' + Filetypes to ignore window overlap clearing in. + ''; + }; + }; + + editorOnlyRenderWhenFocused = mkEnableOption "only rendering images when the editor is focused"; + hijackFilePatterns = mkOption { + type = listOf str; + default = ["*.png" "*.jpg" "*.jpeg" "*.gif" "*.webp"]; + description = '' + File patterns to hijack for image.nvim. This is useful for + filetypes that don't have a dedicated integration. + ''; + }; + }; + }; +}