![Daniel Gorin](/assets/img/avatar_default.png)
The previous implementation of plugin-support for the kakoune derivation was based on generating, at build time, a `plugins.kak` file that would source all .kak files in the list of plugins, and wrap the `kak` binary in a script that would add some command-line arguments so that this file gets loaded on start-up. The main problem with this approach is that the plugins' code get executed *after* the user's configuration file is loaded, so effectively one cannot automatically activate/configure these plugins. The idiomatic way of loading plugins is ensuring they end up installed somwhere under `share/kak/autoload`. Because plugins are already being packaged to have their code in `share/kak/autoload/plugins/<name-of-plugin>`, we can obtain a derivation that includes the plugins simply by doing a `symlinkJoin` of `kakoune-unwrapped` and all the requested plugins. For this to work, we need to fix two issues: 1. By default, kakoune makes `share/kak/autoload` a symbolic link to `share/kak/rc`, which contains all builtin definitions. We need to patch this to put the symlink under `share/kak/autoload/rc`, so that the join works. 2. By default kakoune expects the `autoload` directory to be in `../share/kak/autoload` relative to the location of the `kak` binary. We need to set the `KAKOUNE_RUNTIME` to point the symlinked share/kak for this to work.
25 lines
743 B
Nix
25 lines
743 B
Nix
{ symlinkJoin, makeWrapper, kakoune, plugins ? [], configure ? {} }:
|
|
|
|
let
|
|
# "plugins" is the preferred way, but some configurations may be
|
|
# using "configure.plugins", so accept both
|
|
requestedPlugins = plugins ++ (configure.plugins or []);
|
|
|
|
in
|
|
symlinkJoin {
|
|
name = "kakoune-${kakoune.version}";
|
|
|
|
buildInputs = [ makeWrapper ];
|
|
|
|
paths = [ kakoune ] ++ requestedPlugins;
|
|
|
|
postBuild = ''
|
|
# location of kak binary is used to find ../share/kak/autoload,
|
|
# unless explicitly overriden with KAKOUNE_RUNTIME
|
|
rm "$out/bin/kak"
|
|
makeWrapper "${kakoune}/bin/kak" "$out/bin/kak" --set KAKOUNE_RUNTIME "$out/share/kak"
|
|
'';
|
|
|
|
meta = kakoune.meta // { priority = (kakoune.meta.priority or 0) - 1; };
|
|
}
|