1

Update nixvim to lazy.nvim migration

This commit is contained in:
2024-06-02 03:29:03 +02:00
parent ba7c43b67d
commit 5ee3e766ce
6 changed files with 1122 additions and 1430 deletions

View File

@ -468,12 +468,8 @@ rec {
# p.matplotlib # p.matplotlib
# p.pillow # for ranger # p.pillow # for ranger
# p.pygments # for emacs # p.pygments # for emacs
# flake8 # Linter
# For nvim CHADtree # black
pyyaml
std2
pynvim
pynvim-pp
])) ]))
jetbrains.clion jetbrains.clion
jetbrains.rust-rover jetbrains.rust-rover

View File

@ -25,51 +25,74 @@ in {
[ [
(pkgs.ripgrep.override {withPCRE2 = true;}) (pkgs.ripgrep.override {withPCRE2 = true;})
# Dependencies
lua51Packages.lua-curl # For rest
lua51Packages.xml2lua # For rest
lua51Packages.mimetypes # For rest
lua51Packages.jsregexp # For tree-sitter
# Language servers
clang-tools_18
clojure-lsp
cmake-language-server
haskell-language-server
lua-language-server
nil
pyright
rust-analyzer
texlab
# Linters # Linters
clippy # rust
checkstyle # java checkstyle # java
clippy # rust
clj-kondo # clojure clj-kondo # clojure
eslint_d # javascript eslint_d # javascript
python312Packages.flake8 python311Packages.flake8
lua51Packages.luacheck
vale # text vale # text
statix # nix statix # nix
# Formatters # Formatters
alejandra # nix alejandra # nix
python311Packages.black
google-java-format google-java-format
html-tidy html-tidy
jq # json jq # json
prettierd # html/css/js prettierd # html/css/js
# rustfmt rustfmt
# clang-tools stylua
] ]
]; ];
# NOTE: Use nixvim.extraConfigLua configuration home.file.".config/neovide/config.toml".text = ''
# home.file.".config/neovide/config.toml".text = '' fork = true # Start neovide detached
# [font] frame = "none" # full, buttonless, none
# normal = ["JetBrainsMono Nerd Font Mono"] # Will use the bundled Fira Code Nerd Font by default idle = true # Don't render frames without changes
# size = 13.0 # maximized = true
# title-hidden = true
# fork = true
# frame = "full" # full, buttonless, none
# idle = true
# maximized = false
# # neovim-bin = "/usr/bin/nvim" # in reality found dynamically on $PATH if unset
# no-multigrid = false
# srgb = false
# tabs = true
# theme = "light"
# title-hidden = true
# vsync = true # vsync = true
# wsl = false '';
# '';
home.file.".config/vale/.vale.ini".text = ''
# Core settings appear at the top
# (the "global" section).
[formats]
# Format associations appear under
# the optional "formats" section.
[*]
# Format-specific settings appear
# under a user-provided "glob"
# pattern.
'';
programs.nixvim = { programs.nixvim = {
enable = true; enable = true;
defaultEditor = true; defaultEditor = true;
enableMan = true; enableMan = true;
# colorschemes.catppuccin.enable = true; # NOTE: Managed using Lazy luaLoader.enable = true; # NOTE: Experimental
# colorschemes.catppuccin.enable = true; # Managed using Lazy
viAlias = cfg.alias; viAlias = cfg.alias;
vimAlias = cfg.alias; vimAlias = cfg.alias;
@ -139,58 +162,11 @@ in {
splitright = true; splitright = true;
}; };
extraConfigLuaPost = '' extraConfigLuaPost = builtins.readFile ./extraConfigLuaPost.lua;
local opt = vim.opt
local g = vim.g
local o = vim.o
-- Neovide extraConfigLua = builtins.readFile ./extraConfigLua.lua;
if g.neovide then
-- require("notify").notify("Running in NeoVide")
g.neovide_cursor_animate_command_line = true extraLuaPackages = with pkgs.lua51Packages; [];
g.neovide_cursor_animate_in_insert_mode = true
g.neovide_fullscreen = false
g.neovide_hide_mouse_when_typing = false
g.neovide_padding_top = 0
g.neovide_padding_bottom = 0
g.neovide_padding_right = 0
g.neovide_padding_left = 0
g.neovide_refresh_rate = 144
g.neovide_theme = 'light'
-- Neovide Fonts
o.guifont = "JetBrainsMono Nerd Font:h13:Medium"
else
-- require("notify").notify("Not running in NeoVide")
end
'';
extraConfigLua = ''
-- Hide inline diagnostics and show border
vim.diagnostic.config({
virtual_text = false,
float = { border = "rounded" }
})
-- Allow navigating popupmenu completion with Up/Down
vim.api.nvim_set_keymap('c', '<Down>', 'v:lua.get_wildmenu_key("<right>", "<down>")', { expr = true })
vim.api.nvim_set_keymap('c', '<Up>', 'v:lua.get_wildmenu_key("<left>", "<up>")', { expr = true })
function _G.get_wildmenu_key(key_wildmenu, key_regular)
return vim.fn.wildmenumode() ~= 0 and key_wildmenu or key_regular
end
'';
extraLuaPackages = with pkgs.lua51Packages; [
# TODO: Doesn't work
# For rest
# lua-curl
# xml2lua
# mimetypes
jsregexp # For tree-sitter
];
extraPython3Packages = p: [ extraPython3Packages = p: [
# For CHADtree # For CHADtree
@ -205,6 +181,10 @@ in {
# pattern = "*"; # pattern = "*";
callback = {__raw = "function() require('lint').try_lint() end";}; callback = {__raw = "function() require('lint').try_lint() end";};
} }
{
event = ["BufWritePre"];
callback = {__raw = "function() require('conform').format() end";};
}
]; ];
# TODO: Toggle wrapping # TODO: Toggle wrapping
@ -212,16 +192,15 @@ in {
# TODO: Toggle format on paste # TODO: Toggle format on paste
keymaps = import ./keybinds.nix {inherit lib mylib;}; keymaps = import ./keybinds.nix {inherit lib mylib;};
##################################################################################################################################
# Lazy Plugins #
##################################################################################################################################
plugins.lazy = { plugins.lazy = {
enable = true; enable = true;
# TODO: Would be nicer if large dependencies could be referenced by name plugins = builtins.concatLists [
plugins = [ (import ./interface.nix {inherit lib mylib pkgs;})
(import ./languages.nix {inherit lib mylib pkgs;})
[
# #
# Not available in NixVim # Theme
# #
{ {
@ -249,9 +228,49 @@ in {
} }
{ {
name = "lspconfig"; name = "web-devicons";
pkg = pkgs.vimPlugins.nvim-lspconfig; pkg = pkgs.vimPlugins.nvim-web-devicons;
dependencies = [ lazy = false;
config = ''
function(_, opts)
require("nvim-web-devicons").setup(opts)
end
'';
}
#
# Plugins
#
{
name = "better-escape";
pkg = pkgs.vimPlugins.better-escape-nvim;
lazy = false;
config = ''
function(_, opts)
require("better_escape").setup(opts)
end
'';
opts = {
mapping = ["jk"];
timeout = 200; # In ms
};
}
{
name = "chadtree";
pkg = pkgs.vimPlugins.chadtree;
config = ''
function(_, opts)
vim.api.nvim_set_var("chadtree_settings", opts)
end
'';
opts = {
theme.text_colour_set = "nerdtree_syntax_dark";
xdg = true;
};
}
{ {
name = "cmp"; name = "cmp";
pkg = pkgs.vimPlugins.nvim-cmp; pkg = pkgs.vimPlugins.nvim-cmp;
@ -369,135 +388,6 @@ in {
''; '';
}; };
} }
{
name = "illuminate";
pkg = pkgs.vimPlugins.vim-illuminate;
lazy = false;
config = ''
function(_, opts)
require("illuminate").configure(opts)
end
'';
opts = {
filetypesDenylist = [
"DressingSelect"
"Outline"
"TelescopePrompt"
"alpha"
"harpoon"
"toggleterm"
"neo-tree"
"Spectre"
"reason"
];
};
}
# {
# name = "inc-rename";
# pkg = pkgs.vimPlugins.inc-rename-nvim;
# config = ''
# function(_, opts)
# require("inc_rename").setup(opts)
# end
# '';
# }
];
lazy = false;
config = let
servers = mylib.generators.toLuaObject [
{name = "cmake";}
{name = "clojure_lsp";}
{name = "clangd";}
{name = "texlab";}
{name = "rust_analyzer";}
{name = "pyright";}
{name = "nil_ls";}
{
name = "hls";
cmd = [
"haskell-language-server-wrapper"
"--lsp"
];
}
];
in ''
function(_, opts)
local __lspOnAttach = function(client, bufnr) end
local __lspCapabilities = function()
capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities = vim.tbl_deep_extend("force", capabilities, require("cmp_nvim_lsp").default_capabilities())
return capabilities
end
local __setup = {
on_attach = __lspOnAttach,
capabilities = __lspCapabilities(),
}
for i, server in ipairs(${servers}) do
if type(server) == "string" then
require("lspconfig")[server].setup(__setup)
else
local options = server.extraOptions
if options == nil then
options = __setup
else
options = vim.tbl_extend("keep", options, __setup)
end
require("lspconfig")[server.name].setup(options)
end
end
end
'';
}
{
name = "web-devicons";
pkg = pkgs.vimPlugins.nvim-web-devicons;
lazy = false;
config = ''
function(_, opts)
require("nvim-web-devicons").setup(opts)
end
'';
}
#
# Also available in NixVim
#
{
name = "better-escape";
pkg = pkgs.vimPlugins.better-escape-nvim;
lazy = false;
config = ''
function(_, opts)
require("better_escape").setup(opts)
end
'';
opts = {
mapping = ["jk"];
timeout = 200; # In ms
};
}
{
name = "chadtree";
pkg = pkgs.vimPlugins.chadtree;
config = ''
function(_, opts)
vim.api.nvim_set_var("chadtree_settings", opts)
end
'';
opts = {
theme.text_colour_set = "nerdtree_syntax_dark";
xdg = true;
};
}
{ {
name = "comment"; name = "comment";
@ -533,32 +423,6 @@ in {
}; };
} }
{
name = "conform";
pkg = pkgs.vimPlugins.conform-nvim;
config = ''
function(_, opts)
require("conform").setup(opts)
end
'';
opts = {
formatters_by_ft = {
c = ["clang-format"];
h = ["clang-format"];
cpp = ["clang-format"];
hpp = ["clang-format"];
css = [["prettierd" "prettier"]];
html = [["prettierd" "prettier"]];
java = ["google-java-format"];
javascript = [["prettierd" "prettier"]];
markdown = [["prettierd" "prettier"]];
nix = ["alejandra"];
python = ["black"];
rust = ["rustfmt"];
};
};
}
# TODO: Config # TODO: Config
{ {
name = "flash"; name = "flash";
@ -603,13 +467,27 @@ in {
} }
{ {
name = "headlines"; name = "illuminate";
pkg = pkgs.vimPlugins.headlines-nvim; pkg = pkgs.vimPlugins.vim-illuminate;
lazy = false;
config = '' config = ''
function(_, opts) function(_, opts)
require("headlines").setup(opts) require("illuminate").configure(opts)
end end
''; '';
opts = {
filetypesDenylist = [
"DressingSelect"
"Outline"
"TelescopePrompt"
"alpha"
"harpoon"
"toggleterm"
"neo-tree"
"Spectre"
"reason"
];
};
} }
{ {
@ -634,112 +512,6 @@ in {
pkg = pkgs.vimPlugins.lazygit-nvim; pkg = pkgs.vimPlugins.lazygit-nvim;
} }
{
name = "lint";
pkg = pkgs.vimPlugins.nvim-lint;
lazy = false;
config = ''
function(_, opts)
local lint = require("lint")
for k, v in pairs(opts) do
lint[k] = v
end
end
'';
opts = {
linters_by_ft = {
c = ["clang-tidy"];
h = ["clang-tidy"];
cpp = ["clang-tidy"];
hpp = ["clang-tidy"];
clojure = ["clj-kondo"];
java = ["checkstyle"];
javascript = ["eslint_d"];
markdown = ["vale"];
nix = ["statix"];
python = ["flake8"];
rust = ["clippy"];
text = ["vale"];
};
};
}
{
name = "lualine";
pkg = pkgs.vimPlugins.lualine-nvim;
lazy = false;
config = ''
function(_, opts)
require("lualine").setup(opts)
end
'';
opts = {
extensions = ["fzf" "chadtree" "neo-tree" "toggleterm" "trouble"];
options = {
always_divide_middle = true;
globalstatus = true;
ignore_focus = ["neo-tree" "chadtree"];
section_separators = {
left = "";
right = "";
# left = "";
# right = "";
};
component_separators = {
left = "";
right = "";
# left = "";
# right = "";
};
};
sections = {
lualine_a = [
{
name = "mode";
# extraConfig = {
# separator = {
# left = "";
# };
# right_padding = "2";
# };
}
];
lualine_b = ["branch" "diff" "diagnostics"];
lualine_c = [
{
name = "filename";
extraConfig = {
path = 1;
};
}
];
lualine_x = ["filetype" "encoding" "fileformat"];
lualine_y = ["progress" "searchcount" "selectioncount"];
lualine_z = [
{
name = "location";
# extraConfig = {
# separator = {
# right = "";
# };
# left_padding = "2";
# };
}
];
};
tabline = {
lualine_a = ["buffers"];
lualine_z = ["tabs"];
};
};
}
# TODO: Snippet configs # TODO: Snippet configs
{ {
name = "luasnip"; name = "luasnip";
@ -782,91 +554,6 @@ in {
}; };
} }
{
name = "noice";
pkg = pkgs.vimPlugins.noice-nvim;
dependencies = [
{
name = "nui"; # For noice
pkg = pkgs.vimPlugins.nui-nvim;
lazy = false;
}
];
lazy = false;
config = ''
function(_, opts)
require("noice").setup(opts)
end
'';
opts = {
presets = {
bottom_search = false;
command_palette = true;
long_message_to_split = true;
inc_rename = true;
lsp_doc_border = true;
};
lsp = {
documentation = {
opts = {
lang = "markdown";
replace = true;
render = "plain";
border = "rounded"; # single or rounded
format = ["{message}"];
win_options = {
concealcursor = "n";
conceallevel = 3;
};
};
view = "hover";
};
override = {
"vim.lsp.util.convert_input_to_markdown_lines" = true;
"vim.lsp.util.stylize_markdown" = true;
"cmp.entry.get_documentation" = true;
};
};
notify = {
enabled = true;
};
popupmenu = {
enabled = true;
backend = "nui"; # cmp completion is broken
};
# cmdline.enabled = false;
# messages.enabled = false;
routes = [
# Hide inline search count info
{
filter = {
event = "msg_show";
kind = "search_count";
};
opts = {skip = true;};
}
];
};
}
{
name = "notify";
pkg = pkgs.vimPlugins.nvim-notify;
lazy = false;
config = ''
function(_, opts)
vim.notify = require("notify")
require("notify").setup(opts)
end
'';
}
{ {
name = "autopairs"; name = "autopairs";
pkg = pkgs.vimPlugins.nvim-autopairs; pkg = pkgs.vimPlugins.nvim-autopairs;
@ -928,55 +615,6 @@ in {
lazy = false; lazy = false;
} }
{
name = "telescope";
pkg = pkgs.vimPlugins.telescope-nvim;
dependencies = [
{
name = "plenary"; # For telescope
pkg = pkgs.vimPlugins.plenary-nvim;
}
{
name = "telescope-undo";
pkg = pkgs.vimPlugins.telescope-undo-nvim;
}
{
name = "telescope-ui-select";
pkg = pkgs.vimPlugins.telescope-ui-select-nvim;
}
{
name = "telescope-fzf-native";
pkg = pkgs.vimPlugins.telescope-fzf-native-nvim;
}
];
lazy = false;
config = let
extensions = mylib.generators.toLuaObject [
"undo"
"ui-select"
"fzf"
];
in ''
function(_, opts)
local telescope = require("telescope")
telescope.setup(opts)
for i, extension in ipairs(${extensions}) do
telescope.load_extension(extension)
end
end
'';
opts = {
defaults = {
mappings = {
i = {
"<Esc>" = {__raw = ''function(...) return require("telescope.actions").close(...) end'';};
};
};
};
};
}
{ {
name = "toggleterm"; name = "toggleterm";
pkg = pkgs.vimPlugins.toggleterm-nvim; pkg = pkgs.vimPlugins.toggleterm-nvim;
@ -1007,32 +645,6 @@ in {
}; };
} }
{
name = "treesitter";
pkg = pkgs.vimPlugins.nvim-treesitter.withAllGrammars;
lazy = false;
config = ''
function(_, opts)
require("nvim-treesitter.configs").setup(opts)
end
'';
opts = {
highlight.enable = true;
indent.enable = true;
# TODO: Doesn't work
incremental_selection = {
enable = true;
keymaps = {
"init_selection" = "gnn";
"node_decremental" = "grm";
"node_incremental" = "grn";
"scope_incremental" = "grc";
};
};
};
}
{ {
name = "trim"; name = "trim";
pkg = pkgs.vimPlugins.trim-nvim; pkg = pkgs.vimPlugins.trim-nvim;
@ -1059,18 +671,6 @@ in {
pkg = pkgs.vimPlugins.vim-bbye; pkg = pkgs.vimPlugins.vim-bbye;
} }
{
name = "which-key";
pkg = pkgs.vimPlugins.which-key-nvim;
lazy = false;
priority = 100;
config = ''
function(_, opts)
require("which-key").setup(opts)
end
'';
}
{ {
name = "yanky"; # TODO: Bindings name = "yanky"; # TODO: Bindings
pkg = pkgs.vimPlugins.yanky-nvim; pkg = pkgs.vimPlugins.yanky-nvim;
@ -1081,17 +681,11 @@ in {
end end
''; '';
} }
]
]; ];
}; };
################################################################################################################################## # NixVim plugins
# NixVim Plugins #
##################################################################################################################################
# TODO
# clangd-extensions = {
# enable = true;
# };
# TODO: Figure out how debugging from nvim works... # TODO: Figure out how debugging from nvim works...
# Debug-Adapter-Protocol # Debug-Adapter-Protocol

View File

@ -1,12 +1,12 @@
-- Hide inline diagnostics and show border -- Hide inline diagnostics and show border
vim.diagnostic.config({ vim.diagnostic.config({
virtual_text = false, virtual_text = false,
float = { border = "rounded" } float = { border = "rounded" },
}) })
-- Allow navigating popupmenu completion with Up/Down -- Allow navigating popupmenu completion with Up/Down
vim.api.nvim_set_keymap('c', '<Down>', 'v:lua.get_wildmenu_key("<right>", "<down>")', { expr = true }) vim.api.nvim_set_keymap("c", "<Down>", 'v:lua.get_wildmenu_key("<right>", "<down>")', { expr = true })
vim.api.nvim_set_keymap('c', '<Up>', 'v:lua.get_wildmenu_key("<left>", "<up>")', { expr = true }) vim.api.nvim_set_keymap("c", "<Up>", 'v:lua.get_wildmenu_key("<left>", "<up>")', { expr = true })
function _G.get_wildmenu_key(key_wildmenu, key_regular) function _G.get_wildmenu_key(key_wildmenu, key_regular)
return vim.fn.wildmenumode() ~= 0 and key_wildmenu or key_regular return vim.fn.wildmenumode() ~= 0 and key_wildmenu or key_regular

View File

@ -8,14 +8,14 @@ if g.neovide then
g.neovide_cursor_animate_command_line = true g.neovide_cursor_animate_command_line = true
g.neovide_cursor_animate_in_insert_mode = true g.neovide_cursor_animate_in_insert_mode = true
g.neovide_fullscreen = false -- g.neovide_fullscreen = false
g.neovide_hide_mouse_when_typing = false g.neovide_hide_mouse_when_typing = true
g.neovide_padding_top = 0 g.neovide_padding_top = 0
g.neovide_padding_bottom = 0 g.neovide_padding_bottom = 0
g.neovide_padding_right = 0 g.neovide_padding_right = 0
g.neovide_padding_left = 0 g.neovide_padding_left = 0
g.neovide_refresh_rate = 144 g.neovide_refresh_rate = 144
g.neovide_theme = 'light' -- g.neovide_theme = "light"
-- Neovide Fonts -- Neovide Fonts
o.guifont = "JetBrainsMono Nerd Font:h13:Medium" o.guifont = "JetBrainsMono Nerd Font:h13:Medium"

View File

@ -3,7 +3,6 @@
mylib, mylib,
... ...
}: [ }: [
[
# No Leader # No Leader
{ {
mode = "n"; mode = "n";
@ -224,6 +223,13 @@
options.desc = "Show help tags"; options.desc = "Show help tags";
} }
# Quit <leader>q
{
mode = "n";
key = "<leader>q";
action = "+quit";
}
# Buffers <leader>b # Buffers <leader>b
{ {
mode = "n"; mode = "n";
@ -485,4 +491,3 @@
options.desc = "Show LSP line diagnostics"; options.desc = "Show LSP line diagnostics";
} }
] ]
]

View File

@ -4,6 +4,16 @@
pkgs, pkgs,
... ...
}: [ }: [
{
name = "clangd-extensions";
pkg = pkgs.vimPlugins.clangd_extensions-nvim;
config = ''
function(_, opts)
require("clangd_extensions").setup(opts)
end
'';
}
{ {
name = "conform"; name = "conform";
pkg = pkgs.vimPlugins.conform-nvim; pkg = pkgs.vimPlugins.conform-nvim;
@ -31,6 +41,12 @@
}; };
} }
{
name = "haskell-tools";
pkg = pkgs.vimPlugins.haskell-tools-nvim;
# Don't call setup!
}
{ {
name = "lint"; name = "lint";
pkg = pkgs.vimPlugins.nvim-lint; pkg = pkgs.vimPlugins.nvim-lint;
@ -66,25 +82,29 @@
{ {
name = "lspconfig"; name = "lspconfig";
pkg = pkgs.vimPlugins.nvim-lspconfig; pkg = pkgs.vimPlugins.nvim-lspconfig;
dependencies = [
{
name = "neodev";
pkg = pkgs.vimPlugins.neodev-nvim;
config = ''
function(_, opts)
require("neodev").setup(opts)
end
'';
}
];
lazy = false; lazy = false;
config = let config = let
servers = mylib.generators.toLuaObject [ servers = mylib.generators.toLuaObject [
{name = "clangd";} {name = "clangd";}
{name = "clojure_lsp";} {name = "clojure_lsp";}
{name = "cmake";} {name = "cmake";}
{name = "lua-ls";} {name = "lua_ls";}
{name = "nil_ls";} {name = "nil_ls";}
{name = "pyright";} {name = "pyright";}
{name = "rust_analyzer";} # {name = "rust_analyzer";} # Don't set up when using rustaceanvim
{name = "texlab";} {name = "texlab";}
# {name = "hls";} # Don't set up when using haskell-tools
{
name = "hls";
cmd = [
"haskell-language-server-wrapper"
"--lsp"
];
}
]; ];
in '' in ''
function(_, opts) function(_, opts)
@ -121,17 +141,94 @@
} }
{ {
name = "rustaceanvim";
pkg = pkgs.vimPlugins.rustaceanvim;
# Don't call setup!
}
(let
nvim-plugintree = pkgs.vimPlugins.nvim-treesitter.withPlugins (
p:
with p; [
bash
bibtex
c
clojure
cmake
cpp
csv
disassembly
dockerfile
dot
doxygen
fish
gitignore
haskell
haskell_persistent
html
ini
java
javascript
json
julia
kotlin
lua
make
markdown
markdown_inline
nasm
nix
objdump
org
passwd
perl
printf
python
r
regex
requirements
ruby
rust
scala
scss
sql
toml
typescript
verilog
xml
yaml
]
);
treesitter-parsers = pkgs.symlinkJoin {
name = "treesitter-parsers";
paths = nvim-plugintree.dependencies;
};
in {
name = "treesitter"; name = "treesitter";
pkg = pkgs.vimPlugins.nvim-treesitter.withAllGrammars; pkg = pkgs.vimPlugins.nvim-treesitter;
lazy = false; lazy = false;
config = '' config = ''
function(_, opts) function(_, opts)
vim.opt.runtimepath:append("${nvim-plugintree}")
vim.opt.runtimepath:append("${treesitter-parsers}")
require("nvim-treesitter.configs").setup(opts) require("nvim-treesitter.configs").setup(opts)
end end
''; '';
opts = { opts = {
highlight.enable = true; auto_install = false;
indent.enable = true; ensure_installed = [];
parser_install_dir = "${treesitter-parsers}";
indent = {
enable = true;
# disable = ["python" "yaml"];
};
highlight = {
enable = true;
# disable = ["yaml"];
additional_vim_regex_highlighting = false;
};
# TODO: Doesn't work # TODO: Doesn't work
incremental_selection = { incremental_selection = {
@ -144,5 +241,5 @@
}; };
}; };
}; };
} })
] ]