From c877cbb70da4cd001430b6583382dca592578240 Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Fri, 31 May 2024 02:57:58 +0200 Subject: [PATCH] Current state of nixvim config --- home/modules/neovim/default.nix | 744 ++++++++++++++++++++++++++------ 1 file changed, 609 insertions(+), 135 deletions(-) diff --git a/home/modules/neovim/default.nix b/home/modules/neovim/default.nix index 3a072479..3bf1d60a 100644 --- a/home/modules/neovim/default.nix +++ b/home/modules/neovim/default.nix @@ -14,12 +14,14 @@ in { config = mkIf cfg.enable { # TODO: Configure by option - # home.sessionVariables = { - # EDITOR = "nvim"; - # VISUAL = "nvim"; - # }; + home.sessionVariables = { + EDITOR = "nvim"; + VISUAL = "nvim"; + }; home.packages = with pkgs; [ + (pkgs.ripgrep.override {withPCRE2 = true;}) + # Linters vale @@ -34,39 +36,99 @@ in { defaultEditor = true; enableMan = true; colorschemes.catppuccin.enable = true; + viAlias = cfg.alias; + vimAlias = cfg.alias; + + globals = { + mapleader = " "; + mallocalleader = " "; + }; opts = { - ruler = true; # Show cursor position in status line - number = true; - relativenumber = false; showmode = false; # Status line already shows this backspace = ["indent" "eol" "start"]; - undofile = true; - undodir = "~/.vim/undo"; - encoding = "utf-8"; + termguicolors = true; # Required by multiple plugins + hidden = true; # Don't unload buffers immediately + mouse = "a"; + completeopt = ["menuone" "noselect" "noinsert"]; + timeoutlen = 100; + pumheight = 0; + formatexpr = "v:lua.require'conform'.formatexpr()"; + laststatus = 3; - # TODO: Move neovide config to this module - # printfont = "JetBrainsMono Nerd Font Mono:h10"; - # guifont = "JetBrainsMono Nerd Font Mono:h12"; + # Cursor + ruler = true; # Show cursor position in status line + number = true; + relativenumber = true; + signcolumn = "yes"; + cursorline = true; + scrolloff = 10; + + # Folding + foldcolumn = "0"; + foldlevel = 99; + foldlevelstart = 99; + foldenable = true; + + # Files + encoding = "utf-8"; + fileencoding = "utf-8"; + swapfile = false; + backup = false; + undofile = true; + undodir = "/home/christoph/.vim/undo"; + # autochdir = true; # Search incsearch = true; # Already highlight results while typing hlsearch = true; ignorecase = true; - laststatus = 2; - hidden = true; # Don't unload buffers immediately + smartcase = true; + grepprg = "rg --vimgrep"; + grepformat = "%f:%l:%c:%m"; # Indentation - autoindent = true; - expandtab = true; - smartindent = true; + autoindent = false; # Might mess up comment indentation + smartindent = false; # Might mess up comment indentation + cindent = true; + cinkeys = "0{,0},0),0],:,!^F,o,O,e"; # Fix comment (#) indentation and intellitab (somehow) smarttab = true; + expandtab = true; shiftwidth = 4; + tabstop = 4; softtabstop = 4; - termguicolors = true; # For bufferline + splitbelow = true; + splitright = true; }; + # TODO: Use conform-nvim.formatOnSave, also make this toggleable and add a "Format" command + # TODO: Half of the neovide config doesn't work + extraConfigLua = '' + local opt = vim.opt + local g = vim.g + local o = vim.o + + -- Neovide + if g.neovide then + -- Neovide options + g.neovide_fullscreen = false + g.neovide_hide_mouse_when_typing = false + g.neovide_refresh_rate = 144 + -- g.neovide_cursor_vfx_mode = "ripple" + g.neovide_cursor_animate_command_line = true + g.neovide_cursor_animate_in_insert_mode = true + g.neovide_cursor_vfx_particle_lifetime = 5.0 + g.neovide_cursor_vfx_particle_density = 14.0 + g.neovide_cursor_vfx_particle_speed = 12.0 + -- g.neovide_transparency = 0.8 + g.neovide_theme = 'light' + + -- Neovide Fonts + o.guifont = "JetBrainsMono Nerd Font:h13:Medium:i" + end + ''; + extraLuaPackages = with pkgs.lua51Packages; [ # lua-curl # For rest # xml2lua # For rest @@ -79,28 +141,349 @@ in { # nvim-nio # For rest ]; - plugins = { - # TODO: Fix the terribly ugly right side with the line numbers etc. - # Status line, alternative to lualine - airline = { - enable = false; + keymaps = [ + # { + # action = "make"; + # key = ""; + # options = { + # silent = true; + # }; + # } - settings = { - powerline_fonts = true; - theme = "catppuccin"; - }; - }; + # Disable arrow keys + # { + # mode = ["n" "i"]; + # key = ""; + # action = ""; + # options = { + # silent = true; + # noremap = true; + # desc = "Disable Up arrow key"; + # }; + # } + # { + # mode = ["n" "i"]; + # key = ""; + # action = ""; + # options = { + # silent = true; + # noremap = true; + # desc = "Disable Down arrow key"; + # }; + # } + # { + # mode = ["n" "i"]; + # key = ""; + # action = ""; + # options = { + # silent = true; + # noremap = true; + # desc = "Disable Right arrow key"; + # }; + # } + # { + # mode = ["n" "i"]; + # key = ""; + # action = ""; + # options = { + # silent = true; + # noremap = true; + # desc = "Disable Left arrow key"; + # }; + # } + + # No Leader + { + mode = "v"; + key = "<"; + action = " + { + mode = "n"; + key = "f"; + action = "Telescope find_files"; + options.desc = "Find file"; + } + { + mode = "n"; + key = "u"; + action = "Telescope undo"; + options.desc = "View undo history"; + } + { + mode = "n"; + key = "/"; + action = "Telescope current_buffer_fuzzy_find"; + options.desc = "Find in current buffer"; + } + { + mode = "n"; + key = "s"; + action = "Telescope live_grep"; + options.desc = "Find in working directory"; + } + { + mode = "n"; + key = "d"; + action = "Telescope diagnostics"; + options.desc = "View diagnostics"; + } + { + mode = "n"; + key = "?"; + action = "Telescope keymaps"; + options.desc = "View keymaps"; + } + { + mode = "n"; + key = ":"; + action = "Telescope commands"; + options.desc = "Execute command"; + } + + # Buffers b + { + mode = "n"; + key = "b"; + action = "+buffers"; + } + { + mode = "n"; + key = "bb"; + action = "Telescope buffers"; + options.desc = "View open buffers"; + } + { + mode = "n"; + key = "bn"; + action = "bnext"; + options.desc = "Goto next buffer"; + } + { + mode = "n"; + key = "bp"; + action = "bprevious"; + options.desc = "Goto previous buffer"; + } + { + mode = "n"; + key = "bq"; + action = "Bdelete"; + options.desc = "Close current buffer"; + } + + # Windows w + { + mode = "n"; + key = "w"; + action = "+windows"; + } + { + mode = "n"; + key = "ws"; + action = "v"; + options.desc = "Split window vertically"; + } + { + mode = "n"; + key = "wq"; + action = "c"; + options.desc = "Close current window"; + } + # { + # mode = "n"; + # key = "wh"; + # action = "s"; + # options.desc = "Split window horizontally"; + # } + { + mode = "n"; + key = "wh"; + action = "h"; + options.desc = "Goto left window"; + } + { + mode = "n"; + key = "wl"; + action = "l"; + options.desc = "Goto right window"; + } + { + mode = "n"; + key = "wj"; + action = "j"; + options.desc = "Goto bottom window"; + } + { + mode = "n"; + key = "wk"; + action = "k"; + options.desc = "Goto top window"; + } + { + mode = "n"; + key = "ww"; + action = "p"; + options.desc = "Goto other window"; + } + + # Toggles t + { + mode = "n"; + key = "t"; + action = "+toggle"; + } + { + mode = "n"; + key = "tt"; + action = "Neotree toggle"; + options.desc = "Toggle NeoTree"; + } + # { + # mode = "n"; + # key = "tg"; + # action = "LazyGit"; + # } + # { + # mode = "n"; + # key = "tp"; + # action = "TroubleToggle"; + # } + + # Git g + { + mode = "n"; + key = "g"; + action = "+git"; + } + { + mode = "n"; + key = "gg"; + action = "LazyGit"; + options.desc = "Toggle LazyGit"; + } + { + mode = "n"; + key = "gm"; + action = "GitMessenger"; + options.desc = "Toggle GitMessenger"; + } + # { + # mode = "n"; + # key = "gs"; + # action = "Git status"; + # } + { + mode = "n"; + key = "gs"; + action = "Telescope git_status"; + options.desc = "View Git status"; + } + { + mode = "n"; + key = "gc"; + action = "Telescope git_commits"; + options.desc = "View Git log"; + } + { + mode = "n"; + key = "gb"; + action = "Telescope git_branches"; + options.desc = "View Git branches"; + } + { + mode = "n"; + key = "gf"; + action = "Telescope git_bcommits"; + options.desc = "View Git log for current file"; + } + + # Code c + { + mode = "n"; + key = "c"; + action = "+code"; + } + # TODO: Autoformat https://github.com/redyf/Neve/blob/main/config/lsp/conform.nix + { + mode = "n"; + key = "cf"; + action = "lua require('conform').format()"; + options.desc = "Format current buffer"; + } + ]; + + plugins = { + # Status line, alternative to lualine + # airline = { + # enable = false; + # + # settings = { + # powerline_fonts = true; + # theme = "catppuccin"; + # }; + # }; # Auto-close parenthesis, alternative to nvim-autopairs - autoclose = { - enable = true; - }; + # autoclose = { + # enable = true; + # }; - # TODO: Remove once I have telescope # Alternative to bufferline - barbar = { - enable = true; - }; + # barbar = { + # enable = true; + # }; # Escape insert mode by pressing jk better-escape = { @@ -120,38 +503,74 @@ in { # }; # Directory tree - chadtree = { - enable = true; - }; + # chadtree = { + # enable = true; + # }; - # TODO: Requires LSP - clangd-extensions = { - enable = false; - }; + # clangd-extensions = { + # enable = false; + # }; # Completion engine cmp = { enable = true; + autoEnableSources = false; + settings = { sources = [ - { name = "async_path"; } - { name = "emoji"; } - { name = "nvim_lsp"; } - { name = "nvim_lsp_signature_help"; } + {name = "async_path";} + {name = "emoji";} + {name = "nvim_lsp";} + {name = "nvim_lsp_signature_help";} + {name = "luasnip";} + # {name = "cmdline";} ]; + + snippet.expand = '' + function(args) + require('luasnip').lsp_expand(args.body) + end + ''; + + window = { + completion.border = "rounded"; + completion.winhighlight = "Normal:Normal,FloatBorder:FloatBorder,CursorLine:Visual,Search:None"; + documentation.border = "rounded"; + }; + + mapping = { + __raw = '' + cmp.mapping.preset.insert({ + [''] = cmp.mapping.select_next_item(), + [''] = cmp.mapping.select_prev_item(), + [''] = cmp.mapping.abort(), + [''] = cmp.mapping.abort(), + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.confirm({ select = true }), + }) + ''; + }; }; }; - # TODO: Add snippet engine completion cmp-async-path.enable = true; cmp-emoji.enable = true; cmp-nvim-lsp.enable = true; cmp-nvim-lsp-signature-help.enable = true; + cmp_luasnip.enable = true; + # cmp-cmdline.enable = true; # Comment/Uncomment line/selection etc. comment = { enable = true; + + settings = { + mappings.extra = false; + opleader.line = ""; + toggler.line = ""; + }; }; # TODO: Setup formatters @@ -160,50 +579,55 @@ in { enable = true; formattersByFt = { - nix = [ "alejandra" ]; + 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: formatOnSave = " [???] "; }; - # TODO: Doesn't work, need LSP/treesitter? - # Highlight words under cursor, alternative to illuminate - cursorline = { - enable = false; - }; - # TODO: Figure out how debugging from nvim works... # Debug-Adapter-Protocol - dap = { - enable = false; - }; + # dap = { + # enable = false; + # }; # TODO: Figure out how diff-mode works... - diffview = { - enable = false; - }; + # diffview = { + # enable = false; + # }; # TODO: Compare after telescope etc. are enabled # Changes nvim UI components, alternative to Noice - dressing = { - enable = false; - }; + # dressing = { + # enable = false; + # }; # Notifications + LSP progress, alternative to Noice - fidget = { - enable = false; - }; + # fidget = { + # enable = true; + # }; # TODO: Doesn't work # Search labels - flash = { - enable = true; - }; + # flash = { + # enable = true; + # }; # Git client - fugitive = { - enable = true; - }; + # fugitive = { + # enable = true; + # }; # Alternative to gitsigns # gitgutter = { @@ -227,22 +651,21 @@ in { }; # Vim habit trainer, blocks keys - hardtime = { - enable = false; - }; + # hardtime = { + # enable = false; + # }; # TODO: Maybe, don't know yet (also, telescope) # Mark files and jump to them - harpoon = { - enable = false; - }; + # harpoon = { + # enable = false; + # }; # Markdown etc. heading highlights headlines = { enable = true; }; - # TODO: # Alternative to cursorline illuminate = { enable = true; @@ -253,7 +676,6 @@ in { enable = true; }; - # TODO: Shortcut compatible with cmp # Indent to current level on empty line intellitab = { enable = true; @@ -284,26 +706,35 @@ in { }; }; - # TODO: Maybe too much? # Render diagnostics as virtual line overlay - lsp-lines = { - enable = true; - }; + # lsp-lines = { + # enable = true; + # }; # Statusline, alternative to airline lualine = { enable = true; globalstatus = true; - sectionSeparators = { left = ""; right = ""; }; - componentSeparators = { left = ""; right = ""; }; + sectionSeparators = { + left = ""; + right = ""; + }; + componentSeparators = { + left = ""; + right = ""; + }; }; - + + luasnip = { + enable = true; + }; + # TODO: When I start actually using marks # Show marks in the gutter - marks = { - enable = false; - }; + # marks = { + # enable = false; + # }; # Structural overview navbuddy = { @@ -313,28 +744,81 @@ in { }; # Generate doc comments - neogen = { - enable = true; - }; + # neogen = { + # enable = true; + # }; # TODO: When I need this # Interact with test frameworks - neotest = { - enable = false; + # neotest = { + # enable = false; + # }; + + neo-tree = { + enable = true; + + enableDiagnostics = true; + enableGitStatus = true; + enableModifiedMarkers = true; + enableRefreshOnWrite = true; + closeIfLastWindow = true; + popupBorderStyle = "rounded"; + + buffers = { + bindToCwd = false; + followCurrentFile = { + enabled = true; + }; + }; + + window = { + width = 40; + height = 15; + autoExpandWidth = false; + mappings = { + "" = "none"; + }; + }; }; - # NeoVim UI refresh, alternative to fidget and dressing + # NeoVim UI refresh, alternative to fidget, dressing and notify noice = { enable = true; + + lsp.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 = "cmp"; + }; + + routes = [ + { + filter = { + event = "msg_show"; + kind = "search_count"; + }; + opts = { skip = true; }; + } + ]; }; + # Alternative to noice.notify notify = { enable = true; }; # Alternative to autoclose nvim-autopairs = { - enable = false; + enable = true; }; # Colorize color hex codes etc. @@ -345,13 +829,13 @@ in { # TODO: Folds the entire code at startup??? # Code folding nvim-ufo = { - enable = false; + enable = true; }; # File system explorer that is editable like a normal buffer - oil = { - enable = true; - }; + # oil = { + # enable = true; + # }; # Colorize paranthesis rainbow-delimiters = { @@ -360,14 +844,14 @@ in { # TODO: Lua deps not found # REST/HTTP client - rest = { - enable = false; - }; + # rest = { + # enable = false; + # }; # TODO: - rustaceanvim = { - enable = false; - }; + # rustaceanvim = { + # enable = false; + # }; # Work with pairs of delimiters sandwich = { @@ -381,9 +865,9 @@ in { # TODO: Doesn't show up # Left-hand side status column with folding markers - statuscol = { - enable = false; - }; + # statuscol = { + # enable = false; + # }; # Select something telescope = { @@ -396,13 +880,16 @@ in { }; }; - # TODO: Folds at startup + toggleterm = { + enable = true; + }; + treesitter = { enable = true; ensureInstalled = "all"; - folding = false; - indent = true; + folding = true; # TODO: Folds at startup + indent = true; # Required by intellitab incrementalSelection = { enable = true; @@ -415,9 +902,9 @@ in { }; # Window listing detected linting/lsp problems - trouble = { - enable = true; - }; + # trouble = { + # enable = true; + # }; # Don't mess up splits when closing buffers vim-bbye = { @@ -426,11 +913,11 @@ in { # TODO: Setup # LaTeX - vimtex = { - enable = true; - - texlivePackage = null; # Don't auto-install - }; + # vimtex = { + # enable = true; + # + # texlivePackage = null; # Don't auto-install + # }; # Display keybindings help which-key = { @@ -443,19 +930,6 @@ in { enable = true; }; }; - - # TODO: Use conform-nvim.formatOnSave, also make this toggleable and add a "Format" command - extraConfigLua = '' - vim.api.nvim_create_autocmd("BufWritePre", { - pattern = "*", - callback = function(args) - require("conform").format({ bufnr = args.buf }) - end, - }) - ''; - - viAlias = cfg.alias; - vimAlias = cfg.alias; }; }; }