feat: migrate from vim.pack to lazy.nvim
Replace vim.pack bootstrap and all vim.pack.add calls with lazy.nvim. Convert kickstart and custom plugin files to return lazy specs. Fix wezterm.nvim to only load when wezterm executable is present. Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
This commit is contained in:
parent
cc3d4d5376
commit
01f1b78aed
632
init.lua
632
init.lua
|
|
@ -248,244 +248,110 @@ do
|
||||||
end
|
end
|
||||||
|
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
-- SECTION 2: PLUGIN MANAGER INTRO
|
-- SECTION 2: PLUGIN MANAGER (lazy.nvim)
|
||||||
-- vim.pack intro, build hooks
|
-- Bootstrap, install, and configure all plugins
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
do
|
|
||||||
-- [[ Intro to `vim.pack` ]]
|
|
||||||
-- `vim.pack` is a new plugin manager built into Neovim,
|
|
||||||
-- which provides a Lua interface for installing and managing plugins.
|
|
||||||
--
|
|
||||||
-- See `:help vim.pack`, `:help vim.pack-examples` or the
|
|
||||||
-- excellent blog post from the creator of vim.pack and mini.nvim:
|
|
||||||
-- https://echasnovski.com/blog/2026-03-13-a-guide-to-vim-pack
|
|
||||||
--
|
|
||||||
-- To inspect plugin state and pending updates, run
|
|
||||||
-- :lua vim.pack.update(nil, { offline = true })
|
|
||||||
--
|
|
||||||
-- To update plugins, run
|
|
||||||
-- :lua vim.pack.update()
|
|
||||||
--
|
|
||||||
--
|
|
||||||
-- Throughout the rest of the config there will be examples
|
|
||||||
-- of how to install and configure plugins using `vim.pack`.
|
|
||||||
--
|
|
||||||
-- In this section we set up some autocommands to run build
|
|
||||||
-- steps for certain plugins after they are installed or updated.
|
|
||||||
|
|
||||||
local function run_build(name, cmd, cwd)
|
-- Bootstrap lazy.nvim
|
||||||
local result = vim.system(cmd, { cwd = cwd }):wait()
|
local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim'
|
||||||
if result.code ~= 0 then
|
if not (vim.uv or vim.loop).fs_stat(lazypath) then
|
||||||
local stderr = result.stderr or ''
|
local out = vim.fn.system({
|
||||||
local stdout = result.stdout or ''
|
'git', 'clone', '--filter=blob:none', '--branch=stable',
|
||||||
local output = stderr ~= '' and stderr or stdout
|
'https://github.com/folke/lazy.nvim.git', lazypath,
|
||||||
if output == '' then output = 'No output from build command.' end
|
|
||||||
vim.notify(('Build failed for %s:\n%s'):format(name, output), vim.log.levels.ERROR)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- This autocommand runs after a plugin is installed or updated and
|
|
||||||
-- runs the appropriate build command for that plugin if necessary.
|
|
||||||
--
|
|
||||||
-- See `:help vim.pack-events`
|
|
||||||
vim.api.nvim_create_autocmd('PackChanged', {
|
|
||||||
callback = function(ev)
|
|
||||||
local name = ev.data.spec.name
|
|
||||||
local kind = ev.data.kind
|
|
||||||
if kind ~= 'install' and kind ~= 'update' then return end
|
|
||||||
|
|
||||||
if name == 'telescope-fzf-native.nvim' and vim.fn.executable 'make' == 1 then
|
|
||||||
run_build(name, { 'make' }, ev.data.path)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if name == 'LuaSnip' then
|
|
||||||
if vim.fn.has 'win32' ~= 1 and vim.fn.executable 'make' == 1 then run_build(name, { 'make', 'install_jsregexp' }, ev.data.path) end
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if name == 'nvim-treesitter' then
|
|
||||||
if not ev.data.active then vim.cmd.packadd 'nvim-treesitter' end
|
|
||||||
vim.cmd 'TSUpdate'
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
})
|
})
|
||||||
|
if vim.v.shell_error ~= 0 then
|
||||||
|
vim.api.nvim_echo({ { 'Failed to clone lazy.nvim:\n', 'ErrorMsg' }, { out, 'WarningMsg' }, { '\nPress any key to exit...' } }, true, {})
|
||||||
|
vim.fn.getchar()
|
||||||
|
os.exit(1)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
vim.opt.rtp:prepend(lazypath)
|
||||||
|
|
||||||
---Because most plugins are hosted on GitHub, you can use the helper
|
require('lazy').setup({
|
||||||
---function to have less repetition in the following sections.
|
spec = {
|
||||||
---@param repo string
|
-- ============================================================
|
||||||
---@return string
|
-- SECTION 3: UI / CORE UX PLUGINS
|
||||||
local function gh(repo) return 'https://github.com/' .. repo end
|
-- ============================================================
|
||||||
|
|
||||||
-- ============================================================
|
{ 'NMAC427/guess-indent.nvim', opts = {} },
|
||||||
-- SECTION 3: UI / CORE UX PLUGINS
|
|
||||||
-- guess-indent, gitsigns, which-key, colorscheme, todo-comments, mini modules
|
|
||||||
-- ============================================================
|
|
||||||
do
|
|
||||||
-- [[ Installing and Configuring Plugins ]]
|
|
||||||
--
|
|
||||||
-- To install a plugin simply call `vim.pack.add` with its git url.
|
|
||||||
-- This will download the default branch of the plugin, which will usually be `main` or `master`
|
|
||||||
-- You can also have more advanced specs, which we will talk about later.
|
|
||||||
--
|
|
||||||
-- For most plugins its not enough to install them, you also need to call their `.setup()` to start them.
|
|
||||||
--
|
|
||||||
-- For example, lets say we want to install `guess-indent.nvim` - a plugin for
|
|
||||||
-- automatically detecting and setting the indentation.
|
|
||||||
--
|
|
||||||
-- We first install it from https://github.com/NMAC427/guess-indent.nvim
|
|
||||||
-- and then call its `setup()` function to start it with default settings.
|
|
||||||
vim.pack.add { gh 'NMAC427/guess-indent.nvim' }
|
|
||||||
require('guess-indent').setup {}
|
|
||||||
|
|
||||||
-- Because lua is a real programming language, you can also have some logic to your installation -
|
{
|
||||||
-- like only installing a plugin if a condition is met.
|
'nvim-tree/nvim-web-devicons',
|
||||||
--
|
cond = vim.g.have_nerd_font,
|
||||||
-- Here we only install `nvim-web-devicons` (which adds pretty icons) if we have a Nerd Font,
|
|
||||||
-- since otherwise the icons won't display properly.
|
|
||||||
if vim.g.have_nerd_font then vim.pack.add { gh 'nvim-tree/nvim-web-devicons' } end
|
|
||||||
|
|
||||||
-- Here is a more advanced configuration example that passes options to `gitsigns.nvim`
|
|
||||||
--
|
|
||||||
-- See `:help gitsigns` to understand what each configuration key does.
|
|
||||||
-- Adds git related signs to the gutter, as well as utilities for managing changes
|
|
||||||
vim.pack.add { gh 'lewis6991/gitsigns.nvim' }
|
|
||||||
require('gitsigns').setup {
|
|
||||||
signs = {
|
|
||||||
add = { text = '+' }, ---@diagnostic disable-line: missing-fields
|
|
||||||
change = { text = '~' }, ---@diagnostic disable-line: missing-fields
|
|
||||||
delete = { text = '_' }, ---@diagnostic disable-line: missing-fields
|
|
||||||
topdelete = { text = '‾' }, ---@diagnostic disable-line: missing-fields
|
|
||||||
changedelete = { text = '~' }, ---@diagnostic disable-line: missing-fields
|
|
||||||
},
|
},
|
||||||
}
|
|
||||||
|
|
||||||
-- Useful plugin to show you pending keybinds.
|
{
|
||||||
vim.pack.add { gh 'folke/which-key.nvim' }
|
'lewis6991/gitsigns.nvim',
|
||||||
require('which-key').setup {
|
opts = {
|
||||||
-- Delay between pressing a key and opening which-key (milliseconds)
|
signs = {
|
||||||
|
add = { text = '+' },
|
||||||
|
change = { text = '~' },
|
||||||
|
delete = { text = '_' },
|
||||||
|
topdelete = { text = '‾' },
|
||||||
|
changedelete = { text = '~' },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
'folke/which-key.nvim',
|
||||||
|
event = 'VimEnter',
|
||||||
|
opts = {
|
||||||
delay = 0,
|
delay = 0,
|
||||||
icons = { mappings = vim.g.have_nerd_font },
|
icons = { mappings = vim.g.have_nerd_font },
|
||||||
-- Document existing key chains
|
|
||||||
spec = {
|
spec = {
|
||||||
{ '<leader>s', group = '[S]earch', mode = { 'n', 'v' } },
|
{ '<leader>s', group = '[S]earch', mode = { 'n', 'v' } },
|
||||||
{ '<leader>t', group = '[T]oggle' },
|
{ '<leader>t', group = '[T]oggle' },
|
||||||
{ '<leader>h', group = 'Git [H]unk', mode = { 'n', 'v' } }, -- Enable gitsigns recommended keymaps first
|
{ '<leader>h', group = 'Git [H]unk', mode = { 'n', 'v' } },
|
||||||
{ 'gr', group = 'LSP Actions', mode = { 'n' } },
|
{ 'gr', group = 'LSP Actions', mode = { 'n' } },
|
||||||
},
|
},
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
-- Highlight todo, notes, etc in comments
|
|
||||||
vim.pack.add { gh 'folke/todo-comments.nvim' }
|
|
||||||
require('todo-comments').setup { signs = false }
|
|
||||||
|
|
||||||
-- [[ mini.nvim ]]
|
|
||||||
-- A collection of various small independent plugins/modules
|
|
||||||
vim.pack.add { gh 'nvim-mini/mini.nvim' }
|
|
||||||
|
|
||||||
-- Better Around/Inside textobjects
|
|
||||||
--
|
|
||||||
-- Examples:
|
|
||||||
-- - va) - [V]isually select [A]round [)]paren
|
|
||||||
-- - yiiq - [Y]ank [I]nside [I]+1 [Q]uote
|
|
||||||
-- - ci' - [C]hange [I]nside [']quote
|
|
||||||
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',
|
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
{ 'folke/todo-comments.nvim', opts = { signs = false } },
|
||||||
|
|
||||||
|
{
|
||||||
|
'nvim-mini/mini.nvim',
|
||||||
|
config = function()
|
||||||
|
require('mini.ai').setup {
|
||||||
|
mappings = { around_next = 'aa', inside_next = 'ii' },
|
||||||
n_lines = 500,
|
n_lines = 500,
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Add/delete/replace surroundings (brackets, quotes, etc.)
|
|
||||||
--
|
|
||||||
-- - saiw) - [S]urround [A]dd [I]nner [W]ord [)]Paren
|
|
||||||
-- - sd' - [S]urround [D]elete [']quotes
|
|
||||||
-- - sr)' - [S]urround [R]eplace [)] [']
|
|
||||||
require('mini.surround').setup()
|
require('mini.surround').setup()
|
||||||
|
|
||||||
-- Simple and easy statusline.
|
|
||||||
-- You could remove this setup call if you don't like it,
|
|
||||||
-- and try some other statusline plugin
|
|
||||||
local statusline = require 'mini.statusline'
|
local statusline = require 'mini.statusline'
|
||||||
-- Set `use_icons` to true if you have a Nerd Font
|
|
||||||
statusline.setup { use_icons = vim.g.have_nerd_font }
|
statusline.setup { use_icons = vim.g.have_nerd_font }
|
||||||
|
|
||||||
-- You can configure sections in the statusline by overriding their
|
|
||||||
-- default behavior. For example, here we set the section for
|
|
||||||
-- cursor location to LINE:COLUMN
|
|
||||||
---@diagnostic disable-next-line: duplicate-set-field
|
---@diagnostic disable-next-line: duplicate-set-field
|
||||||
statusline.section_location = function() return '%2l:%-2v' end
|
statusline.section_location = function() return '%2l:%-2v' end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
-- ... and there is more!
|
-- ============================================================
|
||||||
-- Check out: https://github.com/nvim-mini/mini.nvim
|
-- SECTION 4: SEARCH & NAVIGATION
|
||||||
end
|
-- ============================================================
|
||||||
|
|
||||||
-- ============================================================
|
{ 'nvim-lua/plenary.nvim' },
|
||||||
-- SECTION 4: SEARCH & NAVIGATION
|
|
||||||
-- Telescope setup, keymaps, LSP picker mappings
|
|
||||||
-- ============================================================
|
|
||||||
do
|
|
||||||
-- [[ Fuzzy Finder (files, lsp, etc) ]]
|
|
||||||
--
|
|
||||||
-- Telescope is a fuzzy finder that comes with a lot of different things that
|
|
||||||
-- it can fuzzy find! It's more than just a "file finder", it can search
|
|
||||||
-- many different aspects of Neovim, your workspace, LSP, and more!
|
|
||||||
--
|
|
||||||
-- There are lots of other alternative pickers (like snacks.picker, or fzf-lua)
|
|
||||||
-- so feel free to experiment and see what you like!
|
|
||||||
--
|
|
||||||
-- The easiest way to use Telescope, is to start by doing something like:
|
|
||||||
-- :Telescope help_tags
|
|
||||||
--
|
|
||||||
-- After running this command, a window will open up and you're able to
|
|
||||||
-- type in the prompt window. You'll see a list of `help_tags` options and
|
|
||||||
-- a corresponding preview of the help.
|
|
||||||
--
|
|
||||||
-- Two important keymaps to use while in Telescope are:
|
|
||||||
-- - Insert mode: <c-/>
|
|
||||||
-- - Normal mode: ?
|
|
||||||
--
|
|
||||||
-- This opens a window that shows you all of the keymaps for the current
|
|
||||||
-- Telescope picker. This is really useful to discover what Telescope can
|
|
||||||
-- do as well as how to actually do it!
|
|
||||||
|
|
||||||
---@type (string|vim.pack.Spec)[]
|
{
|
||||||
local telescope_plugins = {
|
'nvim-telescope/telescope.nvim',
|
||||||
gh 'nvim-lua/plenary.nvim',
|
event = 'VimEnter',
|
||||||
gh 'nvim-telescope/telescope.nvim',
|
dependencies = {
|
||||||
gh 'nvim-telescope/telescope-ui-select.nvim',
|
'nvim-lua/plenary.nvim',
|
||||||
}
|
'nvim-telescope/telescope-ui-select.nvim',
|
||||||
if vim.fn.executable 'make' == 1 then table.insert(telescope_plugins, gh 'nvim-telescope/telescope-fzf-native.nvim') end
|
{
|
||||||
|
'nvim-telescope/telescope-fzf-native.nvim',
|
||||||
-- NOTE: You can install multiple plugins at once
|
build = 'make',
|
||||||
vim.pack.add(telescope_plugins)
|
cond = vim.fn.executable('make') == 1,
|
||||||
|
},
|
||||||
-- See `:help telescope` and `:help telescope.setup()`
|
},
|
||||||
|
config = function()
|
||||||
require('telescope').setup {
|
require('telescope').setup {
|
||||||
-- You can put your default mappings / updates / etc. in here
|
|
||||||
-- All the info you're looking for is in `:help telescope.setup()`
|
|
||||||
--
|
|
||||||
-- defaults = {
|
|
||||||
-- mappings = {
|
|
||||||
-- i = { ['<c-enter>'] = 'to_fuzzy_refine' },
|
|
||||||
-- },
|
|
||||||
-- },
|
|
||||||
-- pickers = {}
|
|
||||||
extensions = {
|
extensions = {
|
||||||
['ui-select'] = { require('telescope.themes').get_dropdown() },
|
['ui-select'] = { require('telescope.themes').get_dropdown() },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Enable Telescope extensions if they are installed
|
|
||||||
pcall(require('telescope').load_extension, 'fzf')
|
pcall(require('telescope').load_extension, 'fzf')
|
||||||
pcall(require('telescope').load_extension, 'ui-select')
|
pcall(require('telescope').load_extension, 'ui-select')
|
||||||
|
|
||||||
-- See `:help telescope.builtin`
|
|
||||||
local builtin = require 'telescope.builtin'
|
local builtin = require 'telescope.builtin'
|
||||||
vim.keymap.set('n', '<leader>sh', builtin.help_tags, { desc = '[S]earch [H]elp' })
|
vim.keymap.set('n', '<leader>sh', builtin.help_tags, { desc = '[S]earch [H]elp' })
|
||||||
vim.keymap.set('n', '<leader>sk', builtin.keymaps, { desc = '[S]earch [K]eymaps' })
|
vim.keymap.set('n', '<leader>sk', builtin.keymaps, { desc = '[S]earch [K]eymaps' })
|
||||||
|
|
@ -499,136 +365,57 @@ do
|
||||||
vim.keymap.set('n', '<leader>sc', builtin.commands, { desc = '[S]earch [C]ommands' })
|
vim.keymap.set('n', '<leader>sc', builtin.commands, { desc = '[S]earch [C]ommands' })
|
||||||
vim.keymap.set('n', '<leader><leader>', builtin.buffers, { desc = '[ ] Find existing buffers' })
|
vim.keymap.set('n', '<leader><leader>', builtin.buffers, { desc = '[ ] Find existing buffers' })
|
||||||
|
|
||||||
-- Add Telescope-based LSP pickers when an LSP attaches to a buffer.
|
|
||||||
-- If you later switch picker plugins, this is where to update these mappings.
|
|
||||||
vim.api.nvim_create_autocmd('LspAttach', {
|
vim.api.nvim_create_autocmd('LspAttach', {
|
||||||
group = vim.api.nvim_create_augroup('telescope-lsp-attach', { clear = true }),
|
group = vim.api.nvim_create_augroup('telescope-lsp-attach', { clear = true }),
|
||||||
callback = function(event)
|
callback = function(event)
|
||||||
local buf = event.buf
|
local buf = event.buf
|
||||||
|
|
||||||
-- Find references for the word under your cursor.
|
|
||||||
vim.keymap.set('n', 'grr', builtin.lsp_references, { buffer = buf, desc = '[G]oto [R]eferences' })
|
vim.keymap.set('n', 'grr', builtin.lsp_references, { buffer = buf, desc = '[G]oto [R]eferences' })
|
||||||
|
|
||||||
-- Jump to the implementation of the word under your cursor.
|
|
||||||
-- Useful when your language has ways of declaring types without an actual implementation.
|
|
||||||
vim.keymap.set('n', 'gri', builtin.lsp_implementations, { buffer = buf, desc = '[G]oto [I]mplementation' })
|
vim.keymap.set('n', 'gri', builtin.lsp_implementations, { buffer = buf, desc = '[G]oto [I]mplementation' })
|
||||||
|
|
||||||
-- Jump to the definition of the word under your cursor.
|
|
||||||
-- This is where a variable was first declared, or where a function is defined, etc.
|
|
||||||
-- To jump back, press <C-t>.
|
|
||||||
vim.keymap.set('n', 'grd', builtin.lsp_definitions, { buffer = buf, desc = '[G]oto [D]efinition' })
|
vim.keymap.set('n', 'grd', builtin.lsp_definitions, { buffer = buf, desc = '[G]oto [D]efinition' })
|
||||||
|
|
||||||
-- Fuzzy find all the symbols in your current document.
|
|
||||||
-- Symbols are things like variables, functions, types, etc.
|
|
||||||
vim.keymap.set('n', 'gO', builtin.lsp_document_symbols, { buffer = buf, desc = 'Open Document Symbols' })
|
vim.keymap.set('n', 'gO', builtin.lsp_document_symbols, { buffer = buf, desc = 'Open Document Symbols' })
|
||||||
|
|
||||||
-- Fuzzy find all the symbols in your current workspace.
|
|
||||||
-- Similar to document symbols, except searches over your entire project.
|
|
||||||
vim.keymap.set('n', 'gW', builtin.lsp_dynamic_workspace_symbols, { buffer = buf, desc = 'Open Workspace Symbols' })
|
vim.keymap.set('n', 'gW', builtin.lsp_dynamic_workspace_symbols, { buffer = buf, desc = 'Open Workspace Symbols' })
|
||||||
|
|
||||||
-- Jump to the type of the word under your cursor.
|
|
||||||
-- Useful when you're not sure what type a variable is and you want to see
|
|
||||||
-- the definition of its *type*, not where it was *defined*.
|
|
||||||
vim.keymap.set('n', 'grt', builtin.lsp_type_definitions, { buffer = buf, desc = '[G]oto [T]ype Definition' })
|
vim.keymap.set('n', 'grt', builtin.lsp_type_definitions, { buffer = buf, desc = '[G]oto [T]ype Definition' })
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Override default behavior and theme when searching
|
|
||||||
vim.keymap.set('n', '<leader>/', function()
|
vim.keymap.set('n', '<leader>/', function()
|
||||||
-- You can pass additional configuration to Telescope to change the theme, layout, etc.
|
builtin.current_buffer_fuzzy_find(require('telescope.themes').get_dropdown { winblend = 10, previewer = false })
|
||||||
builtin.current_buffer_fuzzy_find(require('telescope.themes').get_dropdown {
|
|
||||||
winblend = 10,
|
|
||||||
previewer = false,
|
|
||||||
})
|
|
||||||
end, { desc = '[/] Fuzzily search in current buffer' })
|
end, { desc = '[/] Fuzzily search in current buffer' })
|
||||||
|
|
||||||
-- It's also possible to pass additional configuration options.
|
vim.keymap.set('n', '<leader>s/', function()
|
||||||
-- See `:help telescope.builtin.live_grep()` for information about particular keys
|
builtin.live_grep { grep_open_files = true, prompt_title = 'Live Grep in Open Files' }
|
||||||
vim.keymap.set(
|
end, { desc = '[S]earch [/] in Open Files' })
|
||||||
'n',
|
|
||||||
'<leader>s/',
|
|
||||||
function()
|
|
||||||
builtin.live_grep {
|
|
||||||
grep_open_files = true,
|
|
||||||
prompt_title = 'Live Grep in Open Files',
|
|
||||||
}
|
|
||||||
end,
|
|
||||||
{ desc = '[S]earch [/] in Open Files' }
|
|
||||||
)
|
|
||||||
|
|
||||||
-- Shortcut for searching your Neovim configuration files
|
|
||||||
vim.keymap.set('n', '<leader>sn', function() builtin.find_files { cwd = vim.fn.stdpath 'config' } end, { desc = '[S]earch [N]eovim files' })
|
vim.keymap.set('n', '<leader>sn', function() builtin.find_files { cwd = vim.fn.stdpath 'config' } end, { desc = '[S]earch [N]eovim files' })
|
||||||
end
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
-- SECTION 5: LSP
|
-- SECTION 5: LSP
|
||||||
-- LSP keymaps, server configuration, Mason tools installations
|
-- ============================================================
|
||||||
-- ============================================================
|
|
||||||
do
|
|
||||||
-- [[ LSP Configuration ]]
|
|
||||||
-- Brief aside: **What is LSP?**
|
|
||||||
--
|
|
||||||
-- LSP is an initialism you've probably heard, but might not understand what it is.
|
|
||||||
--
|
|
||||||
-- LSP stands for Language Server Protocol. It's a protocol that helps editors
|
|
||||||
-- and language tooling communicate in a standardized fashion.
|
|
||||||
--
|
|
||||||
-- In general, you have a "server" which is some tool built to understand a particular
|
|
||||||
-- language (such as `gopls`, `lua_ls`, `rust_analyzer`, etc.). These Language Servers
|
|
||||||
-- (sometimes called LSP servers, but that's kind of like ATM Machine) are standalone
|
|
||||||
-- processes that communicate with some "client" - in this case, Neovim!
|
|
||||||
--
|
|
||||||
-- LSP provides Neovim with features like:
|
|
||||||
-- - Go to definition
|
|
||||||
-- - Find references
|
|
||||||
-- - Autocompletion
|
|
||||||
-- - Symbol Search
|
|
||||||
-- - and more!
|
|
||||||
--
|
|
||||||
-- Thus, Language Servers are external tools that must be installed separately from
|
|
||||||
-- Neovim. This is where `mason` and related plugins come into play.
|
|
||||||
--
|
|
||||||
-- If you're wondering about lsp vs treesitter, you can check out the wonderfully
|
|
||||||
-- and elegantly composed help section, `:help lsp-vs-treesitter`
|
|
||||||
|
|
||||||
-- Useful status updates for LSP.
|
{ 'j-hui/fidget.nvim', opts = {} },
|
||||||
vim.pack.add { gh 'j-hui/fidget.nvim' }
|
|
||||||
require('fidget').setup {}
|
|
||||||
|
|
||||||
-- This function gets run when an LSP attaches to a particular buffer.
|
{
|
||||||
-- That is to say, every time a new file is opened that is associated with
|
'neovim/nvim-lspconfig',
|
||||||
-- an lsp (for example, opening `main.rs` is associated with `rust_analyzer`) this
|
dependencies = {
|
||||||
-- function will be executed to configure the current buffer
|
'mason-org/mason.nvim',
|
||||||
|
'mason-org/mason-lspconfig.nvim',
|
||||||
|
'WhoIsSethDaniel/mason-tool-installer.nvim',
|
||||||
|
},
|
||||||
|
config = function()
|
||||||
vim.api.nvim_create_autocmd('LspAttach', {
|
vim.api.nvim_create_autocmd('LspAttach', {
|
||||||
group = vim.api.nvim_create_augroup('kickstart-lsp-attach', { clear = true }),
|
group = vim.api.nvim_create_augroup('kickstart-lsp-attach', { clear = true }),
|
||||||
callback = function(event)
|
callback = function(event)
|
||||||
-- NOTE: Remember that Lua is a real programming language, and as such it is possible
|
|
||||||
-- to define small helper and utility functions so you don't have to repeat yourself.
|
|
||||||
--
|
|
||||||
-- In this case, we create a function that lets us more easily define mappings specific
|
|
||||||
-- for LSP related items. It sets the mode, buffer and description for us each time.
|
|
||||||
local map = function(keys, func, desc, mode)
|
local map = function(keys, func, desc, mode)
|
||||||
mode = mode or 'n'
|
mode = mode or 'n'
|
||||||
vim.keymap.set(mode, keys, func, { buffer = event.buf, desc = 'LSP: ' .. desc })
|
vim.keymap.set(mode, keys, func, { buffer = event.buf, desc = 'LSP: ' .. desc })
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Rename the variable under your cursor.
|
|
||||||
-- Most Language Servers support renaming across files, etc.
|
|
||||||
map('grn', vim.lsp.buf.rename, '[R]e[n]ame')
|
map('grn', vim.lsp.buf.rename, '[R]e[n]ame')
|
||||||
|
|
||||||
-- Execute a code action, usually your cursor needs to be on top of an error
|
|
||||||
-- or a suggestion from your LSP for this to activate.
|
|
||||||
map('gra', vim.lsp.buf.code_action, '[G]oto Code [A]ction', { 'n', 'x' })
|
map('gra', vim.lsp.buf.code_action, '[G]oto Code [A]ction', { 'n', 'x' })
|
||||||
|
|
||||||
-- WARN: This is not Goto Definition, this is Goto Declaration.
|
|
||||||
-- For example, in C this would take you to the header.
|
|
||||||
map('grD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
|
map('grD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
|
||||||
|
|
||||||
-- The following two autocommands are used to highlight references of the
|
|
||||||
-- word under your cursor when your cursor rests there for a little while.
|
|
||||||
-- See `:help CursorHold` for information about when this is executed
|
|
||||||
--
|
|
||||||
-- When you move your cursor, the highlights will be cleared (the second autocommand).
|
|
||||||
local client = vim.lsp.get_client_by_id(event.data.client_id)
|
local client = vim.lsp.get_client_by_id(event.data.client_id)
|
||||||
if client and client:supports_method('textDocument/documentHighlight', event.buf) then
|
if client and client:supports_method('textDocument/documentHighlight', event.buf) then
|
||||||
local highlight_augroup = vim.api.nvim_create_augroup('kickstart-lsp-highlight', { clear = false })
|
local highlight_augroup = vim.api.nvim_create_augroup('kickstart-lsp-highlight', { clear = false })
|
||||||
|
|
@ -637,13 +424,11 @@ do
|
||||||
group = highlight_augroup,
|
group = highlight_augroup,
|
||||||
callback = vim.lsp.buf.document_highlight,
|
callback = vim.lsp.buf.document_highlight,
|
||||||
})
|
})
|
||||||
|
|
||||||
vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, {
|
vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, {
|
||||||
buffer = event.buf,
|
buffer = event.buf,
|
||||||
group = highlight_augroup,
|
group = highlight_augroup,
|
||||||
callback = vim.lsp.buf.clear_references,
|
callback = vim.lsp.buf.clear_references,
|
||||||
})
|
})
|
||||||
|
|
||||||
vim.api.nvim_create_autocmd('LspDetach', {
|
vim.api.nvim_create_autocmd('LspDetach', {
|
||||||
group = vim.api.nvim_create_augroup('kickstart-lsp-detach', { clear = true }),
|
group = vim.api.nvim_create_augroup('kickstart-lsp-detach', { clear = true }),
|
||||||
callback = function(event2)
|
callback = function(event2)
|
||||||
|
|
@ -653,38 +438,25 @@ do
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
-- The following code creates a keymap to toggle inlay hints in your
|
|
||||||
-- code, if the language server you are using supports them
|
|
||||||
--
|
|
||||||
-- This may be unwanted, since they displace some of your code
|
|
||||||
if client and client:supports_method('textDocument/inlayHint', event.buf) then
|
if client and client:supports_method('textDocument/inlayHint', event.buf) then
|
||||||
map('<leader>th', function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled { bufnr = event.buf }) end, '[T]oggle Inlay [H]ints')
|
map('<leader>th', function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled { bufnr = event.buf }) end, '[T]oggle Inlay [H]ints')
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Enable the following language servers
|
|
||||||
-- Feel free to add/remove any LSPs that you want here. They will automatically be installed.
|
|
||||||
-- See `:help lsp-config` for information about keys and how to configure
|
|
||||||
---@type table<string, vim.lsp.Config>
|
---@type table<string, vim.lsp.Config>
|
||||||
local servers = {
|
local servers = {
|
||||||
-- clangd = {},
|
-- clangd = {},
|
||||||
-- gopls = {},
|
-- gopls = {},
|
||||||
-- pyright = {},
|
-- pyright = {},
|
||||||
-- rust_analyzer = {},
|
-- rust_analyzer = {},
|
||||||
--
|
|
||||||
-- Some languages (like typescript) have entire language plugins that can be useful:
|
|
||||||
-- https://github.com/pmizio/typescript-tools.nvim
|
|
||||||
--
|
|
||||||
-- But for many setups, the LSP (`ts_ls`) will work just fine
|
|
||||||
-- ts_ls = {},
|
-- ts_ls = {},
|
||||||
|
|
||||||
stylua = {}, -- Used to format Lua code
|
stylua = {},
|
||||||
|
|
||||||
-- Special Lua Config, as recommended by neovim help docs
|
|
||||||
lua_ls = {
|
lua_ls = {
|
||||||
on_init = function(client)
|
on_init = function(client)
|
||||||
client.server_capabilities.documentFormattingProvider = false -- Disable formatting (formatting is done by stylua)
|
client.server_capabilities.documentFormattingProvider = false
|
||||||
|
|
||||||
if client.workspace_folders then
|
if client.workspace_folders then
|
||||||
local path = client.workspace_folders[1].name
|
local path = client.workspace_folders[1].name
|
||||||
|
|
@ -698,8 +470,6 @@ do
|
||||||
},
|
},
|
||||||
workspace = {
|
workspace = {
|
||||||
checkThirdParty = false,
|
checkThirdParty = false,
|
||||||
-- NOTE: this is a lot slower and will cause issues when working on your own configuration.
|
|
||||||
-- See https://github.com/neovim/nvim-lspconfig/issues/3189
|
|
||||||
library = vim.tbl_extend('force', vim.api.nvim_get_runtime_file('', true), {
|
library = vim.tbl_extend('force', vim.api.nvim_get_runtime_file('', true), {
|
||||||
'${3rd}/luv/library',
|
'${3rd}/luv/library',
|
||||||
'${3rd}/busted/library',
|
'${3rd}/busted/library',
|
||||||
|
|
@ -709,54 +479,36 @@ do
|
||||||
end,
|
end,
|
||||||
---@type lspconfig.settings.lua_ls
|
---@type lspconfig.settings.lua_ls
|
||||||
settings = {
|
settings = {
|
||||||
Lua = {
|
Lua = { format = { enable = false } },
|
||||||
format = { enable = false }, -- Disable formatting (formatting is done by stylua)
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
vim.pack.add {
|
|
||||||
gh 'neovim/nvim-lspconfig',
|
|
||||||
gh 'mason-org/mason.nvim',
|
|
||||||
gh 'mason-org/mason-lspconfig.nvim',
|
|
||||||
gh 'WhoIsSethDaniel/mason-tool-installer.nvim',
|
|
||||||
}
|
|
||||||
|
|
||||||
-- Automatically install LSPs and related tools to stdpath for Neovim
|
|
||||||
require('mason').setup {}
|
require('mason').setup {}
|
||||||
|
|
||||||
-- Ensure the servers and tools above are installed
|
|
||||||
--
|
|
||||||
-- To check the current status of installed tools and/or manually install
|
|
||||||
-- other tools, you can run
|
|
||||||
-- :Mason
|
|
||||||
--
|
|
||||||
-- You can press `g?` for help in this menu.
|
|
||||||
local ensure_installed = vim.tbl_keys(servers or {})
|
local ensure_installed = vim.tbl_keys(servers or {})
|
||||||
vim.list_extend(ensure_installed, {
|
vim.list_extend(ensure_installed, {
|
||||||
-- You can add other tools here that you want Mason to install
|
-- Add extra Mason tools here
|
||||||
})
|
})
|
||||||
|
|
||||||
require('mason-tool-installer').setup { ensure_installed = ensure_installed }
|
require('mason-tool-installer').setup { ensure_installed = ensure_installed }
|
||||||
|
|
||||||
for name, server in pairs(servers) do
|
for name, server in pairs(servers) do
|
||||||
vim.lsp.config(name, server)
|
vim.lsp.config(name, server)
|
||||||
vim.lsp.enable(name)
|
vim.lsp.enable(name)
|
||||||
end
|
end
|
||||||
end
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
-- SECTION 6: FORMATTING
|
-- SECTION 6: FORMATTING
|
||||||
-- conform.nvim setup and keymap
|
-- ============================================================
|
||||||
-- ============================================================
|
|
||||||
do
|
{
|
||||||
-- [[ Formatting ]]
|
'stevearc/conform.nvim',
|
||||||
vim.pack.add { gh 'stevearc/conform.nvim' }
|
config = function()
|
||||||
require('conform').setup {
|
require('conform').setup {
|
||||||
notify_on_error = false,
|
notify_on_error = false,
|
||||||
format_on_save = function(bufnr)
|
format_on_save = function(bufnr)
|
||||||
-- You can specify filetypes to autoformat on save here:
|
|
||||||
local enabled_filetypes = {
|
local enabled_filetypes = {
|
||||||
-- lua = true,
|
-- lua = true,
|
||||||
-- python = true,
|
-- python = true,
|
||||||
|
|
@ -768,139 +520,70 @@ do
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
default_format_opts = {
|
default_format_opts = {
|
||||||
lsp_format = 'fallback', -- Use external formatters if configured below, otherwise use LSP formatting. Set to `false` to disable LSP formatting entirely.
|
lsp_format = 'fallback',
|
||||||
},
|
},
|
||||||
-- You can also specify external formatters in here.
|
|
||||||
formatters_by_ft = {
|
formatters_by_ft = {
|
||||||
-- rust = { 'rustfmt' },
|
-- rust = { 'rustfmt' },
|
||||||
-- Conform can also run multiple formatters sequentially
|
|
||||||
-- python = { "isort", "black" },
|
-- python = { "isort", "black" },
|
||||||
--
|
|
||||||
-- You can use 'stop_after_first' to run the first available formatter from the list
|
|
||||||
-- javascript = { "prettierd", "prettier", stop_after_first = true },
|
-- javascript = { "prettierd", "prettier", stop_after_first = true },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
vim.keymap.set({ 'n', 'v' }, '<leader>f', function() require('conform').format { async = true } end, { desc = '[F]ormat buffer' })
|
vim.keymap.set({ 'n', 'v' }, '<leader>f', function() require('conform').format { async = true } end, { desc = '[F]ormat buffer' })
|
||||||
end
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
-- SECTION 7: AUTOCOMPLETE & SNIPPETS
|
-- SECTION 7: AUTOCOMPLETE & SNIPPETS
|
||||||
-- blink.cmp and luasnip setup
|
-- ============================================================
|
||||||
-- ============================================================
|
|
||||||
do
|
|
||||||
-- [[ Snippet Engine ]]
|
|
||||||
|
|
||||||
-- NOTE: You can also specify plugin using a version range for its git tag.
|
{
|
||||||
-- See `:help vim.version.range()` for more info
|
'L3MON4D3/LuaSnip',
|
||||||
vim.pack.add { { src = gh 'L3MON4D3/LuaSnip', version = vim.version.range '2.*' } }
|
version = '2.*',
|
||||||
|
build = (vim.fn.has('win32') ~= 1 and vim.fn.executable('make') == 1) and 'make install_jsregexp' or nil,
|
||||||
|
config = function()
|
||||||
require('luasnip').setup {}
|
require('luasnip').setup {}
|
||||||
|
|
||||||
-- `friendly-snippets` contains a variety of premade snippets.
|
|
||||||
-- See the README about individual language/framework/plugin snippets:
|
|
||||||
-- https://github.com/rafamadriz/friendly-snippets
|
|
||||||
--
|
|
||||||
-- vim.pack.add { gh 'rafamadriz/friendly-snippets' }
|
-- vim.pack.add { gh 'rafamadriz/friendly-snippets' }
|
||||||
-- require('luasnip.loaders.from_vscode').lazy_load()
|
-- require('luasnip.loaders.from_vscode').lazy_load()
|
||||||
|
end,
|
||||||
-- [[ Autocomplete Engine ]]
|
|
||||||
vim.pack.add { { src = gh 'saghen/blink.cmp', version = vim.version.range '1.*' } }
|
|
||||||
require('blink.cmp').setup {
|
|
||||||
keymap = {
|
|
||||||
-- 'default' (recommended) for mappings similar to built-in completions
|
|
||||||
-- <c-y> to accept ([y]es) the completion.
|
|
||||||
-- This will auto-import if your LSP supports it.
|
|
||||||
-- This will expand snippets if the LSP sent a snippet.
|
|
||||||
-- 'super-tab' for tab to accept
|
|
||||||
-- 'enter' for enter to accept
|
|
||||||
-- 'none' for no mappings
|
|
||||||
--
|
|
||||||
-- For an understanding of why the 'default' preset is recommended,
|
|
||||||
-- you will need to read `:help ins-completion`
|
|
||||||
--
|
|
||||||
-- No, but seriously. Please read `:help ins-completion`, it is really good!
|
|
||||||
--
|
|
||||||
-- All presets have the following mappings:
|
|
||||||
-- <tab>/<s-tab>: move to right/left of your snippet expansion
|
|
||||||
-- <c-space>: Open menu or open docs if already open
|
|
||||||
-- <c-n>/<c-p> or <up>/<down>: Select next/previous item
|
|
||||||
-- <c-e>: Hide menu
|
|
||||||
-- <c-k>: Toggle signature help
|
|
||||||
--
|
|
||||||
-- See `:help blink-cmp-config-keymap` for defining your own keymap
|
|
||||||
preset = 'default',
|
|
||||||
|
|
||||||
-- For more advanced Luasnip keymaps (e.g. selecting choice nodes, expansion) see:
|
|
||||||
-- https://github.com/L3MON4D3/LuaSnip?tab=readme-ov-file#keymaps
|
|
||||||
},
|
|
||||||
|
|
||||||
appearance = {
|
|
||||||
-- 'mono' (default) for 'Nerd Font Mono' or 'normal' for 'Nerd Font'
|
|
||||||
-- Adjusts spacing to ensure icons are aligned
|
|
||||||
nerd_font_variant = 'mono',
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
'saghen/blink.cmp',
|
||||||
|
version = '1.*',
|
||||||
|
dependencies = { 'L3MON4D3/LuaSnip' },
|
||||||
|
opts = {
|
||||||
|
keymap = { preset = 'default' },
|
||||||
|
appearance = { nerd_font_variant = 'mono' },
|
||||||
completion = {
|
completion = {
|
||||||
-- By default, you may press `<c-space>` to show the documentation.
|
|
||||||
-- Optionally, set `auto_show = true` to show the documentation after a delay.
|
|
||||||
documentation = { auto_show = false, auto_show_delay_ms = 500 },
|
documentation = { auto_show = false, auto_show_delay_ms = 500 },
|
||||||
},
|
},
|
||||||
|
sources = { default = { 'lsp', 'path', 'snippets' } },
|
||||||
sources = {
|
snippets = { preset = 'luasnip' },
|
||||||
default = { 'lsp', 'path', 'snippets' },
|
fuzzy = { implementation = 'lua' },
|
||||||
|
signature = { enabled = true },
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
snippets = { preset = 'luasnip' },
|
-- ============================================================
|
||||||
|
-- SECTION 8: TREESITTER
|
||||||
|
-- ============================================================
|
||||||
|
|
||||||
-- Blink.cmp includes an optional, recommended rust fuzzy matcher,
|
{
|
||||||
-- which automatically downloads a prebuilt binary when enabled.
|
'nvim-treesitter/nvim-treesitter',
|
||||||
--
|
branch = 'main',
|
||||||
-- By default, we use the Lua implementation instead, but you may enable
|
build = ':TSUpdate',
|
||||||
-- the rust implementation via `'prefer_rust_with_warning'`
|
config = function()
|
||||||
--
|
|
||||||
-- See `:help blink-cmp-config-fuzzy` for more information
|
|
||||||
fuzzy = { implementation = 'lua' },
|
|
||||||
|
|
||||||
-- Shows a signature help window while you type arguments for a function
|
|
||||||
signature = { enabled = true },
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
-- ============================================================
|
|
||||||
-- SECTION 8: TREESITTER
|
|
||||||
-- Parser installation, syntax highlighting, folds, indentation
|
|
||||||
-- ============================================================
|
|
||||||
do
|
|
||||||
-- [[ Configure Treesitter ]]
|
|
||||||
-- Used to highlight, edit, and navigate code
|
|
||||||
--
|
|
||||||
-- See `:help nvim-treesitter-intro`
|
|
||||||
|
|
||||||
-- NOTE: You can also specify a branch or a specific commit
|
|
||||||
vim.pack.add { { src = gh 'nvim-treesitter/nvim-treesitter', version = 'main' } }
|
|
||||||
|
|
||||||
-- Ensure basic parsers are installed
|
|
||||||
local parsers = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' }
|
local parsers = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' }
|
||||||
require('nvim-treesitter').install(parsers)
|
require('nvim-treesitter').install(parsers)
|
||||||
|
|
||||||
---@param buf integer
|
---@param buf integer
|
||||||
---@param language string
|
---@param language string
|
||||||
local function treesitter_try_attach(buf, language)
|
local function treesitter_try_attach(buf, language)
|
||||||
-- Check if a parser exists and load it
|
|
||||||
if not vim.treesitter.language.add(language) then return end
|
if not vim.treesitter.language.add(language) then return end
|
||||||
-- Enable syntax highlighting and other treesitter features
|
|
||||||
vim.treesitter.start(buf, language)
|
vim.treesitter.start(buf, language)
|
||||||
|
|
||||||
-- Enable treesitter based folds
|
|
||||||
-- For more info on folds see `:help folds`
|
|
||||||
-- vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()'
|
-- vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()'
|
||||||
-- vim.wo.foldmethod = 'expr'
|
-- 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
|
local has_indent_query = vim.treesitter.query.get(language, 'indents') ~= nil
|
||||||
|
|
||||||
-- Enable treesitter based indentation
|
|
||||||
if has_indent_query then vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" end
|
if has_indent_query then vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -908,53 +591,42 @@ do
|
||||||
vim.api.nvim_create_autocmd('FileType', {
|
vim.api.nvim_create_autocmd('FileType', {
|
||||||
callback = function(args)
|
callback = function(args)
|
||||||
local buf, filetype = args.buf, args.match
|
local buf, filetype = args.buf, args.match
|
||||||
|
|
||||||
local language = vim.treesitter.language.get_lang(filetype)
|
local language = vim.treesitter.language.get_lang(filetype)
|
||||||
if not language then return end
|
if not language then return end
|
||||||
|
|
||||||
local installed_parsers = require('nvim-treesitter').get_installed 'parsers'
|
local installed_parsers = require('nvim-treesitter').get_installed 'parsers'
|
||||||
|
|
||||||
if vim.tbl_contains(installed_parsers, language) then
|
if vim.tbl_contains(installed_parsers, language) then
|
||||||
-- Enable the parser if it is already installed
|
|
||||||
treesitter_try_attach(buf, language)
|
treesitter_try_attach(buf, language)
|
||||||
elseif vim.tbl_contains(available_parsers, language) then
|
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)
|
require('nvim-treesitter').install(language):await(function() treesitter_try_attach(buf, language) end)
|
||||||
else
|
else
|
||||||
-- Try to enable treesitter features in case the parser exists but is not available from `nvim-treesitter`
|
|
||||||
treesitter_try_attach(buf, language)
|
treesitter_try_attach(buf, language)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
end
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
-- SECTION 9: OPTIONAL EXAMPLES / NEXT STEPS
|
-- SECTION 9: KICKSTART OPTIONAL PLUGINS
|
||||||
-- kickstart.plugins.* examples
|
-- ============================================================
|
||||||
-- ============================================================
|
|
||||||
do
|
|
||||||
-- The following comments only work if you have downloaded the kickstart repo, not just copy pasted the
|
|
||||||
-- init.lua. If you want these files, they are in the repository, so you can just download them and
|
|
||||||
-- place them in the correct locations.
|
|
||||||
|
|
||||||
-- NOTE: Next step on your Neovim journey: Add/Configure additional plugins for Kickstart
|
{ import = 'kickstart.plugins.indent_line' },
|
||||||
--
|
{ import = 'kickstart.plugins.lint' },
|
||||||
-- Here are some example plugins that I've included in the Kickstart repository.
|
-- { import = 'kickstart.plugins.debug' },
|
||||||
-- Uncomment any of the lines below to enable them (you will need to restart nvim).
|
-- { import = 'kickstart.plugins.autopairs' },
|
||||||
--
|
-- { import = 'kickstart.plugins.neo-tree' },
|
||||||
-- require 'kickstart.plugins.debug'
|
{ import = 'kickstart.plugins.gitsigns' },
|
||||||
require 'kickstart.plugins.indent_line'
|
|
||||||
require 'kickstart.plugins.lint'
|
|
||||||
-- require 'kickstart.plugins.autopairs'
|
|
||||||
-- require 'kickstart.plugins.neo-tree'
|
|
||||||
require 'kickstart.plugins.gitsigns' -- adds gitsigns recommended keymaps
|
|
||||||
|
|
||||||
-- NOTE: You can add your own plugins, configuration, etc from `lua/custom/plugins/*.lua`
|
-- ============================================================
|
||||||
--
|
-- CUSTOM PLUGINS
|
||||||
|
-- ============================================================
|
||||||
|
|
||||||
-- Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going.
|
{ import = 'custom.plugins' },
|
||||||
-- require 'custom.plugins'
|
},
|
||||||
end
|
|
||||||
|
install = { colorscheme = { 'gruvbox-medium', 'habamax' } },
|
||||||
|
checker = { enabled = false },
|
||||||
|
})
|
||||||
|
|
||||||
-- The line beneath this is called `modeline`. See `:help modeline`
|
-- The line beneath this is called `modeline`. See `:help modeline`
|
||||||
-- vim: ts=2 sts=2 sw=2 et
|
-- vim: ts=2 sts=2 sw=2 et
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,35 @@
|
||||||
{
|
{
|
||||||
|
"LuaSnip": { "branch": "master", "commit": "642b0c595e11608b4c18219e93b88d7637af27bc" },
|
||||||
|
"blink.cmp": { "branch": "main", "commit": "78336bc89ee5365633bcf754d93df01678b5c08f" },
|
||||||
|
"claudecode.nvim": { "branch": "main", "commit": "102d835c964069c9c5e37abaf05ae4f9c3ee6f00" },
|
||||||
|
"conform.nvim": { "branch": "master", "commit": "619363c30309d29ffa631e67c8183f2a72caa373" },
|
||||||
|
"fidget.nvim": { "branch": "main", "commit": "82404b196e73a00b1727a91903beef5ddc319d22" },
|
||||||
|
"fzf-lua": { "branch": "main", "commit": "fea9eedc6894c44d44cbb772a5cd11c93b82d7a1" },
|
||||||
|
"gitsigns.nvim": { "branch": "main", "commit": "dd3f588bacbeb041be6facf1742e42097f62165d" },
|
||||||
|
"gruvbox.nvim": { "branch": "main", "commit": "c14c475585494c592ef48064ad338424f15f8bad" },
|
||||||
|
"guess-indent.nvim": { "branch": "main", "commit": "84a4987ff36798c2fc1169cbaff67960aed9776f" },
|
||||||
|
"image.nvim": { "branch": "master", "commit": "44e07129cd0ea0c60afa7a1991d35b5765b51a6b" },
|
||||||
|
"indent-blankline.nvim": { "branch": "master", "commit": "d28a3f70721c79e3c5f6693057ae929f3d9c0a03" },
|
||||||
"lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" },
|
"lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" },
|
||||||
"mini.icons": { "branch": "main", "commit": "9c7b1b90b15bdd69c52f6e31889dbc9987c30ec4" },
|
"live-preview.nvim": { "branch": "main", "commit": "c1fcf75c5f9c9c01dd392852de44204b60f1b5b1" },
|
||||||
"oil.nvim": { "branch": "master", "commit": "0fcc83805ad11cf714a949c98c605ed717e0b83e" }
|
"mason-lspconfig.nvim": { "branch": "main", "commit": "7b01e2974a47d489bb92f47a41e4c0088ea8f86e" },
|
||||||
|
"mason-tool-installer.nvim": { "branch": "main", "commit": "443f1ef8b5e6bf47045cb2217b6f748a223cf7dc" },
|
||||||
|
"mason.nvim": { "branch": "main", "commit": "bb639d4bf385a4d89f478b83af4d770be05ab7eb" },
|
||||||
|
"mini.nvim": { "branch": "main", "commit": "44657837c7338e52727facc85c1d95bec1f6bd7c" },
|
||||||
|
"mini.pick": { "branch": "main", "commit": "4522d9ab65224675df2cf1ede8c12f0410aae2be" },
|
||||||
|
"molten-nvim": { "branch": "main", "commit": "a286aa914d9a154bc359131aab788b5a077a5a99" },
|
||||||
|
"nvim-lint": { "branch": "master", "commit": "d48f3a76189d03b2239f6df1b2f7e3fa8353743b" },
|
||||||
|
"nvim-lspconfig": { "branch": "master", "commit": "6f76a3eeadc2ee235d74cd7d5319e95a261084af" },
|
||||||
|
"nvim-treesitter": { "branch": "main", "commit": "4916d6592ede8c07973490d9322f187e07dfefac" },
|
||||||
|
"nvim-web-devicons": { "branch": "master", "commit": "dfbfaa967a6f7ec50789bead7ef87e336c1fa63c" },
|
||||||
|
"oil.nvim": { "branch": "master", "commit": "0fcc83805ad11cf714a949c98c605ed717e0b83e" },
|
||||||
|
"plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" },
|
||||||
|
"snacks.nvim": { "branch": "main", "commit": "882c996cf28183f4d63640de0b4c02ec886d01f2" },
|
||||||
|
"telescope-fzf-native.nvim": { "branch": "main", "commit": "b25b749b9db64d375d782094e2b9dce53ad53a40" },
|
||||||
|
"telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" },
|
||||||
|
"telescope.nvim": { "branch": "master", "commit": "7d324792b7943e4aa16ad007212e6acc6f9fe335" },
|
||||||
|
"todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" },
|
||||||
|
"tokyonight.nvim": { "branch": "main", "commit": "cdc07ac78467a233fd62c493de29a17e0cf2b2b6" },
|
||||||
|
"wezterm.nvim": { "branch": "main", "commit": "032c33b621b96cc7228955b4352b48141c482098" },
|
||||||
|
"which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,3 @@
|
||||||
-- You can add your own plugins here or in other files in this directory!
|
-- Lazy auto-discovers all *.lua files in this directory.
|
||||||
-- I promise not to create any merge conflicts in this directory :)
|
-- This file is intentionally empty (lazy imports the other files directly).
|
||||||
--
|
return {}
|
||||||
-- See the kickstart.nvim README for more information
|
|
||||||
|
|
||||||
-- Iterate over all Lua files in the plugins directory and load them
|
|
||||||
local plugins_dir = vim.fs.joinpath(vim.fn.stdpath 'config', 'lua', 'custom', 'plugins')
|
|
||||||
for file_name, type in vim.fs.dir(plugins_dir) do
|
|
||||||
if type == 'file' and file_name:match '%.lua$' and file_name ~= 'init.lua' then
|
|
||||||
local module = file_name:gsub('%.lua$', '')
|
|
||||||
require('custom.plugins.' .. module)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
--return {}
|
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,11 @@
|
||||||
-- Define the configuration for the dbt language server
|
-- dbt language server (requires dbt-language-server in $PATH)
|
||||||
|
-- Uses native Neovim LSP APIs — no extra plugin needed.
|
||||||
vim.lsp.config('dbt', {
|
vim.lsp.config('dbt', {
|
||||||
-- The command to start the server
|
cmd = { 'dbt-language-server' },
|
||||||
-- Ensure 'dbt-language-server' is in your system $PATH
|
filetypes = { 'sql', 'yaml' },
|
||||||
cmd = { "dbt-language-server" },
|
root_markers = { 'dbt_project.yml' },
|
||||||
|
|
||||||
-- The filetypes this server should attach to
|
|
||||||
filetypes = { "sql", "yaml" },
|
|
||||||
|
|
||||||
-- How to find the project root (replaces util.root_pattern)
|
|
||||||
root_markers = { "dbt_project.yml" },
|
|
||||||
|
|
||||||
-- General settings (standard for most servers)
|
|
||||||
settings = {},
|
settings = {},
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Tell Neovim to actually use/enable this server
|
|
||||||
vim.lsp.enable('dbt')
|
vim.lsp.enable('dbt')
|
||||||
|
|
||||||
|
return {}
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ return {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'willothy/wezterm.nvim',
|
'willothy/wezterm.nvim',
|
||||||
|
cond = vim.fn.executable('wezterm') == 1,
|
||||||
config = true
|
config = true
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
-- Initialize the icons (optional, but highly recommended for Oil)
|
return {
|
||||||
require('mini.icons').setup({})
|
'stevearc/oil.nvim',
|
||||||
|
dependencies = { 'nvim-mini/mini.nvim' },
|
||||||
-- Initialize and configure Oil
|
config = function()
|
||||||
require('oil').setup({
|
require('mini.icons').setup()
|
||||||
-- You can add any custom oil options here later!
|
require('oil').setup()
|
||||||
})
|
end,
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,19 @@
|
||||||
-- [[ Colorscheme ]]
|
return {
|
||||||
-- You can easily change to a different colorscheme.
|
{
|
||||||
-- Change the name of the colorscheme plugin below, and then
|
'folke/tokyonight.nvim',
|
||||||
-- change the command under that to load whatever the name of that colorscheme is.
|
opts = {
|
||||||
--
|
|
||||||
-- If you want to see what colorschemes are already installed, you can use `:Telescope colorscheme`.
|
|
||||||
vim.pack.add { 'folke/tokyonight.nvim' }
|
|
||||||
---@diagnostic disable-next-line: missing-fields
|
|
||||||
require('tokyonight').setup {
|
|
||||||
styles = {
|
styles = {
|
||||||
comments = { italic = false }, -- Disable italics in comments
|
comments = { italic = false },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'motaz-shokry/gruvbox.nvim',
|
||||||
|
url = 'https://gitlab.com/motaz-shokry/gruvbox.nvim',
|
||||||
|
priority = 1000,
|
||||||
|
config = function()
|
||||||
|
require('gruvbox').setup()
|
||||||
|
vim.cmd('colorscheme gruvbox-medium')
|
||||||
|
end,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
vim.pack.add({
|
|
||||||
{ src = "https://gitlab.com/motaz-shokry/gruvbox.nvim" }
|
|
||||||
})
|
|
||||||
|
|
||||||
require("gruvbox").setup() -- for configs
|
|
||||||
vim.cmd("colorscheme gruvbox-medium") -- apply the theme
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,9 @@
|
||||||
-- NOTE: gitsigns is already included in init.lua but contains only the base
|
-- NOTE: gitsigns is already included in init.lua but contains only the base
|
||||||
-- config. This will add also the recommended keymaps.
|
-- config. This will add also the recommended keymaps.
|
||||||
|
|
||||||
vim.pack.add { 'https://github.com/lewis6991/gitsigns.nvim' }
|
return {
|
||||||
|
'lewis6991/gitsigns.nvim',
|
||||||
require('gitsigns').setup {
|
opts = {
|
||||||
on_attach = function(bufnr)
|
on_attach = function(bufnr)
|
||||||
local gitsigns = require 'gitsigns'
|
local gitsigns = require 'gitsigns'
|
||||||
|
|
||||||
|
|
@ -31,11 +31,10 @@ require('gitsigns').setup {
|
||||||
end
|
end
|
||||||
end, { desc = 'Jump to previous git [c]hange' })
|
end, { desc = 'Jump to previous git [c]hange' })
|
||||||
|
|
||||||
-- Actions
|
-- Actions (visual mode)
|
||||||
-- visual mode
|
|
||||||
map('v', '<leader>hs', function() gitsigns.stage_hunk { vim.fn.line '.', vim.fn.line 'v' } end, { desc = 'git [s]tage hunk' })
|
map('v', '<leader>hs', function() gitsigns.stage_hunk { vim.fn.line '.', vim.fn.line 'v' } end, { desc = 'git [s]tage hunk' })
|
||||||
map('v', '<leader>hr', function() gitsigns.reset_hunk { vim.fn.line '.', vim.fn.line 'v' } end, { desc = 'git [r]eset hunk' })
|
map('v', '<leader>hr', function() gitsigns.reset_hunk { vim.fn.line '.', vim.fn.line 'v' } end, { desc = 'git [r]eset hunk' })
|
||||||
-- normal mode
|
-- Actions (normal mode)
|
||||||
map('n', '<leader>hs', gitsigns.stage_hunk, { desc = 'git [s]tage hunk' })
|
map('n', '<leader>hs', gitsigns.stage_hunk, { desc = 'git [s]tage hunk' })
|
||||||
map('n', '<leader>hr', gitsigns.reset_hunk, { desc = 'git [r]eset hunk' })
|
map('n', '<leader>hr', gitsigns.reset_hunk, { desc = 'git [r]eset hunk' })
|
||||||
map('n', '<leader>hS', gitsigns.stage_buffer, { desc = 'git [S]tage buffer' })
|
map('n', '<leader>hS', gitsigns.stage_buffer, { desc = 'git [S]tage buffer' })
|
||||||
|
|
@ -54,4 +53,5 @@ require('gitsigns').setup {
|
||||||
-- Text object
|
-- Text object
|
||||||
map({ 'o', 'x' }, 'ih', gitsigns.select_hunk)
|
map({ 'o', 'x' }, 'ih', gitsigns.select_hunk)
|
||||||
end,
|
end,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
-- Add indentation guides even on blank lines
|
return {
|
||||||
|
'lukas-reineke/indent-blankline.nvim',
|
||||||
-- Enable `lukas-reineke/indent-blankline.nvim`
|
main = 'ibl',
|
||||||
-- See `:help ibl`
|
opts = {},
|
||||||
vim.pack.add { 'https://github.com/lukas-reineke/indent-blankline.nvim' }
|
}
|
||||||
require('ibl').setup {}
|
|
||||||
|
|
|
||||||
|
|
@ -1,53 +1,16 @@
|
||||||
-- Linting
|
return {
|
||||||
|
'mfussenegger/nvim-lint',
|
||||||
vim.pack.add { 'https://github.com/mfussenegger/nvim-lint' }
|
config = function()
|
||||||
|
local lint = require 'lint'
|
||||||
local lint = require 'lint'
|
lint.linters_by_ft = {
|
||||||
lint.linters_by_ft = {
|
markdown = { 'markdownlint' },
|
||||||
markdown = { 'markdownlint' }, -- Make sure to install `markdownlint` via mason / npm
|
}
|
||||||
}
|
local lint_augroup = vim.api.nvim_create_augroup('lint', { clear = true })
|
||||||
|
vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, {
|
||||||
-- To allow other plugins to add linters to require('lint').linters_by_ft,
|
|
||||||
-- instead set linters_by_ft like this:
|
|
||||||
-- lint.linters_by_ft = lint.linters_by_ft or {}
|
|
||||||
-- lint.linters_by_ft['markdown'] = { 'markdownlint' }
|
|
||||||
--
|
|
||||||
-- However, note that this will enable a set of default linters,
|
|
||||||
-- which will cause errors unless these tools are available:
|
|
||||||
-- {
|
|
||||||
-- clojure = { "clj-kondo" },
|
|
||||||
-- dockerfile = { "hadolint" },
|
|
||||||
-- inko = { "inko" },
|
|
||||||
-- janet = { "janet" },
|
|
||||||
-- json = { "jsonlint" },
|
|
||||||
-- markdown = { "vale" },
|
|
||||||
-- rst = { "vale" },
|
|
||||||
-- ruby = { "ruby" },
|
|
||||||
-- terraform = { "tflint" },
|
|
||||||
-- text = { "vale" }
|
|
||||||
-- }
|
|
||||||
--
|
|
||||||
-- You can disable the default linters by setting their filetypes to nil:
|
|
||||||
-- lint.linters_by_ft['clojure'] = nil
|
|
||||||
-- lint.linters_by_ft['dockerfile'] = nil
|
|
||||||
-- lint.linters_by_ft['inko'] = nil
|
|
||||||
-- lint.linters_by_ft['janet'] = nil
|
|
||||||
-- lint.linters_by_ft['json'] = nil
|
|
||||||
-- lint.linters_by_ft['markdown'] = nil
|
|
||||||
-- lint.linters_by_ft['rst'] = nil
|
|
||||||
-- lint.linters_by_ft['ruby'] = nil
|
|
||||||
-- lint.linters_by_ft['terraform'] = nil
|
|
||||||
-- lint.linters_by_ft['text'] = nil
|
|
||||||
|
|
||||||
-- Create autocommand which carries out the actual linting
|
|
||||||
-- on the specified events.
|
|
||||||
local lint_augroup = vim.api.nvim_create_augroup('lint', { clear = true })
|
|
||||||
vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, {
|
|
||||||
group = lint_augroup,
|
group = lint_augroup,
|
||||||
callback = function()
|
callback = function()
|
||||||
-- Only run the linter in buffers that you can modify in order to
|
|
||||||
-- avoid superfluous noise, notably within the handy LSP pop-ups that
|
|
||||||
-- describe the hovered symbol using Markdown.
|
|
||||||
if vim.bo.modifiable then lint.try_lint() end
|
if vim.bo.modifiable then lint.try_lint() end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue