-
Notifications
You must be signed in to change notification settings - Fork 5
/
api.options.nix
133 lines (115 loc) · 4.23 KB
/
api.options.nix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
{ lib, config, ... }:
with lib;
let
mkMappingOption = description: mkOption {
inherit description;
example = { abc = ":FZF<CR>"; C-p = ":FZF<CR>"; }; # Probably should be overwritten per option basis
default = { };
type = with types; attrsOf (nullOr str);
};
in
{
options = {
vim = mkOption {
default = { };
example = {
vim.opt.termguicolors = true;
vim.opt.clipboard = "unnamed,unnamedplus";
};
description = "Represents 'vim' namespace from neovim lua api.";
type = types.attrs;
};
set = mkOption {
example = {
set.termguicolors = true;
set.clipboard = "unnamed,unnamedplus";
};
default = { };
description = "'vim.opt' alias. Acts same as vimscript 'set' command";
type = with types; attrsOf (oneOf [ bool float int str ]);
};
use = mkOption {
description = ''Allows requiring modules. Gets parset to "require('<name>').<attrs>"'';
type = with types; attrsOf attrs;
default = { };
};
setup = mkOption {
description = ''Results in 'require(<name>).setup(<attrs>)'.'';
type = with types; attrsOf attrs;
default = { };
};
lua = mkOption {
type = types.lines;
default = "";
description = "Lua config";
};
vimscript = mkOption {
type = types.lines;
default = "";
description = "Vimscript config";
};
nnoremap = mkMappingOption "Defines 'Normal mode' mappings";
inoremap = mkMappingOption "Defines 'Insert and Replace mode' mappings";
vnoremap = mkMappingOption "Defines 'Visual and Select mode' mappings";
xnoremap = mkMappingOption "Defines 'Visual mode' mappings";
snoremap = mkMappingOption "Defines 'Select mode' mappings";
cnoremap = mkMappingOption "Defines 'Command-line mode' mappings";
onoremap = mkMappingOption "Defines 'Operator pending mode' mappings";
tnoremap = mkMappingOption "Defines 'Terminal mode' mappings";
nmap = mkMappingOption "Defines 'Normal mode' mappings";
imap = mkMappingOption "Defines 'Insert and Replace mode' mappings";
vmap = mkMappingOption "Defines 'Visual and Select mode' mappings";
xmap = mkMappingOption "Defines 'Visual mode' mappings";
smap = mkMappingOption "Defines 'Select mode' mappings";
cmap = mkMappingOption "Defines 'Command-line mode' mappings";
omap = mkMappingOption "Defines 'Operator pending mode' mappings";
tmap = mkMappingOption "Defines 'Terminal mode' mappings";
};
config =
let
trace = it: builtins.trace (builtins.toJSON it) it;
dsl = import ./dsl.nix { inherit lib; };
filterNonNull = mappings: filterAttrs (name: value: value != null) mappings;
mapping = mode: lhs: rhs: { ... }@args: "map('${mode}', '${lhs}', '${rhs}', ${dsl.nix2lua args})\n";
remap = mode: lhs: rhs: "map('${mode}', '${lhs}', '${rhs}', {})\n";
noremap = mode: lhs: rhs: mapping mode lhs rhs { noremap = true; };
attrsToStr = f: it: concatStringsSep "" (filter (it: it != [ ]) (attrValues (mapAttrs f it)));
aggregateMappings = mapingFunction: { ... }@args: attrsToStr
(mode: bindings:
attrsToStr (lhs: rhs: mapingFunction mode lhs rhs) bindings
)
args;
noremaps = aggregateMappings noremap {
n = config.nnoremap;
i = config.inoremap;
v = config.vnoremap;
x = config.xnoremap;
s = config.snoremap;
c = config.cnoremap;
o = config.onoremap;
t = config.tnoremap;
};
remaps = aggregateMappings remap {
n = config.nmap;
i = config.imap;
v = config.vmap;
x = config.xmap;
s = config.smap;
c = config.cmap;
o = config.omap;
t = config.tmap;
};
require = flatten (mapAttrsToList (name: value: mapAttrsToList (name_inner: value_inner: "require('${name}').${dsl.attrs2Lua {${name_inner} = value_inner; }}") value) config.use);
in
{
vim.opt = config.set;
use = mapAttrs (_: it: { setup = dsl.callWith it; }) config.setup;
lua = ''
${dsl.attrs2Lua { inherit (config) vim; }}
${concatStringsSep "" require}
local map = vim.api.nvim_set_keymap
${noremaps}
${remaps}
'';
};
}