diff --git a/.gitignore b/.gitignore index 3bec00f5..68486fc3 100644 --- a/.gitignore +++ b/.gitignore @@ -5,9 +5,10 @@ nvim spell/ -# You likely want to comment this, since it's recommended to track lazy-lock.json in version -# control, see https://lazy.folke.io/usage/lockfile -# For kickstart, it makes sense to leave it ignored. +# In your personal fork, you likely want to comment this, since it's recommended to track +# lazy-lock.json in version control - see https://lazy.folke.io/usage/lockfile +# For the official `nvim-lua/kickstart.nvim` git repository, we leave it ignored to avoid unneeded +# merge conflicts. lazy-lock.json .DS_Store diff --git a/README.md b/README.md index 7440ef54..093e42a6 100644 --- a/README.md +++ b/README.md @@ -262,7 +262,7 @@ available methods being discussed
Bob [Bob](https://github.com/MordechaiHadad/bob) is a Neovim version manager for -all plattforms. Simply install +all platforms. Simply install [rustup](https://rust-lang.github.io/rustup/installation/other.html), and run the following commands: diff --git a/after/lsp/lua_ls.lua b/after/lsp/lua_ls.lua index b26fbd0a..12e6d0f4 100644 --- a/after/lsp/lua_ls.lua +++ b/after/lsp/lua_ls.lua @@ -1,5 +1,7 @@ return { on_init = function(client) + client.server_capabilities.documentFormattingProvider = false -- Disable formatting (formatting is done by stylua) + if client.workspace_folders then local path = client.workspace_folders[1].name if @@ -32,7 +34,10 @@ return { }, }) end, + ---@type lspconfig.settings.lua_ls settings = { - Lua = {}, + Lua = { + format = { enable = false }, -- Disable formatting (formatting is done by stylua) + }, }, } diff --git a/lua/core/globals.lua b/lua/core/globals.lua index 3018d778..9061875b 100644 --- a/lua/core/globals.lua +++ b/lua/core/globals.lua @@ -63,7 +63,7 @@ Langs = { }, fmt = { - lua = { 'stylua' }, + -- lua = { 'stylua' }, -- see [Use stylua as an lsp formatter instead of an external formatter · nvim-lua/kickstart.nvim@459b868](https://github.com/nvim-lua/kickstart.nvim/commit/459b86865e9e81235c9db3be553d107adac5f72f) sh = { 'shfmt' }, bash = { 'shfmt' }, python = { 'ruff_format' }, diff --git a/lua/plugins/conform.lua b/lua/plugins/conform.lua index 48527a23..9a6a2894 100644 --- a/lua/plugins/conform.lua +++ b/lua/plugins/conform.lua @@ -7,7 +7,7 @@ return { { 'F', function() - require('conform').format { async = true, lsp_format = 'fallback' } + require('conform').format { async = true } end, mode = '', desc = '[F]ormat buffer', @@ -18,20 +18,28 @@ return { opts = { notify_on_error = true, format_on_save = function(bufnr) - -- Disable "format_on_save lsp_fallback" for languages that don't - -- have a well standardized coding style. You can add additional - -- languages here or re-enable it for the disabled ones. - local disable_filetypes = { c = true, cpp = true } - if disable_filetypes[vim.bo[bufnr].filetype] then - return nil - else - return { - timeout_ms = 500, - lsp_format = 'fallback', - } + -- NOTE: + -- See: + -- - [Change format_on_save to a whitelist instead of a blacklist · nvim-lua/kickstart.nvim@ce353a9](https://github.com/nvim-lua/kickstart.nvim/commit/ce353a9b0e3c47d27784509217200818f522329e) + -- - [please disable autoformat on save in default configuration · Issue #1819 · nvim-lua/kickstart.nvim](https://github.com/nvim-lua/kickstart.nvim/issues/1819) + + -- You can specify filetypes to autoformat on save here: + local enabled_filetypes = { + lua = true, + -- python = true, + } + if enabled_filetypes[vim.bo[bufnr].filetype] then + return { timeout_ms = 500 } end + return nil end, + default_format_opts = { + lsp_format = 'fallback', -- Use external formatters if configured below, otherwise use LSP formatting. Set to `false` to disable LSP formatting entirely. + }, + -- You can also specify external formatters in here. formatters_by_ft = Langs.fmt, + -- Example + -- rust = { 'rustfmt' }, -- Conform can also run multiple formatters sequentially -- python = { "isort", "black" }, -- diff --git a/lua/plugins/gitsigns.lua b/lua/plugins/gitsigns.lua index 8cc8e6e0..48d19ad7 100644 --- a/lua/plugins/gitsigns.lua +++ b/lua/plugins/gitsigns.lua @@ -1,4 +1,7 @@ -- Adds git related signs to the gutter, as well as utilities for managing changes + +---@module 'lazy' +---@type LazySpec return { 'lewis6991/gitsigns.nvim', ---@module 'gitsigns' @@ -50,17 +53,26 @@ return { map('n', 'hs', gitsigns.stage_hunk, { desc = 'git [s]tage hunk' }) map('n', 'hr', gitsigns.reset_hunk, { desc = 'git [r]eset hunk' }) map('n', 'hS', gitsigns.stage_buffer, { desc = 'git [S]tage buffer' }) - map('n', 'hu', gitsigns.stage_hunk, { desc = 'git [u]ndo stage hunk' }) map('n', 'hR', gitsigns.reset_buffer, { desc = 'git [R]eset buffer' }) map('n', 'hp', gitsigns.preview_hunk, { desc = 'git [p]review hunk' }) - map('n', 'hb', gitsigns.blame_line, { desc = 'git [b]lame line' }) + map('n', 'hi', gitsigns.preview_hunk_inline, { desc = 'git preview hunk [i]nline' }) + map('n', 'hb', function() + gitsigns.blame_line { full = true } + end, { desc = 'git [b]lame line' }) map('n', 'hd', gitsigns.diffthis, { desc = 'git [d]iff against index' }) map('n', 'hD', function() gitsigns.diffthis '@' end, { desc = 'git [D]iff against last commit' }) + map('n', 'hQ', function() + gitsigns.setqflist 'all' + end, { desc = 'git hunk [Q]uickfix list (all files in repo)' }) + map('n', 'hq', gitsigns.setqflist, { desc = 'git hunk [q]uickfix list (all changes in this file)' }) -- Toggles map('n', 'tb', gitsigns.toggle_current_line_blame, { desc = '[T]oggle git show [b]lame line' }) - map('n', 'tD', gitsigns.preview_hunk_inline, { desc = '[T]oggle git show [D]eleted' }) + map('n', 'tW', gitsigns.toggle_word_diff, { desc = '[T]oggle git intra-line [w]ord diff' }) + + -- Text object + map({ 'o', 'x' }, 'ih', gitsigns.select_hunk) end, }, } diff --git a/lua/plugins/mini.lua b/lua/plugins/mini.lua index fadf1376..702ee667 100644 --- a/lua/plugins/mini.lua +++ b/lua/plugins/mini.lua @@ -6,9 +6,16 @@ return { -- -- Examples: -- - va) - [V]isually select [A]round [)]paren - -- - yinq - [Y]ank [I]nside [N]ext [Q]uote + -- - yiiq - [Y]ank [I]nside [I]next [Q]uote -- - ci' - [C]hange [I]nside [']quote - require('mini.ai').setup { n_lines = 500 } + require('mini.ai').setup { + -- NOTE: Avoid conflicts with the built-in incremental selection mappings on Neovim>=0.12 (see `:help treesitter-incremental-selection`) + mappings = { + around_next = 'aa', + inside_next = 'ii', + }, + n_lines = 500, + } -- Add/delete/replace surroundings (brackets, quotes, etc.) -- diff --git a/lua/plugins/nvim-lspconfig.lua b/lua/plugins/nvim-lspconfig.lua index b5cb27cd..18760807 100644 --- a/lua/plugins/nvim-lspconfig.lua +++ b/lua/plugins/nvim-lspconfig.lua @@ -24,9 +24,6 @@ return { -- Useful status updates for LSP. { 'j-hui/fidget.nvim', opts = {} }, - - -- Allows extra capabilities provided by blink.cmp - 'saghen/blink.cmp', }, config = function() -- Brief aside: **What is LSP?** diff --git a/lua/plugins/nvim-treesitter.lua b/lua/plugins/nvim-treesitter.lua index 732921b6..a1bba6a7 100644 --- a/lua/plugins/nvim-treesitter.lua +++ b/lua/plugins/nvim-treesitter.lua @@ -7,6 +7,33 @@ return { -- [[ Configure Treesitter ]] See `:help nvim-treesitter-intro` config = function() require('nvim-treesitter').install(Langs.treesitter) + + ---@param buf integer + ---@param language string + local function treesitter_try_attach(buf, language) + -- check if parser exists and load it + if not vim.treesitter.language.add(language) then + return + end + -- enables syntax highlighting and other treesitter features + vim.treesitter.start(buf, language) + + -- enables treesitter based folds + -- for more info on folds see `:help folds` + -- vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()' + -- vim.wo.foldmethod = 'expr' + + -- check if treesitter indentation is available for this language, and if so enable it + -- in case there is no indent query, the indentexpr will fallback to the vim's built in one + local has_indent_query = vim.treesitter.query.get(language, 'indents') ~= nil + + -- enables treesitter based indentation + if has_indent_query then + vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" + end + end + + local available_parsers = require('nvim-treesitter').get_available() vim.api.nvim_create_autocmd('FileType', { callback = function(args) local buf, filetype = args.buf, args.match @@ -16,20 +43,20 @@ return { return end - -- check if parser exists and load it - if not vim.treesitter.language.add(language) then - return + local installed_parsers = require('nvim-treesitter').get_installed 'parsers' + + if vim.tbl_contains(installed_parsers, language) then + -- enable the parser if it is installed + treesitter_try_attach(buf, language) + elseif vim.tbl_contains(available_parsers, language) then + -- if a parser is available in `nvim-treesitter` auto install it, and enable it after the installation is done + require('nvim-treesitter').install(language):await(function() + treesitter_try_attach(buf, language) + end) + else + -- try to enable treesitter features in case the parser exists but is not available from `nvim-treesitter` + treesitter_try_attach(buf, language) end - -- enables syntax highlighting and other treesitter features - vim.treesitter.start(buf, language) - - -- enables treesitter based folds - -- for more info on folds see `:help folds` - -- vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()' - -- vim.wo.foldmethod = 'expr' - - -- enables treesitter based indentation - vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" end, }) end,