2023-12-15 14:00:55 +01:00
|
|
|
{
|
|
|
|
lib,
|
|
|
|
helpers,
|
|
|
|
config,
|
|
|
|
pkgs,
|
|
|
|
...
|
|
|
|
}:
|
2024-05-05 19:39:35 +02:00
|
|
|
with lib;
|
|
|
|
let
|
2023-12-15 14:00:55 +01:00
|
|
|
cfg = config.plugins.wtf;
|
|
|
|
|
|
|
|
defaultKeymaps = {
|
|
|
|
ai = {
|
|
|
|
key = "gw";
|
2024-05-05 19:39:35 +02:00
|
|
|
mode = [
|
|
|
|
"n"
|
|
|
|
"x"
|
|
|
|
];
|
2024-02-03 17:42:24 +01:00
|
|
|
action.__raw = "require('wtf').ai";
|
2023-12-15 14:00:55 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
search = {
|
|
|
|
key = "gW";
|
|
|
|
mode = "n";
|
2024-02-03 17:42:24 +01:00
|
|
|
action.__raw = "require('wtf').search";
|
2023-12-15 14:00:55 +01:00
|
|
|
};
|
|
|
|
};
|
2024-05-05 19:39:35 +02:00
|
|
|
in
|
|
|
|
{
|
2023-12-15 14:00:55 +01:00
|
|
|
options = {
|
2024-05-05 19:39:35 +02:00
|
|
|
plugins.wtf = helpers.neovim-plugin.extraOptionsOptions // {
|
|
|
|
enable = mkEnableOption "wtf.nvim";
|
|
|
|
|
2024-05-17 14:09:20 +02:00
|
|
|
package = helpers.mkPluginPackageOption "wtf.nvim" pkgs.vimPlugins.wtf-nvim;
|
2024-05-05 19:39:35 +02:00
|
|
|
|
|
|
|
keymaps = mapAttrs (
|
|
|
|
action: defaults:
|
|
|
|
helpers.mkNullOrOption (
|
|
|
|
with types; either str (helpers.keymaps.mkMapOptionSubmodule defaults)
|
|
|
|
) "Keymap for the ${action} action."
|
|
|
|
) defaultKeymaps;
|
|
|
|
|
|
|
|
popupType =
|
|
|
|
helpers.defaultNullOpts.mkEnum
|
|
|
|
[
|
|
|
|
"popup"
|
|
|
|
"horizontal"
|
|
|
|
"vertical"
|
|
|
|
]
|
|
|
|
"popup"
|
|
|
|
''
|
|
|
|
Default AI popup type.
|
|
|
|
'';
|
|
|
|
|
|
|
|
openaiApiKey = helpers.mkNullOrOption (with types; either str helpers.nixvimTypes.rawLua) ''
|
|
|
|
An alternative way to set your API key.
|
|
|
|
'';
|
|
|
|
|
|
|
|
openaiModelId = helpers.defaultNullOpts.mkStr "gpt-3.5-turbo" "ChatGPT Model.";
|
|
|
|
|
|
|
|
context = helpers.defaultNullOpts.mkBool true "Send code as well as diagnostics.";
|
|
|
|
|
|
|
|
language = helpers.defaultNullOpts.mkStr "english" ''
|
|
|
|
Set your preferred language for the response.
|
|
|
|
'';
|
|
|
|
|
|
|
|
additionalInstructions = helpers.mkNullOrOption types.str "Any additional instructions.";
|
|
|
|
|
|
|
|
searchEngine = helpers.defaultNullOpts.mkEnum [
|
|
|
|
"google"
|
|
|
|
"duck_duck_go"
|
|
|
|
"stack_overflow"
|
|
|
|
"github"
|
|
|
|
] "google" "Default search engine.";
|
|
|
|
|
|
|
|
hooks = {
|
|
|
|
requestStarted = helpers.defaultNullOpts.mkLuaFn "nil" "Callback for request start.";
|
|
|
|
|
|
|
|
requestFinished = helpers.defaultNullOpts.mkLuaFn "nil" "Callback for request finished.";
|
2023-12-15 14:00:55 +01:00
|
|
|
};
|
2024-05-05 19:39:35 +02:00
|
|
|
|
|
|
|
winhighlight = helpers.defaultNullOpts.mkStr "Normal:Normal,FloatBorder:FloatBorder" ''
|
|
|
|
Add custom colours.
|
|
|
|
'';
|
|
|
|
};
|
2023-12-15 14:00:55 +01:00
|
|
|
};
|
|
|
|
|
2024-05-05 19:39:35 +02:00
|
|
|
config =
|
|
|
|
let
|
|
|
|
setupOptions =
|
|
|
|
with cfg;
|
|
|
|
{
|
|
|
|
popup_type = popupType;
|
|
|
|
openai_api_key = openaiApiKey;
|
|
|
|
openai_model_id = openaiModelId;
|
|
|
|
inherit context language;
|
|
|
|
additional_instructions = additionalInstructions;
|
|
|
|
search_engine = searchEngine;
|
|
|
|
hooks = {
|
|
|
|
request_started = hooks.requestStarted;
|
|
|
|
request_finished = hooks.requestFinished;
|
|
|
|
};
|
|
|
|
inherit winhighlight;
|
|
|
|
}
|
|
|
|
// cfg.extraOptions;
|
|
|
|
in
|
2023-12-15 14:00:55 +01:00
|
|
|
mkIf cfg.enable {
|
2024-05-05 19:39:35 +02:00
|
|
|
extraPlugins = [ cfg.package ];
|
2023-12-15 14:00:55 +01:00
|
|
|
|
|
|
|
keymaps = filter (keymap: keymap != null) (
|
2024-05-05 19:39:35 +02:00
|
|
|
mapAttrsToList (
|
|
|
|
action: value: if isString value then defaultKeymaps.${action} // { key = value; } else value
|
|
|
|
) cfg.keymaps
|
2023-12-15 14:00:55 +01:00
|
|
|
);
|
|
|
|
|
|
|
|
extraConfigLua = ''
|
|
|
|
require("wtf").setup(${helpers.toLuaObject setupOptions})
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
}
|