Split into sections

This commit is contained in:
orip 2026-04-23 21:01:25 +03:00
parent a42ed30a09
commit 2e8d5b17cb

784
init.lua
View File

@ -84,99 +84,104 @@ I hope you enjoy your Neovim journey,
P.S. You can delete this when you're done too. It's your config now! :) P.S. You can delete this when you're done too. It's your config now! :)
--]] --]]
-- Enable faster startup by caching compiled Lua modules -- ============================================================
vim.loader.enable() -- SECTION 1: FOUNDATION
-- Core Neovim settings, leaders, options, basic keymaps, basic autocmds
-- ============================================================
do
-- Enable faster startup by caching compiled Lua modules
vim.loader.enable()
-- Set <space> as the leader key -- Set <space> as the leader key
-- See `:help mapleader` -- See `:help mapleader`
-- NOTE: Must happen before plugins are loaded (otherwise wrong leader will be used) -- NOTE: Must happen before plugins are loaded (otherwise wrong leader will be used)
vim.g.mapleader = ' ' vim.g.mapleader = ' '
vim.g.maplocalleader = ' ' vim.g.maplocalleader = ' '
-- Set to true if you have a Nerd Font installed and selected in the terminal -- Set to true if you have a Nerd Font installed and selected in the terminal
vim.g.have_nerd_font = false vim.g.have_nerd_font = false
-- [[ Setting options ]] -- [[ Setting options ]]
-- See `:help vim.o` -- See `:help vim.o`
-- NOTE: You can change these options as you wish! -- NOTE: You can change these options as you wish!
-- For more options, you can see `:help option-list` -- For more options, you can see `:help option-list`
-- Make line numbers default -- Make line numbers default
vim.o.number = true vim.o.number = true
-- You can also add relative line numbers, to help with jumping. -- You can also add relative line numbers, to help with jumping.
-- Experiment for yourself to see if you like it! -- Experiment for yourself to see if you like it!
-- vim.o.relativenumber = true -- vim.o.relativenumber = true
-- Enable mouse mode, can be useful for resizing splits for example! -- Enable mouse mode, can be useful for resizing splits for example!
vim.o.mouse = 'a' vim.o.mouse = 'a'
-- Don't show the mode, since it's already in the status line -- Don't show the mode, since it's already in the status line
vim.o.showmode = false vim.o.showmode = false
-- Sync clipboard between OS and Neovim. -- Sync clipboard between OS and Neovim.
-- Schedule the setting after `UiEnter` because it can increase startup-time. -- Schedule the setting after `UiEnter` because it can increase startup-time.
-- Remove this option if you want your OS clipboard to remain independent. -- Remove this option if you want your OS clipboard to remain independent.
-- See `:help 'clipboard'` -- See `:help 'clipboard'`
vim.schedule(function() vim.o.clipboard = 'unnamedplus' end) vim.schedule(function() vim.o.clipboard = 'unnamedplus' end)
-- Enable break indent -- Enable break indent
vim.o.breakindent = true vim.o.breakindent = true
-- Enable undo/redo changes even after closing and reopening a file -- Enable undo/redo changes even after closing and reopening a file
vim.o.undofile = true vim.o.undofile = true
-- Case-insensitive searching UNLESS \C or one or more capital letters in the search term -- Case-insensitive searching UNLESS \C or one or more capital letters in the search term
vim.o.ignorecase = true vim.o.ignorecase = true
vim.o.smartcase = true vim.o.smartcase = true
-- Keep signcolumn on by default -- Keep signcolumn on by default
vim.o.signcolumn = 'yes' vim.o.signcolumn = 'yes'
-- Decrease update time -- Decrease update time
vim.o.updatetime = 250 vim.o.updatetime = 250
-- Decrease mapped sequence wait time -- Decrease mapped sequence wait time
vim.o.timeoutlen = 300 vim.o.timeoutlen = 300
-- Configure how new splits should be opened -- Configure how new splits should be opened
vim.o.splitright = true vim.o.splitright = true
vim.o.splitbelow = true vim.o.splitbelow = true
-- Sets how neovim will display certain whitespace characters in the editor. -- Sets how neovim will display certain whitespace characters in the editor.
-- See `:help 'list'` -- See `:help 'list'`
-- and `:help 'listchars'` -- and `:help 'listchars'`
-- --
-- Notice listchars is set using `vim.opt` instead of `vim.o`. -- Notice listchars is set using `vim.opt` instead of `vim.o`.
-- It is very similar to `vim.o` but offers an interface for conveniently interacting with tables. -- It is very similar to `vim.o` but offers an interface for conveniently interacting with tables.
-- See `:help lua-options` -- See `:help lua-options`
-- and `:help lua-guide-options` -- and `:help lua-guide-options`
vim.o.list = true vim.o.list = true
vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '' } vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '' }
-- Preview substitutions live, as you type! -- Preview substitutions live, as you type!
vim.o.inccommand = 'split' vim.o.inccommand = 'split'
-- Show which line your cursor is on -- Show which line your cursor is on
vim.o.cursorline = true vim.o.cursorline = true
-- Minimal number of screen lines to keep above and below the cursor. -- Minimal number of screen lines to keep above and below the cursor.
vim.o.scrolloff = 10 vim.o.scrolloff = 10
-- if performing an operation that would fail due to unsaved changes in the buffer (like `:q`), -- if performing an operation that would fail due to unsaved changes in the buffer (like `:q`),
-- instead raise a dialog asking if you wish to save the current file(s) -- instead raise a dialog asking if you wish to save the current file(s)
-- See `:help 'confirm'` -- See `:help 'confirm'`
vim.o.confirm = true vim.o.confirm = true
-- [[ Basic Keymaps ]] -- [[ Basic Keymaps ]]
-- See `:help vim.keymap.set()` -- See `:help vim.keymap.set()`
-- Clear highlights on search when pressing <Esc> in normal mode -- Clear highlights on search when pressing <Esc> in normal mode
-- See `:help hlsearch` -- See `:help hlsearch`
vim.keymap.set('n', '<Esc>', '<cmd>nohlsearch<CR>') vim.keymap.set('n', '<Esc>', '<cmd>nohlsearch<CR>')
-- Diagnostic Config & Keymaps -- Diagnostic Config & Keymaps
-- See `:help vim.diagnostic.Opts` -- See `:help vim.diagnostic.Opts`
vim.diagnostic.config { vim.diagnostic.config {
update_in_insert = false, update_in_insert = false,
severity_sort = true, severity_sort = true,
float = { border = 'rounded', source = 'if_many' }, float = { border = 'rounded', source = 'if_many' },
@ -188,63 +193,69 @@ vim.diagnostic.config {
-- Auto open the float, so you can easily read the errors when jumping with `[d` and `]d` -- Auto open the float, so you can easily read the errors when jumping with `[d` and `]d`
jump = { float = true }, jump = { float = true },
} }
vim.keymap.set('n', '<leader>q', vim.diagnostic.setloclist, { desc = 'Open diagnostic [Q]uickfix list' }) vim.keymap.set('n', '<leader>q', vim.diagnostic.setloclist, { desc = 'Open diagnostic [Q]uickfix list' })
-- Exit terminal mode in the builtin terminal with a shortcut that is a bit easier -- Exit terminal mode in the builtin terminal with a shortcut that is a bit easier
-- for people to discover. Otherwise, you normally need to press <C-\><C-n>, which -- for people to discover. Otherwise, you normally need to press <C-\><C-n>, which
-- is not what someone will guess without a bit more experience. -- is not what someone will guess without a bit more experience.
-- --
-- NOTE: This won't work in all terminal emulators/tmux/etc. Try your own mapping -- NOTE: This won't work in all terminal emulators/tmux/etc. Try your own mapping
-- or just use <C-\><C-n> to exit terminal mode -- or just use <C-\><C-n> to exit terminal mode
vim.keymap.set('t', '<Esc><Esc>', '<C-\\><C-n>', { desc = 'Exit terminal mode' }) vim.keymap.set('t', '<Esc><Esc>', '<C-\\><C-n>', { desc = 'Exit terminal mode' })
-- TIP: Disable arrow keys in normal mode -- TIP: Disable arrow keys in normal mode
-- vim.keymap.set('n', '<left>', '<cmd>echo "Use h to move!!"<CR>') -- vim.keymap.set('n', '<left>', '<cmd>echo "Use h to move!!"<CR>')
-- vim.keymap.set('n', '<right>', '<cmd>echo "Use l to move!!"<CR>') -- vim.keymap.set('n', '<right>', '<cmd>echo "Use l to move!!"<CR>')
-- vim.keymap.set('n', '<up>', '<cmd>echo "Use k to move!!"<CR>') -- vim.keymap.set('n', '<up>', '<cmd>echo "Use k to move!!"<CR>')
-- vim.keymap.set('n', '<down>', '<cmd>echo "Use j to move!!"<CR>') -- vim.keymap.set('n', '<down>', '<cmd>echo "Use j to move!!"<CR>')
-- Keybinds to make split navigation easier. -- Keybinds to make split navigation easier.
-- Use CTRL+<hjkl> to switch between windows -- Use CTRL+<hjkl> to switch between windows
-- --
-- See `:help wincmd` for a list of all window commands -- See `:help wincmd` for a list of all window commands
vim.keymap.set('n', '<C-h>', '<C-w><C-h>', { desc = 'Move focus to the left window' }) vim.keymap.set('n', '<C-h>', '<C-w><C-h>', { desc = 'Move focus to the left window' })
vim.keymap.set('n', '<C-l>', '<C-w><C-l>', { desc = 'Move focus to the right window' }) vim.keymap.set('n', '<C-l>', '<C-w><C-l>', { desc = 'Move focus to the right window' })
vim.keymap.set('n', '<C-j>', '<C-w><C-j>', { desc = 'Move focus to the lower window' }) vim.keymap.set('n', '<C-j>', '<C-w><C-j>', { desc = 'Move focus to the lower window' })
vim.keymap.set('n', '<C-k>', '<C-w><C-k>', { desc = 'Move focus to the upper window' }) vim.keymap.set('n', '<C-k>', '<C-w><C-k>', { desc = 'Move focus to the upper window' })
-- NOTE: Some terminals have colliding keymaps or are not able to send distinct keycodes -- NOTE: Some terminals have colliding keymaps or are not able to send distinct keycodes
-- vim.keymap.set("n", "<C-S-h>", "<C-w>H", { desc = "Move window to the left" }) -- vim.keymap.set("n", "<C-S-h>", "<C-w>H", { desc = "Move window to the left" })
-- vim.keymap.set("n", "<C-S-l>", "<C-w>L", { desc = "Move window to the right" }) -- vim.keymap.set("n", "<C-S-l>", "<C-w>L", { desc = "Move window to the right" })
-- vim.keymap.set("n", "<C-S-j>", "<C-w>J", { desc = "Move window to the lower" }) -- vim.keymap.set("n", "<C-S-j>", "<C-w>J", { desc = "Move window to the lower" })
-- vim.keymap.set("n", "<C-S-k>", "<C-w>K", { desc = "Move window to the upper" }) -- vim.keymap.set("n", "<C-S-k>", "<C-w>K", { desc = "Move window to the upper" })
-- [[ Basic Autocommands ]] -- [[ Basic Autocommands ]]
-- See `:help lua-guide-autocommands` -- See `:help lua-guide-autocommands`
-- Highlight when yanking (copying) text -- Highlight when yanking (copying) text
-- Try it with `yap` in normal mode -- Try it with `yap` in normal mode
-- See `:help vim.hl.on_yank()` -- See `:help vim.hl.on_yank()`
vim.api.nvim_create_autocmd('TextYankPost', { vim.api.nvim_create_autocmd('TextYankPost', {
desc = 'Highlight when yanking (copying) text', desc = 'Highlight when yanking (copying) text',
group = vim.api.nvim_create_augroup('kickstart-highlight-yank', { clear = true }), group = vim.api.nvim_create_augroup('kickstart-highlight-yank', { clear = true }),
callback = function() vim.hl.on_yank() end, callback = function() vim.hl.on_yank() end,
}) })
end
-- [[ Install plugins with `vim.pack` ]] -- ============================================================
-- See `:help vim.pack`, `:help vim.pack-examples` or the -- SECTION 2: PLUGIN MANAGER
-- excellent blog post from the creator of vim.pack and mini.nvim: -- vim.pack, build hooks, install/update plugins, plugin specs
-- https://echasnovski.com/blog/2026-03-13-a-guide-to-vim-pack -- ============================================================
-- do
-- To inspect plugin state and pending updates, run -- [[ Install plugins with `vim.pack` ]]
-- :lua vim.pack.update(nil, { offline = true }) -- See `:help vim.pack`, `:help vim.pack-examples` or the
-- -- excellent blog post from the creator of vim.pack and mini.nvim:
-- To update plugins, run -- https://echasnovski.com/blog/2026-03-13-a-guide-to-vim-pack
-- :lua vim.pack.update() --
-- To inspect plugin state and pending updates, run
-- :lua vim.pack.update(nil, { offline = true })
--
-- To update plugins, run
-- :lua vim.pack.update()
local function run_build(name, cmd, cwd) local function run_build(name, cmd, cwd)
local result = vim.system(cmd, { cwd = cwd }):wait() local result = vim.system(cmd, { cwd = cwd }):wait()
if result.code ~= 0 then if result.code ~= 0 then
local stderr = result.stderr or '' local stderr = result.stderr or ''
@ -253,13 +264,13 @@ local function run_build(name, cmd, cwd)
if output == '' then output = 'No output from build command.' end 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) vim.notify(('Build failed for %s:\n%s'):format(name, output), vim.log.levels.ERROR)
end end
end end
-- This autocommand runs after a plugin is installed or updated and -- This autocommand runs after a plugin is installed or updated and
-- runs the appropriate build command for that plugin if necessary. -- runs the appropriate build command for that plugin if necessary.
-- --
-- See `:help vim.pack-events` -- See `:help vim.pack-events`
vim.api.nvim_create_autocmd('PackChanged', { vim.api.nvim_create_autocmd('PackChanged', {
callback = function(ev) callback = function(ev)
local name = ev.data.spec.name local name = ev.data.spec.name
local kind = ev.data.kind local kind = ev.data.kind
@ -281,12 +292,12 @@ vim.api.nvim_create_autocmd('PackChanged', {
return return
end end
end, end,
}) })
local gh = function(repo) return 'https://github.com/' .. repo end local gh = function(repo) return 'https://github.com/' .. repo end
---@type (string|vim.pack.Spec)[] ---@type (string|vim.pack.Spec)[]
local plugins = { local plugins = {
-- You can specify plugins with a git URL. `vim.pack` then uses the default branch (usually `main` or `master`) -- You can specify plugins with a git URL. `vim.pack` then uses the default branch (usually `main` or `master`)
gh 'NMAC427/guess-indent.nvim', gh 'NMAC427/guess-indent.nvim',
gh 'lewis6991/gitsigns.nvim', gh 'lewis6991/gitsigns.nvim',
@ -309,28 +320,34 @@ local plugins = {
gh 'nvim-mini/mini.nvim', gh 'nvim-mini/mini.nvim',
-- You can also specify a branch or a specific commit -- You can also specify a branch or a specific commit
{ src = gh 'nvim-treesitter/nvim-treesitter', version = 'main' }, { src = gh 'nvim-treesitter/nvim-treesitter', version = 'main' },
} }
if vim.fn.executable 'make' == 1 then table.insert(plugins, gh 'nvim-telescope/telescope-fzf-native.nvim') end if vim.fn.executable 'make' == 1 then table.insert(plugins, gh 'nvim-telescope/telescope-fzf-native.nvim') end
-- Useful for getting pretty icons, but requires a Nerd Font. -- Useful for getting pretty icons, but requires a Nerd Font.
if vim.g.have_nerd_font then table.insert(plugins, gh 'nvim-tree/nvim-web-devicons') end if vim.g.have_nerd_font then table.insert(plugins, gh 'nvim-tree/nvim-web-devicons') end
-- NOTE: Here is where the plugins are actually installed and added to the path -- NOTE: Here is where the plugins are actually installed and added to the path
vim.pack.add(plugins) vim.pack.add(plugins)
end
-- [[ Configure plugins ]] -- ============================================================
-- For most plugins you need to call their `.setup()` to start them -- SECTION 3: UI / CORE UX PLUGINS
-- -- guess-indent, gitsigns, which-key, colorscheme, todo-comments, mini modules
-- For example, here is the simplest possible setup for `guess-indent.nvim`, -- ============================================================
-- which will automatically detect and set your indentation settings based on the current file. do
require('guess-indent').setup {} -- [[ Configure plugins ]]
-- For most plugins you need to call their `.setup()` to start them
--
-- For example, here is the simplest possible setup for `guess-indent.nvim`,
-- which will automatically detect and set your indentation settings based on the current file.
require('guess-indent').setup {}
-- Here is a more advanced example that passes configuration options to `gitsigns.nvim` -- Here is a more advanced example that passes configuration options to `gitsigns.nvim`
-- --
-- See `:help gitsigns` to understand what each configuration key does. -- See `:help gitsigns` to understand what each configuration key does.
-- Adds git related signs to the gutter, as well as utilities for managing changes -- Adds git related signs to the gutter, as well as utilities for managing changes
require('gitsigns').setup { require('gitsigns').setup {
signs = { signs = {
add = { text = '+' }, ---@diagnostic disable-line: missing-fields add = { text = '+' }, ---@diagnostic disable-line: missing-fields
change = { text = '~' }, ---@diagnostic disable-line: missing-fields change = { text = '~' }, ---@diagnostic disable-line: missing-fields
@ -338,10 +355,10 @@ require('gitsigns').setup {
topdelete = { text = '' }, ---@diagnostic disable-line: missing-fields topdelete = { text = '' }, ---@diagnostic disable-line: missing-fields
changedelete = { text = '~' }, ---@diagnostic disable-line: missing-fields changedelete = { text = '~' }, ---@diagnostic disable-line: missing-fields
}, },
} }
-- Useful plugin to show you pending keybinds. -- Useful plugin to show you pending keybinds.
require('which-key').setup { require('which-key').setup {
-- Delay between pressing a key and opening which-key (milliseconds) -- Delay between pressing a key and opening which-key (milliseconds)
delay = 0, delay = 0,
icons = { mappings = vim.g.have_nerd_font }, icons = { mappings = vim.g.have_nerd_font },
@ -352,34 +369,102 @@ require('which-key').setup {
{ '<leader>h', group = 'Git [H]unk', mode = { 'n', 'v' } }, -- Enable gitsigns recommended keymaps first { '<leader>h', group = 'Git [H]unk', mode = { 'n', 'v' } }, -- Enable gitsigns recommended keymaps first
{ 'gr', group = 'LSP Actions', mode = { 'n' } }, { 'gr', group = 'LSP Actions', mode = { 'n' } },
}, },
} }
-- [[ Fuzzy Finder (files, lsp, etc) ]] -- [[ Colorscheme ]]
-- -- You can easily change to a different colorscheme.
-- Telescope is a fuzzy finder that comes with a lot of different things that -- Change the name of the colorscheme plugin below, and then
-- it can fuzzy find! It's more than just a "file finder", it can search -- change the command under that to load whatever the name of that colorscheme is.
-- many different aspects of Neovim, your workspace, LSP, and more! --
-- -- If you want to see what colorschemes are already installed, you can use `:Telescope colorscheme`.
-- There are lots of other alternative pickers (like snacks.picker, or fzf-lua) ---@diagnostic disable-next-line: missing-fields
-- so feel free to experiment and see what you like! require('tokyonight').setup {
-- styles = {
-- The easiest way to use Telescope, is to start by doing something like: comments = { italic = false }, -- Disable italics in comments
-- :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!
-- See `:help telescope` and `:help telescope.setup()` -- Load the colorscheme here.
require('telescope').setup { -- Like many other themes, this one has different styles, and you could load
-- any other, such as 'tokyonight-storm', 'tokyonight-moon', or 'tokyonight-day'.
vim.cmd.colorscheme 'tokyonight-night'
-- Highlight todo, notes, etc in comments
require('todo-comments').setup { signs = false }
-- [[ mini.nvim ]]
-- A collection of various small independent plugins/modules
-- 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',
},
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()
-- 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'
-- Set `use_icons` to true if you have a 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
statusline.section_location = function() return '%2l:%-2v' end
-- ... and there is more!
-- Check out: https://github.com/nvim-mini/mini.nvim
end
-- ============================================================
-- 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!
-- See `:help telescope` and `:help telescope.setup()`
require('telescope').setup {
-- You can put your default mappings / updates / etc. in here -- You can put your default mappings / updates / etc. in here
-- All the info you're looking for is in `:help telescope.setup()` -- All the info you're looking for is in `:help telescope.setup()`
-- --
@ -392,29 +477,29 @@ require('telescope').setup {
extensions = { extensions = {
['ui-select'] = { require('telescope.themes').get_dropdown() }, ['ui-select'] = { require('telescope.themes').get_dropdown() },
}, },
} }
-- Enable Telescope extensions if they are installed -- 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` -- 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' })
vim.keymap.set('n', '<leader>sf', builtin.find_files, { desc = '[S]earch [F]iles' }) vim.keymap.set('n', '<leader>sf', builtin.find_files, { desc = '[S]earch [F]iles' })
vim.keymap.set('n', '<leader>ss', builtin.builtin, { desc = '[S]earch [S]elect Telescope' }) vim.keymap.set('n', '<leader>ss', builtin.builtin, { desc = '[S]earch [S]elect Telescope' })
vim.keymap.set({ 'n', 'v' }, '<leader>sw', builtin.grep_string, { desc = '[S]earch current [W]ord' }) vim.keymap.set({ 'n', 'v' }, '<leader>sw', builtin.grep_string, { desc = '[S]earch current [W]ord' })
vim.keymap.set('n', '<leader>sg', builtin.live_grep, { desc = '[S]earch by [G]rep' }) vim.keymap.set('n', '<leader>sg', builtin.live_grep, { desc = '[S]earch by [G]rep' })
vim.keymap.set('n', '<leader>sd', builtin.diagnostics, { desc = '[S]earch [D]iagnostics' }) vim.keymap.set('n', '<leader>sd', builtin.diagnostics, { desc = '[S]earch [D]iagnostics' })
vim.keymap.set('n', '<leader>sr', builtin.resume, { desc = '[S]earch [R]esume' }) vim.keymap.set('n', '<leader>sr', builtin.resume, { desc = '[S]earch [R]esume' })
vim.keymap.set('n', '<leader>s.', builtin.oldfiles, { desc = '[S]earch Recent Files ("." for repeat)' }) vim.keymap.set('n', '<leader>s.', builtin.oldfiles, { desc = '[S]earch Recent Files ("." for repeat)' })
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. -- 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. -- 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
@ -444,20 +529,20 @@ vim.api.nvim_create_autocmd('LspAttach', {
-- the definition of its *type*, not where it was *defined*. -- 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 -- 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. -- You can pass additional configuration to Telescope to change the theme, layout, etc.
builtin.current_buffer_fuzzy_find(require('telescope.themes').get_dropdown { builtin.current_buffer_fuzzy_find(require('telescope.themes').get_dropdown {
winblend = 10, winblend = 10,
previewer = false, 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. -- It's also possible to pass additional configuration options.
-- See `:help telescope.builtin.live_grep()` for information about particular keys -- See `:help telescope.builtin.live_grep()` for information about particular keys
vim.keymap.set( vim.keymap.set(
'n', 'n',
'<leader>s/', '<leader>s/',
function() function()
@ -467,45 +552,51 @@ vim.keymap.set(
} }
end, end,
{ desc = '[S]earch [/] in Open Files' } { desc = '[S]earch [/] in Open Files' }
) )
-- Shortcut for searching your Neovim configuration 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
-- [[ LSP Configuration ]] -- ============================================================
-- Brief aside: **What is LSP?** -- SECTION 5: LSP
-- -- LSP keymaps, server configuration, Mason tools installations
-- LSP is an initialism you've probably heard, but might not understand what it is. -- ============================================================
-- do
-- LSP stands for Language Server Protocol. It's a protocol that helps editors -- [[ LSP Configuration ]]
-- and language tooling communicate in a standardized fashion. -- Brief aside: **What is LSP?**
-- --
-- In general, you have a "server" which is some tool built to understand a particular -- LSP is an initialism you've probably heard, but might not understand what it is.
-- 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 -- LSP stands for Language Server Protocol. It's a protocol that helps editors
-- processes that communicate with some "client" - in this case, Neovim! -- and language tooling communicate in a standardized fashion.
-- --
-- LSP provides Neovim with features like: -- In general, you have a "server" which is some tool built to understand a particular
-- - Go to definition -- language (such as `gopls`, `lua_ls`, `rust_analyzer`, etc.). These Language Servers
-- - Find references -- (sometimes called LSP servers, but that's kind of like ATM Machine) are standalone
-- - Autocompletion -- processes that communicate with some "client" - in this case, Neovim!
-- - Symbol Search --
-- - and more! -- LSP provides Neovim with features like:
-- -- - Go to definition
-- Thus, Language Servers are external tools that must be installed separately from -- - Find references
-- Neovim. This is where `mason` and related plugins come into play. -- - Autocompletion
-- -- - Symbol Search
-- If you're wondering about lsp vs treesitter, you can check out the wonderfully -- - and more!
-- and elegantly composed help section, `:help lsp-vs-treesitter` --
-- 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. -- Useful status updates for LSP.
require('fidget').setup {} require('fidget').setup {}
-- This function gets run when an LSP attaches to a particular buffer. -- 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 -- That is to say, every time a new file is opened that is associated with
-- an lsp (for example, opening `main.rs` is associated with `rust_analyzer`) this -- an lsp (for example, opening `main.rs` is associated with `rust_analyzer`) this
-- function will be executed to configure the current buffer -- function will be executed to configure the current buffer
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 -- NOTE: Remember that Lua is a real programming language, and as such it is possible
@ -567,13 +658,13 @@ vim.api.nvim_create_autocmd('LspAttach', {
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 -- Enable the following language servers
-- Feel free to add/remove any LSPs that you want here. They will automatically be installed. -- 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 -- 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 = {},
@ -620,32 +711,38 @@ local servers = {
}, },
}, },
}, },
} }
-- Automatically install LSPs and related tools to stdpath for Neovim -- Automatically install LSPs and related tools to stdpath for Neovim
require('mason').setup {} require('mason').setup {}
-- Ensure the servers and tools above are installed -- Ensure the servers and tools above are installed
-- --
-- To check the current status of installed tools and/or manually install -- To check the current status of installed tools and/or manually install
-- other tools, you can run -- other tools, you can run
-- :Mason -- :Mason
-- --
-- You can press `g?` for help in this menu. -- 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 -- You can add other tools here that you want Mason to install
}) })
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
-- [[ Formatting ]] -- ============================================================
require('conform').setup { -- SECTION 6: FORMATTING
-- conform.nvim setup and keymap
-- ============================================================
do
-- [[ Formatting ]]
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: -- You can specify filetypes to autoformat on save here:
@ -671,24 +768,28 @@ require('conform').setup {
-- You can use 'stop_after_first' to run the first available formatter from the list -- 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
-- [[ Autocompletion Configuration ]] -- ============================================================
-- SECTION 7: AUTOCOMPLETE & SNIPPETS
-- blink.cmp and luasnip setup
-- ============================================================
do
-- [[ Snippet Engine ]]
require('luasnip').setup {}
-- Snippet Engine -- `friendly-snippets` contains a variety of premade snippets.
require('luasnip').setup {} -- See the README about individual language/framework/plugin snippets:
-- https://github.com/rafamadriz/friendly-snippets
--
-- vim.pack.add { gh 'rafamadriz/friendly-snippets' }
-- require('luasnip.loaders.from_vscode').lazy_load()
-- `friendly-snippets` contains a variety of premade snippets. -- [[ Autocomplete Engine ]]
-- See the README about individual language/framework/plugin snippets: require('blink.cmp').setup {
-- https://github.com/rafamadriz/friendly-snippets
--
-- vim.pack.add { gh 'rafamadriz/friendly-snippets' }
-- require('luasnip.loaders.from_vscode').lazy_load()
-- The autocomplete engine
require('blink.cmp').setup {
keymap = { keymap = {
-- 'default' (recommended) for mappings similar to built-in completions -- 'default' (recommended) for mappings similar to built-in completions
-- <c-y> to accept ([y]es) the completion. -- <c-y> to accept ([y]es) the completion.
@ -746,82 +847,26 @@ require('blink.cmp').setup {
-- Shows a signature help window while you type arguments for a function -- Shows a signature help window while you type arguments for a function
signature = { enabled = true }, signature = { enabled = true },
} }
end
-- [[ Colorscheme ]] -- ============================================================
-- You can easily change to a different colorscheme. -- SECTION 8: TREESITTER
-- Change the name of the colorscheme plugin below, and then -- Parser installation, syntax highlighting, folds, indentation
-- change the command under that to load whatever the name of that colorscheme is. -- ============================================================
-- do
-- If you want to see what colorschemes are already installed, you can use `:Telescope colorscheme`. -- [[ Configure Treesitter ]]
---@diagnostic disable-next-line: missing-fields -- Used to highlight, edit, and navigate code
require('tokyonight').setup { --
styles = { -- See `:help nvim-treesitter-intro`
comments = { italic = false }, -- Disable italics in comments
},
}
-- Load the colorscheme here. -- Ensure basic parsers are installed
-- Like many other themes, this one has different styles, and you could load local parsers = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' }
-- any other, such as 'tokyonight-storm', 'tokyonight-moon', or 'tokyonight-day'. require('nvim-treesitter').install(parsers)
vim.cmd.colorscheme 'tokyonight-night'
-- Highlight todo, notes, etc in comments ---@param buf integer
require('todo-comments').setup { signs = false } ---@param language string
local function treesitter_try_attach(buf, language)
-- [[ mini.nvim ]]
-- A collection of various small independent plugins/modules
-- 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',
},
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()
-- 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'
-- Set `use_icons` to true if you have a 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
statusline.section_location = function() return '%2l:%-2v' end
-- ... and there is more!
-- Check out: https://github.com/nvim-mini/mini.nvim
-- [[ Configure Treesitter ]]
-- Used to highlight, edit, and navigate code
--
-- See `:help nvim-treesitter-intro`
-- Ensure basic parsers are installed
local parsers = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' }
require('nvim-treesitter').install(parsers)
---@param buf integer
---@param language string
local function treesitter_try_attach(buf, language)
-- Check if a parser exists and load it -- 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 -- Enable syntax highlighting and other treesitter features
@ -838,10 +883,10 @@ local function treesitter_try_attach(buf, language)
-- Enable treesitter based indentation -- 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
local available_parsers = require('nvim-treesitter').get_available() local available_parsers = require('nvim-treesitter').get_available()
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
@ -861,28 +906,35 @@ vim.api.nvim_create_autocmd('FileType', {
treesitter_try_attach(buf, language) treesitter_try_attach(buf, language)
end end
end, end,
}) })
end
-- 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 -- SECTION 9: OPTIONAL EXAMPLES / NEXT STEPS
-- place them in the correct locations. -- 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 -- NOTE: Next step on your Neovim journey: Add/Configure additional plugins for Kickstart
-- --
-- Here are some example plugins that I've included in the Kickstart repository. -- Here are some example plugins that I've included in the Kickstart repository.
-- Uncomment any of the lines below to enable them (you will need to restart nvim). -- Uncomment any of the lines below to enable them (you will need to restart nvim).
-- --
-- require 'kickstart.plugins.debug' -- require 'kickstart.plugins.debug'
-- require 'kickstart.plugins.indent_line' -- require 'kickstart.plugins.indent_line'
-- require 'kickstart.plugins.lint' -- require 'kickstart.plugins.lint'
-- require 'kickstart.plugins.autopairs' -- require 'kickstart.plugins.autopairs'
-- require 'kickstart.plugins.neo-tree' -- require 'kickstart.plugins.neo-tree'
-- require 'kickstart.plugins.gitsigns' -- adds gitsigns recommended keymaps -- require 'kickstart.plugins.gitsigns' -- adds gitsigns recommended keymaps
-- NOTE: You can add your own plugins, configuration, etc from `lua/custom/plugins/*.lua` -- NOTE: You can add your own plugins, configuration, etc from `lua/custom/plugins/*.lua`
-- --
-- Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going. -- Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going.
-- require 'custom.plugins' -- require 'custom.plugins'
end
-- 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