{ pkgs, lib, config, nixvimLib, ... }: let nv = nixvimLib.nixvim; in { config = { programs = { # https://www.reddit.com/r/neovim/comments/mbj8m5/how_to_setup_ctrlshiftkey_mappings_in_neovim_and/ alacritty.settings.keyboard.bindings = [ { key = "H"; mods = "Control|Shift"; chars = "\\u001b[72;5u"; } { key = "L"; mods = "Control|Shift"; chars = "\\u001b[76;5u"; } ] ++ (map (n: { key = "Key${builtins.toString n}"; mods = "Control"; chars = "\\u001b[${builtins.toString (48 + n)};5u"; }) (lib.lists.range 0 9)); # Ctrl+ doesn't get interpreted, but Ctrl+Shift+ does, so let's use that nixvim = { autoCmd = [ # Turn off relativenumber only for insert mode { event = "InsertEnter"; pattern = "*"; command = "set norelativenumber"; } { event = "InsertLeave"; pattern = "*"; command = "set relativenumber"; } ]; extraPlugins = with pkgs.vimPlugins; [ nvim-scrollview # Scroll bar ]; keymaps = let options = { silent = true; }; in [ # barbar { key = "gb"; action = "BufferPick"; inherit options; } { key = ""; action = "BufferPrevious"; inherit options; } { key = ""; action = "BufferNext"; inherit options; } { key = ""; action = "BufferMovePrevious"; inherit options; } { key = ""; action = "BufferMoveNext"; inherit options; } { key = ""; action = "BufferLast"; inherit options; } ] ++ (map (n: { key = ""; action = "BufferGoto ${builtins.toString n}"; inherit options; }) (lib.lists.range 1 9)); opts = { showmode = false; number = true; relativenumber = true; title = true; }; plugins = { # Tabline barbar.enable = true; # TODO Reload make it use the preset colorscheme # Status line lualine = with config.lib.stylix.colors.withHashtag; let normal = { fg = base05; bg = base01; }; inverted = { fg = base00; bg = base03; }; normal_ina = { fg = base02; bg = base01; }; inverted_ina = { fg = base00; bg = base02; }; in { enable = true; settings = rec { inactive_sections = sections; sections = { lualine_a = [ (nv.listToUnkeyedAttrs [ "string.format('%d', vim.fn.line('$'))" ]) ]; lualine_b = [ "mode" ]; lualine_c = [ ( (nv.listToUnkeyedAttrs [ "filename" ]) // { color = nv.mkRaw '' function(section) return { fg = vim.bo.modified and '${base08}' or '${normal.fg}' } end ''; path = 1; # Relative path symbols = { modified = "●"; newfile = "󰻭"; readonly = "󰏯"; unnamed = "󱀶"; }; } ) "location" ]; lualine_x = [ ( (nv.listToUnkeyedAttrs [ ''(next(vim.lsp.buf_get_clients()) == nil) and "󰒲 " or ""'' ]) // { separator = { left = ""; right = ""; }; } ) ] ++ (lib.mapAttrsToList ( diag_name: diag_color: ( (nv.listToUnkeyedAttrs [ "diagnostics" ]) // { color.bg = diag_color; colored = false; separator = { left = ""; right = ""; }; sections = [ diag_name ]; } ) ) { error = base08; warn = base0A; hint = base0C; info = base0B; } ); lualine_y = [ ( (nv.listToUnkeyedAttrs [ "diff" ]) // { diff_color = { added.fg = base0B; modified.fg = base0A; removed.fg = base08; }; symbols = { added = " "; modified = " "; removed = " "; }; } ) "branch" ]; lualine_z = [ "filetype" "fileformat" "encoding" ]; }; options.theme = (lib.mapAttrs (mode_name: mode_color: { a = inverted; b = inverted // { bg = mode_color; gui = "bold"; }; c = normal; x = inverted; y = normal; z = inverted // { bg = mode_color; }; }) { normal = base0D; insert = base0B; visual = base0F; replace = base08; command = base0E; } ) // { inactive = { a = inverted_ina; b = normal_ina // { bg = base00; gui = "bold"; }; c = normal_ina; x = inverted_ina; y = normal_ina; z = normal_ina // { bg = base00; }; }; }; }; }; # Show context on top if scrolled out treesitter-context = { enable = true; settings.max_lines = 5; }; web-devicons.enable = true; # TODO Check out plugins.mini.enable }; }; }; }; }