{ pkgs, lib, config, ... }: { 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 = [{ name = ''string.format('%d', vim.fn.line('$'))''; }]; lualine_b = [ "mode" ]; lualine_c = [{ name = "filename"; color = { __raw = '' 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 = [{ name = ''(next(vim.lsp.buf_get_clients()) == nil) and "󰒲 " or ""''; separator = { left = ""; right = ""; }; }] ++ (lib.mapAttrsToList (diag_name: diag_color: { name = "diagnostics"; color.bg = diag_color; colored = false; separator = { left = ""; right = ""; }; sections = [ diag_name ]; }) { error = base08; warn = base0A; hint = base0C; info = base0B; }); lualine_y = [{ name = "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 }; }; }; }; }