diff --git a/home/editor/neovim/default.nix b/home/editor/neovim/default.nix index 5c37f7b..f5600d7 100644 --- a/home/editor/neovim/default.nix +++ b/home/editor/neovim/default.nix @@ -16,17 +16,21 @@ cmp_luasnip copilot-cmp copilot-lua - lsp-zero-nvim + gitsigns-nvim + indent-blankline-nvim lualine-nvim luasnip nvim-cmp nvim-lspconfig plenary-nvim telescope-nvim + telescope-fzf-native-nvim + todo-comments-nvim + trouble-nvim undotree vim-floaterm - vim-fugitive vim-sleuth + which-key-nvim (nvim-treesitter.withPlugins (p: [ p.tree-sitter-yaml p.tree-sitter-nix @@ -57,7 +61,7 @@ # LSPs gopls - pyright + basedpyright nodePackages.typescript-language-server nodePackages.typescript nil diff --git a/home/editor/neovim/keybinds.lua b/home/editor/neovim/keybinds.lua index 4246d97..862f968 100644 --- a/home/editor/neovim/keybinds.lua +++ b/home/editor/neovim/keybinds.lua @@ -1,32 +1,57 @@ -- Keybinds -vim.keymap.set("n", "ds", vim.diagnostic.open_float, { desc = "Show diagnostic" }) + +-- Diagnostics +vim.keymap.set("n", "ds", vim.diagnostic.open_float, { desc = "Show diagnostic" }) +vim.keymap.set("n", "dd", 'Trouble diagnostics toggle', { desc = "Diagnostics list" }) +vim.keymap.set("n", "db", 'Trouble diagnostics toggle filter.buf=0', { desc = "Buffer diagnostics" }) -- Term -vim.g.floaterm_keymap_toggle = 'ft' +vim.g.floaterm_keymap_toggle = 'T' -- Tabs -vim.keymap.set('n', 'n', ':tabnew', - { silent = true, desc = '[N]ew tab' }) -vim.keymap.set('n', 'p', ':tabnext', - { silent = true, desc = '[p]Next tab' }) -vim.keymap.set('n', 'P', ':tabprev', - { silent = true, desc = '[P]Previous tab' }) +vim.keymap.set('n', 'tn', ':tabnew', + { silent = true, desc = 'New tab' }) +vim.keymap.set('n', 'tp', ':tabnext', + { silent = true, desc = 'Next tab' }) +vim.keymap.set('n', 'tP', ':tabprev', + { silent = true, desc = 'Previous tab' }) -- Telescope vim.keymap.set('n', '?', require('telescope.builtin').oldfiles, - { desc = '[?] FInd recently opened files' }) + { desc = 'Find recently opened files' }) vim.keymap.set('n', 'ff', require('telescope.builtin').find_files, - { desc = '[F]ind [F]iles' }) -vim.keymap.set('n', 'ff', require('telescope.builtin').find_files, - { desc = '[F]ind [F]iles' }) + { desc = 'Find files' }) vim.keymap.set('n', 'fg', require('telescope.builtin').live_grep, - { desc = '[F]ind by [G]rep' }) + { desc = 'Find by grep' }) +vim.keymap.set('n', 'fb', require('telescope.builtin').buffers, + { desc = 'Find buffers' }) +vim.keymap.set('n', 'fd', require('telescope.builtin').diagnostics, + { desc = 'Find diagnostics' }) +vim.keymap.set('n', 'fw', require('telescope.builtin').grep_string, + { desc = 'Find word under cursor' }) --- Tabs -vim.keymap.set('n', 'tt', ':tabnew') -vim.keymap.set('n', 'tn', ':tabnext') -vim.keymap.set('n', 'tp', ':tabprevious') +-- Undotree +vim.keymap.set('n', 'u', vim.cmd.UndotreeToggle, + { desc = 'Toggle undotree' }) + +-- Gitsigns +local gs = require('gitsigns') +vim.keymap.set('n', ']h', gs.next_hunk, { desc = 'Next git hunk' }) +vim.keymap.set('n', '[h', gs.prev_hunk, { desc = 'Previous git hunk' }) +vim.keymap.set('n', 'gs', gs.stage_hunk, { desc = 'Stage hunk' }) +vim.keymap.set('n', 'gr', gs.reset_hunk, { desc = 'Reset hunk' }) +vim.keymap.set('n', 'gS', gs.stage_buffer, { desc = 'Stage buffer' }) +vim.keymap.set('n', 'gR', gs.reset_buffer, { desc = 'Reset buffer' }) +vim.keymap.set('n', 'gp', gs.preview_hunk, { desc = 'Preview hunk' }) +vim.keymap.set('n', 'gb', gs.blame_line, { desc = 'Blame line' }) + +-- Todo comments +vim.keymap.set('n', ']t', function() require('todo-comments').jump_next() end, { desc = 'Next todo comment' }) +vim.keymap.set('n', '[t', function() require('todo-comments').jump_prev() end, { desc = 'Previous todo comment' }) +vim.keymap.set('n', 'ft', 'TodoTelescope', { desc = 'Find TODOs' }) -- LSP -vim.keymap.set('n', 'gD', vim.lsp.buf.declaration) -vim.keymap.set('n', 'gd', vim.lsp.buf.definition) +vim.keymap.set('n', 'lr', vim.lsp.buf.rename, { desc = 'Rename' }) +vim.keymap.set('n', 'la', vim.lsp.buf.code_action, { desc = 'Code action' }) +vim.keymap.set('n', 'lf', function() vim.lsp.buf.format({ async = false }) end, + { desc = 'Format' }) diff --git a/home/editor/neovim/plugins.lua b/home/editor/neovim/plugins.lua index d17769f..db7de1e 100644 --- a/home/editor/neovim/plugins.lua +++ b/home/editor/neovim/plugins.lua @@ -1,25 +1,13 @@ -- Plugins --- LSP stuff -local lsp_zero = require('lsp-zero') - - -lsp_zero.on_attach(function(_, bufnr) - lsp_zero.default_keymaps({ buffer = bufnr }) -end) - -lsp_zero.format_on_save({ - format_opts = { - async = false, - timeout_ms = 10000, - }, - servers = { - ['gopls'] = { 'go' }, - ['nil_ls'] = { 'nix' }, - ['lua_ls'] = { 'lua' }, - ['ts_ls'] = { 'typescript', 'javascript', 'typescriptreact' }, - }, +-- Format on save for nix, lua, ts/js +vim.api.nvim_create_autocmd("BufWritePre", { + pattern = { "*.nix", "*.lua", "*.ts", "*.tsx", "*.js" }, + callback = function() + vim.lsp.buf.format({ async = false, timeout_ms = 10000 }) + end, }) + -- LSP: go vim.lsp.config("gopls", { settings = { @@ -158,14 +146,12 @@ vim.api.nvim_create_autocmd("LspAttach", { desc = 'LSP: Disable hover capability from Ruff', }) --- Pyright -vim.lsp.config("pyright", { +-- Basedpyright +vim.lsp.config("basedpyright", { settings = { - pyright = { + basedpyright = { -- Using Ruff's import organizer disableOrganizeImports = true, - }, - python = { analysis = { -- Ignore all files for analysis to exclusively use Ruff for linting ignore = { '*' }, @@ -173,7 +159,10 @@ vim.lsp.config("pyright", { }, }, }) -vim.lsp.enable({ "pyright" }) +vim.lsp.enable({ "basedpyright" }) + +-- Gitsigns +require('gitsigns').setup() -- Telescope require('telescope').setup({ @@ -186,8 +175,9 @@ require('telescope').setup({ } }, }) +require('telescope').load_extension('fzf') --- Tresitter stuff +-- Treesitter require('nvim-treesitter').setup { ensure_installed = {}, auto_install = false, @@ -262,12 +252,12 @@ require('copilot_cmp').setup() -- Cmp local cmp = require('cmp') -local cmp_action = lsp_zero.cmp_action() +local luasnip = require('luasnip') cmp.setup({ snippet = { expand = function(args) - require('luasnip').lsp_expand(args.body) + luasnip.lsp_expand(args.body) end, }, mapping = cmp.mapping.preset.insert({ @@ -275,9 +265,25 @@ cmp.setup({ [''] = cmp.mapping.confirm({ select = false }), -- Ctrl+Space to open completion menu [''] = cmp.mapping.complete(), - -- Move between snippet placeholders - [''] = cmp_action.luasnip_jump_forward(), - [''] = cmp_action.luasnip_jump_backward(), + -- Tab to select next item or jump in snippet + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + else + fallback() + end + end, { 'i', 's' }), + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif luasnip.jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, { 'i', 's' }), -- Scroll in completion docs [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), @@ -292,6 +298,29 @@ cmp.setup({ }) +-- Indent blankline +require('ibl').setup() + +-- Trouble +require('trouble').setup({ + icons = false, +}) + +-- Todo comments +require('todo-comments').setup({ + signs = false, +}) + +-- Which-key +require('which-key').setup() +require('which-key').add({ + { "d", group = "Diagnostics" }, + { "f", group = "Find" }, + { "g", group = "Git" }, + { "l", group = "LSP" }, + { "t", group = "Tabs" }, +}) + -- Colorscheme require('catppuccin').setup { }