From 96e2f1bdf08add02065d7647d0d87a9d1662d0c1 Mon Sep 17 00:00:00 2001
From: Daniel Gorin <jcpetruzza@gmail.com>
Date: Wed, 24 Jun 2020 10:35:17 +0100
Subject: [PATCH] kakoune: add support for plugins

The kakoune editor has a plugin mechanism and several plugins are
already packaged under `pkgs.kakounePlugins`. However, adding these
packages to `home.packages` is not enough: the `kakoune` package needs
to be configured with the list of plugins to include, so that they get
sourced on start-up.

We add a `programs.kakoune.plugins` option, analogous to
`programs.vim.plugins`.

The change is backwards compatible since `pkgs.kakoune` is defined as

    wrapKakoune kakoune-unwrapped { };

and `wrapKakoune` defaults the list of plugins to empty.

PR #1356
---
 modules/programs/kakoune.nix                   | 17 ++++++++++++++++-
 tests/modules/programs/kakoune/default.nix     |  2 ++
 tests/modules/programs/kakoune/no-plugins.nix  | 13 +++++++++++++
 tests/modules/programs/kakoune/use-plugins.nix | 18 ++++++++++++++++++
 4 files changed, 49 insertions(+), 1 deletion(-)
 create mode 100644 tests/modules/programs/kakoune/no-plugins.nix
 create mode 100644 tests/modules/programs/kakoune/use-plugins.nix

diff --git a/modules/programs/kakoune.nix b/modules/programs/kakoune.nix
index 3c234915..6db311a1 100644
--- a/modules/programs/kakoune.nix
+++ b/modules/programs/kakoune.nix
@@ -489,6 +489,10 @@ let
     };
   };
 
+  kakouneWithPlugins = pkgs.wrapKakoune pkgs.kakoune-unwrapped {
+    configure = { plugins = cfg.plugins; };
+  };
+
   configFile = let
     wrapOptions = with cfg.config.wrapLines;
       concatStrings [
@@ -634,11 +638,22 @@ in {
           <filename>~/.config/kak/kakrc</filename>.
         '';
       };
+
+      plugins = mkOption {
+        type = with types; listOf package;
+        default = [ ];
+        example = literalExample "[ pkgs.kakounePlugins.kak-fzf ]";
+        description = ''
+          List of kakoune plugins to install. To get a list of
+          supported plugins run:
+          <command>nix-env -f '&lt;nixpkgs&gt;' -qaP -A kakounePlugins</command>.
+        '';
+      };
     };
   };
 
   config = mkIf cfg.enable {
-    home.packages = [ pkgs.kakoune ];
+    home.packages = [ kakouneWithPlugins ];
     xdg.configFile."kak/kakrc".source = configFile;
   };
 }
diff --git a/tests/modules/programs/kakoune/default.nix b/tests/modules/programs/kakoune/default.nix
index 9f906a94..1e6e077d 100644
--- a/tests/modules/programs/kakoune/default.nix
+++ b/tests/modules/programs/kakoune/default.nix
@@ -1,4 +1,6 @@
 {
+  kakoune-no-plugins = ./no-plugins.nix;
+  kakoune-use-plugins = ./use-plugins.nix;
   kakoune-whitespace-highlighter = ./whitespace-highlighter.nix;
   kakoune-whitespace-highlighter-corner-cases =
     ./whitespace-highlighter-corner-cases.nix;
diff --git a/tests/modules/programs/kakoune/no-plugins.nix b/tests/modules/programs/kakoune/no-plugins.nix
new file mode 100644
index 00000000..76dea544
--- /dev/null
+++ b/tests/modules/programs/kakoune/no-plugins.nix
@@ -0,0 +1,13 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+{
+  config = {
+    programs.kakoune = { enable = true; };
+
+    nmt.script = ''
+      assertFileNotRegex home-path/share/kak/plugins.kak . # file is empty
+    '';
+  };
+}
diff --git a/tests/modules/programs/kakoune/use-plugins.nix b/tests/modules/programs/kakoune/use-plugins.nix
new file mode 100644
index 00000000..7b23627d
--- /dev/null
+++ b/tests/modules/programs/kakoune/use-plugins.nix
@@ -0,0 +1,18 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+{
+  config = {
+    programs.kakoune = {
+      enable = true;
+      plugins = [ pkgs.kakounePlugins.kak-powerline ];
+    };
+
+    nmt.script = let plugins_kak = "home-path/share/kak/plugins.kak";
+    in ''
+      assertFileRegex ${plugins_kak} \
+        '^source "/nix/store/.*-kak-powerline/share/kak/autoload/plugins/powerline/.*.kak"$'
+    '';
+  };
+}