diff --git a/modules/hm/vim.nix b/modules/hm/vim.nix index ecbcef9..0b78a41 100644 --- a/modules/hm/vim.nix +++ b/modules/hm/vim.nix @@ -1,18 +1,29 @@ -{ pkgs, ... }: { +{ pkgs, ... }: +let vp = pkgs.vimPlugins; in { programs.neovim = { enable = true; plugins = [ + # Git related plugins + vp.fugitive + vp.rhubarb + + + # Detect tabstop and shiftwidth automatically + vp.sleuth + + + # LSP { - plugin = pkgs.vimPlugins.airline; - # config = "let g:airline#extensions#tabline#left_alt_sep = '>'"; + plugin = vp.fidget-nvim; + config = '' + require("fidget").setup({}) + ''; + type = "lua"; } - pkgs.vimPlugins.vim-airline-themes + vp.neodev-nvim + # vp.nvim-lspconfig { - plugin = pkgs.vimPlugins.nightfox-nvim; - config = "colorscheme nightfox"; - } - { - plugin = pkgs.vimPlugins.nvim-lspconfig; + plugin = vp.nvim-lspconfig; type = "lua"; config = '' local lspconfig = require('lspconfig') @@ -23,46 +34,150 @@ lspconfig.texlab.setup {capabilities=capabilities} ''; } - pkgs.vimPlugins.nvim-treesitter.withAllGrammars - pkgs.vimPlugins.plenary-nvim - pkgs.vimPlugins.mini-nvim - pkgs.vimPlugins.telescope-nvim - pkgs.vimPlugins.gitsigns-nvim - pkgs.vimPlugins.nvim-tree-lua - # completion - pkgs.vimPlugins.nvim-cmp + # Autocompletion + ## Snippet engine & its associated nvim-cmp source + vp.luasnip + vp.cmp_luasnip + ## Adds LSP completion capabilities + vp.cmp-nvim-lsp + vp.cmp-path + ## Adds a number of user-friendly snippets + vp.friendly-snippets + ## NVIM CMP + vp.nvim-cmp + # Useful plugin to show you pending keybinds + { plugin = vp.which-key-nvim; config = ''require("which-key").setup({})''; type = "lua"; } + + # Adds git related signs to the gutter, as well as utilities for managing changes { - plugin = pkgs.vimPlugins.cmp-nvim-lsp; - type = "lua"; + plugin = vp.gitsigns-nvim; config = '' - local cmp = require("cmp") - cmp.setup({ - mapping = cmp.mapping.preset.insert({ - [""] = cmp.mapping.scroll_docs(-4), - [""] = cmp.mapping.scroll_docs(4), - [""] = cmp.mapping.complete(), - [""] = cmp.mapping.abort(), - [""] = cmp.mapping.confirm({ select = true }), - }), - sources = cmp.config.sources({ - { name = "nvim_lsp" }, - { name = "buffer" } - }) + require("gitsigns").setup({ + -- See `:help gitsigns.txt` + signs = { + add = { text = '+' }, + change = { text = '~' }, + delete = { text = '_' }, + topdelete = { text = '‾' }, + changedelete = { text = '~' }, + }, + on_attach = function(bufnr) + local gs = package.loaded.gitsigns + + local function map(mode, l, r, opts) + opts = opts or {} + opts.buffer = bufnr + vim.keymap.set(mode, l, r, opts) + end + + -- Navigation + map({ 'n', 'v' }, ']c', function() + if vim.wo.diff then + return ']c' + end + vim.schedule(function() + gs.next_hunk() + end) + return '' + end, { expr = true, desc = 'Jump to next hunk' }) + + map({ 'n', 'v' }, '[c', function() + if vim.wo.diff then + return '[c' + end + vim.schedule(function() + gs.prev_hunk() + end) + return '' + end, { expr = true, desc = 'Jump to previous hunk' }) + + -- Actions + -- visual mode + map('v', 'hs', function() + gs.stage_hunk { vim.fn.line '.', vim.fn.line 'v' } + end, { desc = 'stage git hunk' }) + map('v', 'hr', function() + gs.reset_hunk { vim.fn.line '.', vim.fn.line 'v' } + end, { desc = 'reset git hunk' }) + -- normal mode + map('n', 'hs', gs.stage_hunk, { desc = 'git stage hunk' }) + map('n', 'hr', gs.reset_hunk, { desc = 'git reset hunk' }) + map('n', 'hS', gs.stage_buffer, { desc = 'git Stage buffer' }) + map('n', 'hu', gs.undo_stage_hunk, { desc = 'undo stage hunk' }) + map('n', 'hR', gs.reset_buffer, { desc = 'git Reset buffer' }) + map('n', 'hp', gs.preview_hunk, { desc = 'preview git hunk' }) + map('n', 'hb', function() + gs.blame_line { full = false } + end, { desc = 'git blame line' }) + map('n', 'hd', gs.diffthis, { desc = 'git diff against index' }) + map('n', 'hD', function() + gs.diffthis '~' + end, { desc = 'git diff against last commit' }) + + -- Toggles + map('n', 'tb', gs.toggle_current_line_blame, { desc = 'toggle git blame line' }) + map('n', 'td', gs.toggle_deleted, { desc = 'toggle git show deleted' }) + + -- Text object + map({ 'o', 'x' }, 'ih', ':Gitsigns select_hunk', { desc = 'select git hunk' }) + end, }) ''; + type = "lua"; } - # pkgs.vimPlugins.fugitive - # pkgs.vimPlugins.surround - # { - # plugin = pkgs.vimPlugins.vim-airline-themes; - # config = "let g:airline_theme='nightfox'"; - # } + # Cool color scheme + { + plugin = vp.nightfox-nvim; + config = "colorscheme nightfox"; + } + + # Set lualine as statusline + { + plugin = vp.lualine-nvim; + config = '' + require("lualine").setup({ + options = { + icons_enabled = false, + theme = "nightfox", + component_separators = "|", + section_separators = "", + }, + }) + ''; + type = "lua"; + } + + # Add indentation guides even on blank lines + { + # See `:help ibl` + plugin = vp.indent-blankline-nvim; + config = '' + require("ibl").setup({}) + ''; + type = "lua"; + } + + # "gc" to comment visual regions/lines + { + plugin = vp.comment-nvim; + config = '' + require("Comment").setup({}) + ''; + type = "lua"; + } + + vp.plenary-nvim + vp.telescope-fzf-native-nvim + vp.telescope-nvim + + vp.nvim-treesitter-textobjects + vp.nvim-treesitter ]; # settings = { ignorecase = true; }; - coc.enable = true; + # coc.enable = true; viAlias = true; vimAlias = true; vimdiffAlias = true;