@ -84,96 +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 ! : )
--]]
-- Set <space> as the leader key
-- See `:help mapleader`
-- NOTE: Must happen before plugins are loaded (otherwise wrong leader will be used)
vim.g . mapleader = ' '
vim.g . maplocalleader = ' '
-- ============================================================
-- 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 to true if you have a Nerd Font installed and selected in the terminal
vim.g . have_nerd_font = false
-- Set <space> as the leader key
-- See `:help mapleader`
-- NOTE: Must happen before plugins are loaded (otherwise wrong leader will be used)
vim.g . mapleader = ' '
vim.g . maplocalleader = ' '
-- [[ Setting options ]]
-- See `:help vim.o`
-- NOTE: You can change these options as you wish!
-- For more options, you can see `:help option-list`
-- Set to true if you have a Nerd Font installed and selected in the terminal
vim.g . have_nerd_font = false
-- Make line numbers default
vim.o . number = true
-- You can also add relative line numbers, to help with jumping.
-- Experiment for yourself to see if you like it!
-- vim.o.relativenumber = true
-- [[ Setting options ]]
-- See `:help vim.o`
-- NOTE: You can change these options as you wish!
-- For more options, you can see `:help option-list`
-- Enable mouse mode, can be useful for resizing splits for example!
vim.o . mouse = ' a '
-- Make line numbers default
vim.o . number = true
-- You can also add relative line numbers, to help with jumping.
-- Experiment for yourself to see if you like it!
-- vim.o.relativenumber = true
-- Don't show the mode, since it's already in the status line
vim.o . showmode = false
-- Enable mouse mode, can be useful for resizing splits for example!
vim.o . mouse = ' a '
-- Sync clipboard between OS and Neovim.
-- Schedule the setting after `UiEnter` because it can increase startup-time.
-- Remove this option if you want your OS clipboard to remain independent.
-- See `:help 'clipboard'`
vim.schedule ( function ( ) vim.o . clipboard = ' unnamedplus ' end )
-- Don't show the mode, since it's already in the status line
vim.o . showmode = false
-- Enable break indent
vim.o . breakindent = true
-- Sync clipboard between OS and Neovim.
-- Schedule the setting after `UiEnter` because it can increase startup-time.
-- Remove this option if you want your OS clipboard to remain independent.
-- See `:help 'clipboard'`
vim.schedule ( function ( ) vim.o . clipboard = ' unnamedplus ' end )
-- Enable undo/redo changes even after closing and reopening a file
vim.o . undofile = true
-- Enable break indent
vim.o . breakindent = true
-- Case-insensitive searching UNLESS \C or one or more capital letters in the search term
vim.o . ignorecase = true
vim.o . smartcase = true
-- Enable undo/redo changes even after closing and reopening a file
vim.o . undofile = true
-- Keep signcolumn on by default
vim.o . signcolumn = ' yes '
-- Case-insensitive searching UNLESS \C or one or more capital letters in the search term
vim.o . ignorecase = true
vim.o . smartcase = true
-- Decrease update time
vim.o . updatetime = 250
-- Keep signcolumn on by default
vim.o . signcolumn = ' yes '
-- Decrease mapped sequence wait time
vim.o . timeoutlen = 30 0
-- Decrease update time
vim.o . updatetime = 25 0
-- Configure how new splits should be opened
vim.o . splitright = true
vim.o . splitbelow = true
-- Decrease mapped sequence wait time
vim.o . timeoutlen = 300
-- Sets how neovim will display certain whitespace characters in the editor.
-- See `:help 'list'`
-- and `:help 'listchars'`
--
-- 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.
-- See `:help lua-options`
-- and `:help lua-guide-options`
vim.o . list = true
vim.opt . listchars = { tab = ' » ' , trail = ' · ' , nbsp = ' ␣ ' }
-- Configure how new splits should be opened
vim.o . splitright = true
vim.o . splitbelow = true
-- Preview substitutions live, as you type!
vim.o . inccommand = ' split '
-- Sets how neovim will display certain whitespace characters in the editor.
-- See `:help 'list'`
-- and `:help 'listchars'`
--
-- 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.
-- See `:help lua-options`
-- and `:help lua-guide-options`
vim.o . list = true
vim.opt . listchars = { tab = ' » ' , trail = ' · ' , nbsp = ' ␣ ' }
-- Show which line your cursor is on
vim.o . cursorline = true
-- Preview substitutions live, as you type!
vim.o . inccommand = ' split '
-- Minimal number of screen lines to keep above and below the cursor.
vim.o . scrolloff = 10
-- Show which line your cursor is on
vim.o . cursorline = true
-- 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)
-- See `:help 'confirm'`
vim.o . confirm = true
-- Minimal number of screen lines to keep above and below the cursor.
vim.o . scrolloff = 10
-- [[ Basic Keymaps ]]
-- See `:help vim.keymap.set()`
-- 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)
-- See `:help 'confirm'`
vim.o . confirm = true
-- Clear highlights on search when pressing <Esc> in normal mode
-- See `:help hlsearch`
vim.keymap . set ( ' n ' , ' <Esc> ' , ' <cmd>nohlsearch<CR> ' )
-- [[ Basic Keymaps ]]
-- See `:help vim.keymap.set()`
-- Diagnostic Config & Keymaps
-- See :help vim.diagnostic.Opts
vim.diagnostic . config {
-- Clear highlights on search when pressing <Esc> in normal mode
-- See `:help hlsearch`
vim.keymap . set ( ' n ' , ' <Esc> ' , ' <cmd>nohlsearch<CR> ' )
-- Diagnostic Config & Keymaps
-- See `:help vim.diagnostic.Opts`
vim.diagnostic . config {
update_in_insert = false ,
severity_sort = true ,
float = { border = ' rounded ' , source = ' if_many ' } ,
@ -185,100 +193,160 @@ vim.diagnostic.config {
-- Auto open the float, so you can easily read the errors when jumping with `[d` and `]d`
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
-- 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.
--
-- 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
vim.keymap . set ( ' t ' , ' <Esc><Esc> ' , ' <C- \\ ><C-n> ' , { desc = ' Exit terminal mode ' } )
-- 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
-- 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
-- or just use <C-\><C-n> to exit terminal mode
vim.keymap . set ( ' t ' , ' <Esc><Esc> ' , ' <C- \\ ><C-n> ' , { desc = ' Exit terminal mode ' } )
-- TIP: Disable arrow keys in normal mode
-- 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', '<up>', '<cmd>echo "Use k to move!!"<CR>')
-- vim.keymap.set('n', '<down>', '<cmd>echo "Use j to move!!"<CR>')
-- TIP: Disable arrow keys in normal mode
-- 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', '<up>', '<cmd>echo "Use k to move!!"<CR>')
-- vim.keymap.set('n', '<down>', '<cmd>echo "Use j to move!!"<CR>')
-- Keybinds to make split navigation easier.
-- Use CTRL+<hjkl> to switch between windows
--
-- 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-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-k> ' , ' <C-w><C-k> ' , { desc = ' Move focus to the upper window ' } )
-- Keybinds to make split navigation easier.
-- Use CTRL+<hjkl> to switch between windows
--
-- 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-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-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
-- 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-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" })
-- 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-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-k>", "<C-w>K", { desc = "Move window to the upper" })
-- [[ Basic Autocommands ]]
-- See `:help lua-guide-autocommands`
-- [[ Basic Autocommands ]]
-- See `:help lua-guide-autocommands`
-- Highlight when yanking (copying) text
-- Try it with `yap` in normal mode
-- See `:help vim.hl.on_yank()`
vim.api . nvim_create_autocmd ( ' TextYankPost ' , {
-- Highlight when yanking (copying) text
-- Try it with `yap` in normal mode
-- See `:help vim.hl.on_yank()`
vim.api . nvim_create_autocmd ( ' TextYankPost ' , {
desc = ' Highlight when yanking (copying) text ' ,
group = vim.api . nvim_create_augroup ( ' kickstart-highlight-yank ' , { clear = true } ) ,
callback = function ( ) vim.hl . on_yank ( ) end ,
} )
-- [[ Install `lazy.nvim` plugin manager ]]
-- See `:help lazy.nvim.txt` or https://github.com/folke/lazy.nvim for more info
local lazypath = vim.fn . stdpath ' data ' .. ' /lazy/lazy.nvim '
if not ( vim.uv or vim.loop ) . fs_stat ( lazypath ) then
local lazyrepo = ' https://github.com/folke/lazy.nvim.git '
local out = vim.fn . system { ' git ' , ' clone ' , ' --filter=blob:none ' , ' --branch=stable ' , lazyrepo , lazypath }
if vim.v . shell_error ~= 0 then error ( ' Error cloning lazy.nvim: \n ' .. out ) end
} )
end
---@type vim.Option
local rtp = vim.opt . rtp
rtp : prepend ( lazypath )
-- [[ Configure and install plugins ]]
--
-- To check the current status of your plugins, run
-- :Lazy
--
-- You can press `?` in this menu for help. Use `:q` to close the window
--
-- To update plugins you can run
-- :Lazy update
--
-- NOTE: Here is where you install your plugins.
require ( ' lazy ' ) . setup ( {
-- NOTE: Plugins can be added via a link or github org/name. To run setup automatically, use `opts = {}`
{ ' NMAC427/guess-indent.nvim ' , opts = { } } ,
-- Alternatively, use `config = function() ... end` for full control over the configuration.
-- If you prefer to call `setup` explicitly, use:
-- {
-- 'lewis6991/gitsigns.nvim',
-- config = function()
-- require('gitsigns').setup({
-- -- Your gitsigns configuration here
-- })
-- end,
-- }
-- ============================================================
-- SECTION 2: PLUGIN MANAGER
-- vim.pack, build hooks, install/update plugins, plugin specs
-- ============================================================
do
-- [[ Install plugins with `vim.pack` ]]
-- See `:help vim.pack`, `:help vim.pack-examples` or
-- the excellent blog post from the creator of mini.nvim https://echasnovski.com/blog/2026-03-13-a-guide-to-vim-pack
--
-- Here is a more advanced example where we pass configuratio n
-- options to `gitsigns.nvim`.
-- To inspect plugin state and pending updates, run
-- :lua vim.pack.update(nil, { offline = true })
--
-- See `:help gitsigns` to understand what the configuration keys do
{ -- Adds git related signs to the gutter, as well as utilities for managing changes
' lewis6991/gitsigns.nvim ' ,
---@module 'gitsigns'
---@type Gitsigns.Config
---@diagnostic disable-next-line: missing-fields
opts = {
-- To update plugins, run
-- :lua vim.pack.update()
local function run_build ( name , cmd , cwd )
local result = vim.system ( cmd , { cwd = cwd } ) : wait ( )
if result.code ~= 0 then
local stderr = result.stderr or ' '
local stdout = result.stdout or ' '
local output = stderr ~= ' ' and stderr or stdout
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 ,
} )
local gh = function ( repo ) return ' https://github.com/ ' .. repo end
---@type (string|vim.pack.Spec)[]
local plugins = {
-- 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 ' lewis6991/gitsigns.nvim ' ,
gh ' folke/which-key.nvim ' ,
gh ' nvim-lua/plenary.nvim ' ,
gh ' nvim-telescope/telescope.nvim ' ,
gh ' nvim-telescope/telescope-ui-select.nvim ' ,
gh ' neovim/nvim-lspconfig ' ,
gh ' mason-org/mason.nvim ' ,
gh ' mason-org/mason-lspconfig.nvim ' ,
gh ' WhoIsSethDaniel/mason-tool-installer.nvim ' ,
gh ' j-hui/fidget.nvim ' ,
gh ' stevearc/conform.nvim ' ,
-- You can also specify plugins with a version range for semver git tags
-- See `:help vim.version.range()` for more info
{ src = gh ' saghen/blink.cmp ' , version = vim.version . range ' 1.* ' } ,
{ src = gh ' L3MON4D3/LuaSnip ' , version = vim.version . range ' 2.* ' } ,
gh ' folke/tokyonight.nvim ' ,
gh ' folke/todo-comments.nvim ' ,
gh ' nvim-mini/mini.nvim ' ,
-- You can also specify a branch or a specific commit
{ 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
-- 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
-- NOTE: Here is where the plugins are actually installed and added to the path
vim.pack . add ( plugins )
end
-- ============================================================
-- SECTION 3: UI / CORE UX PLUGINS
-- guess-indent, gitsigns, which-key, colorscheme, todo-comments, mini modules
-- ============================================================
do
-- [[ 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`
--
-- See `:help gitsigns` to understand what each configuration key does.
-- Adds git related signs to the gutter, as well as utilities for managing changes
require ( ' gitsigns ' ) . setup {
signs = {
add = { text = ' + ' } , ---@diagnostic disable-line: missing-fields
change = { text = ' ~ ' } , ---@diagnostic disable-line: missing-fields
@ -286,34 +354,13 @@ require('lazy').setup({
topdelete = { text = ' ‾ ' } , ---@diagnostic disable-line: missing-fields
changedelete = { text = ' ~ ' } , ---@diagnostic disable-line: missing-fields
} ,
} ,
} ,
}
-- NOTE: Plugins can also be configured to run Lua code when they are loaded.
--
-- This is often very useful to both group configuration, as well as handle
-- lazy loading plugins that don't need to be loaded immediately at startup.
--
-- For example, in the following configuration, we use:
-- event = 'VimEnter'
--
-- which loads which-key before all the UI elements are loaded. Events can be
-- normal autocommands events (`:help autocmd-events`).
--
-- Then, because we use the `opts` key (recommended), the configuration runs
-- after the plugin has been loaded as `require(MODULE).setup(opts)`.
{ -- Useful plugin to show you pending keybinds.
' folke/which-key.nvim ' ,
event = ' VimEnter ' ,
---@module 'which-key'
---@type wk.Opts
---@diagnostic disable-next-line: missing-fields
opts = {
-- delay between pressing a key and opening which-key (milliseconds)
-- Useful plugin to show you pending keybinds.
require ( ' which-key ' ) . setup {
-- Delay between pressing a key and opening which-key (milliseconds)
delay = 0 ,
icons = { mappings = vim.g . have_nerd_font } ,
-- Document existing key chains
spec = {
{ ' <leader>s ' , group = ' [S]earch ' , mode = { ' n ' , ' v ' } } ,
@ -321,52 +368,84 @@ require('lazy').setup({
{ ' <leader>h ' , group = ' Git [H]unk ' , mode = { ' n ' , ' v ' } } , -- Enable gitsigns recommended keymaps first
{ ' gr ' , group = ' LSP Actions ' , mode = { ' n ' } } ,
} ,
} ,
} ,
}
-- NOTE: Plugins can specify dependencies.
-- [[ Colorscheme ]]
-- You can easily change to a different colorscheme.
-- Change the name of the colorscheme plugin below, and then
-- change the command under that to load whatever the name of that colorscheme is.
--
-- The dependencies are proper plugin specifications as well - anything
-- you do for a plugin at the top level, you can do for a dependency.
-- If you want to see what colorschemes are already installed, you can use `:Telescope colorscheme`.
---@diagnostic disable-next-line: missing-fields
require ( ' tokyonight ' ) . setup {
styles = {
comments = { italic = false } , -- Disable italics in comments
} ,
}
-- Load the colorscheme here.
-- 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 }
-- Collection of various small independent plugins/modules
-- Better Around/Inside textobjects
--
-- Use the `dependencies` key to specify the dependencies of a particular plugin
{ -- Fuzzy Finder (files, lsp, etc)
' nvim-telescope/telescope.nvim ' ,
-- By default, Telescope is included and acts as your picker for everything.
-- If you would like to switch to a different picker (like snacks, or fzf-lua)
-- you can disable the Telescope plugin by setting enabled to false and enable
-- your replacement picker by requiring it explicitly (e.g. 'custom.plugins.snacks')
-- Note: If you customize your config for yourself,
-- it’ s best to remove the Telescope plugin config entirely
-- instead of just disabling it here, to keep your config clean.
enabled = true ,
event = ' VimEnter ' ,
dependencies = {
' nvim-lua/plenary.nvim ' ,
{ -- If encountering errors, see telescope-fzf-native README for installation instructions
' nvim-telescope/telescope-fzf-native.nvim ' ,
-- `build` is used to run some command when the plugin is installed/updated.
-- This is only run then, not every time Neovim starts up.
build = ' make ' ,
-- `cond` is a condition used to determine whether this plugin should be
-- installed and loaded.
cond = function ( ) return vim.fn . executable ' make ' == 1 end ,
-- 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 ' ,
} ,
{ ' nvim-telescope/telescope-ui-select.nvim ' } ,
n_lines = 500 ,
}
-- Useful for getting pretty icons, but requires a Nerd Font.
{ ' nvim-tree/nvim-web-devicons ' , enabled = vim.g . have_nerd_font } ,
} ,
config = function ( )
-- 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
--
@ -382,7 +461,6 @@ require('lazy').setup({
-- Telescope picker. This is really useful to discover what Telescope can
-- do as well as how to actually do it!
-- [[ Configure Telescope ]]
-- See `:help telescope` and `:help telescope.setup()`
require ( ' telescope ' ) . setup {
-- You can put your default mappings / updates / etc. in here
@ -417,8 +495,8 @@ require('lazy').setup({
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 ' } )
-- This runs on LSP attach per buffer (see main LSP attach function in 'neovim/nvim-lspconfig' config for more info,
-- it is better explained there). This allows easily switching between pickers if you prefer using something else!
-- 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 ' , {
group = vim.api . nvim_create_augroup ( ' telescope-lsp-attach ' , { clear = true } ) ,
callback = function ( event )
@ -476,32 +554,14 @@ require('lazy').setup({
-- 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 ' } )
end ,
} ,
end
-- LSP Plugins
{
-- Main LSP Configuration
' neovim/nvim-lspconfig ' ,
dependencies = {
-- Automatically install LSPs and related tools to stdpath for Neovim
-- Mason must be loaded before its dependents so we need to set it up here.
-- NOTE: `opts = {}` is the same as calling `require('mason').setup({})`
{
' mason-org/mason.nvim ' ,
---@module 'mason.settings'
---@type MasonSettings
---@diagnostic disable-next-line: missing-fields
opts = { } ,
} ,
-- Maps LSP server names between nvim-lspconfig and Mason package names.
' mason-org/mason-lspconfig.nvim ' ,
' WhoIsSethDaniel/mason-tool-installer.nvim ' ,
-- Useful status updates for LSP.
{ ' j-hui/fidget.nvim ' , opts = { } } ,
} ,
config = function ( )
-- ============================================================
-- 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.
@ -527,6 +587,9 @@ require('lazy').setup({
-- 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.
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
-- an lsp (for example, opening `main.rs` is associated with `rust_analyzer`) this
@ -648,6 +711,9 @@ require('lazy').setup({
} ,
}
-- Automatically install LSPs and related tools to stdpath for Neovim
require ( ' mason ' ) . setup { }
-- Ensure the servers and tools above are installed
--
-- To check the current status of installed tools and/or manually install
@ -666,24 +732,15 @@ require('lazy').setup({
vim.lsp . config ( name , server )
vim.lsp . enable ( name )
end
end ,
} ,
end
{ -- Autoformat
' stevearc/conform.nvim ' ,
event = { ' BufWritePre ' } ,
cmd = { ' ConformInfo ' } ,
keys = {
{
' <leader>f ' ,
function ( ) require ( ' conform ' ) . format { async = true } end ,
mode = ' ' ,
desc = ' [F]ormat buffer ' ,
} ,
} ,
---@module 'conform'
---@type conform.setupOpts
opts = {
-- ============================================================
-- SECTION 6: FORMATTING
-- conform.nvim setup and keymap
-- ============================================================
do
-- [[ Formatting ]]
require ( ' conform ' ) . setup {
notify_on_error = false ,
format_on_save = function ( bufnr )
-- You can specify filetypes to autoformat on save here:
@ -709,42 +766,28 @@ require('lazy').setup({
-- You can use 'stop_after_first' to run the first available formatter from the list
-- 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 ' } )
end
-- ============================================================
-- SECTION 7: AUTOCOMPLETE & SNIPPETS
-- blink.cmp and luasnip setup
-- ============================================================
do
-- [[ Snippet Engine ]]
require ( ' luasnip ' ) . setup { }
{ -- Autocompletion
' saghen/blink.cmp ' ,
event = ' VimEnter ' ,
version = ' 1.* ' ,
dependencies = {
-- Snippet Engine
{
' L3MON4D3/LuaSnip ' ,
version = ' 2.* ' ,
build = ( function ( )
-- Build Step is needed for regex support in snippets.
-- This step is not supported in many windows environments.
-- Remove the below condition to re-enable on windows.
if vim.fn . has ' win32 ' == 1 or vim.fn . executable ' make ' == 0 then return end
return ' make install_jsregexp '
end ) ( ) ,
dependencies = {
-- `friendly-snippets` contains a variety of premade snippets.
-- See the README about individual language/framework/plugin snippets:
-- https://github.com/rafamadriz/friendly-snippets
-- {
-- 'rafamadriz/friendly-snippets',
-- config = function()
--
-- vim.pack.add { gh 'rafamadriz/friendly-snippets' }
-- require('luasnip.loaders.from_vscode').lazy_load()
-- end,
-- },
} ,
opts = { } ,
} ,
} ,
---@module 'blink.cmp'
---@type blink.cmp.Config
opts = {
-- [[ Autocomplete Engine ]]
require ( ' blink.cmp ' ) . setup {
keymap = {
-- 'default' (recommended) for mappings similar to built-in completions
-- <c-y> to accept ([y]es) the completion.
@ -797,119 +840,46 @@ require('lazy').setup({
-- By default, we use the Lua implementation instead, but you may enable
-- the rust implementation via `'prefer_rust_with_warning'`
--
-- See :h blink-cmp-config-fuzzy for more information
-- 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 } ,
} ,
} ,
{ -- You can easily change to a different colorscheme.
-- Change the name of the colorscheme plugin below, and then
-- change the command in the config to whatever the name of that colorscheme is.
--
-- If you want to see what colorschemes are already installed, you can use `:Telescope colorscheme`.
' folke/tokyonight.nvim ' ,
priority = 1000 , -- Make sure to load this before all the other start plugins.
config = function ( )
---@diagnostic disable-next-line: missing-fields
require ( ' tokyonight ' ) . setup {
styles = {
comments = { italic = false } , -- Disable italics in comments
} ,
}
end
-- Load the colorscheme here.
-- 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 '
end ,
} ,
-- Highlight todo, notes, etc in comments
{
' folke/todo-comments.nvim ' ,
event = ' VimEnter ' ,
dependencies = { ' nvim-lua/plenary.nvim ' } ,
---@module 'todo-comments'
---@type TodoOptions
---@diagnostic disable-next-line: missing-fields
opts = { signs = false } ,
} ,
{ -- Collection of various small independent plugins/modules
' nvim-mini/mini.nvim ' ,
config = function ( )
-- Better Around/Inside textobjects
-- ============================================================
-- SECTION 8: TREESITTER
-- Parser installation, syntax highlighting, folds, indentation
-- ============================================================
do
-- [[ Configure Treesitter ]]
-- Used to highlight, edit, and navigate code
--
-- Examples:
-- - va) - [V]isually select [A]round [)]paren
-- - yinq - [Y]ank [I]nside [I]next [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 ,
}
-- See `:help nvim-treesitter-intro`
-- 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 ,
} ,
{ -- Highlight, edit, and navigate code
' nvim-treesitter/nvim-treesitter ' ,
lazy = false ,
build = ' :TSUpdate ' ,
branch = ' main ' ,
-- [[ Configure Treesitter ]] See `:help nvim-treesitter-intro`
config = function ( )
-- ensure basic parser are installed
-- 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 parser exists and load it
-- Check if a parser exists and load it
if not vim.treesitter . language.add ( language ) then return end
-- enables syntax highlighting and other treesitter features
-- Enable syntax highlighting and other treesitter features
vim.treesitter . start ( buf , language )
-- enables treesitter based folds
-- f or more info on folds see `:help folds`
-- Enable treesitter based folds
-- For more info on folds see `:help folds`
-- vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()'
-- vim.wo.foldmethod = 'expr'
-- c heck if treesitter indentation is available for this language, and if so enable it
-- Check if treesitter indentation is available for this language, and if so enable it
-- in case there is no indent query, the indentexpr will fallback to the vim's built in one
local has_indent_query = vim.treesitter . query.get ( language , ' indents ' ) ~= nil
-- enables treesitter based indentation
-- Enable treesitter based indentation
if has_indent_query then vim.bo . indentexpr = " v:lua.require'nvim-treesitter'.indentexpr() " end
end
@ -924,20 +894,24 @@ require('lazy').setup({
local installed_parsers = require ( ' nvim-treesitter ' ) . get_installed ' parsers '
if vim.tbl_contains ( installed_parsers , language ) then
-- enable the parser if it is installed
-- Enable the parser if it is already installed
treesitter_try_attach ( buf , language )
elseif vim.tbl_contains ( available_parsers , language ) then
-- if a parser is available in `nvim-treesitter` auto install it, and enable it after the installation is done
-- If a parser is available in `nvim-treesitter`, auto-install it and enable it after the installation is done
require ( ' nvim-treesitter ' ) . install ( language ) : await ( function ( ) treesitter_try_attach ( buf , language ) end )
else
-- t ry to enable treesitter features in case the parser exists but is not available from `nvim-treesitter`
-- T ry to enable treesitter features in case the parser exists but is not available from `nvim-treesitter`
treesitter_try_attach ( buf , language )
end
end ,
} )
end ,
} ,
end
-- ============================================================
-- SECTION 9: OPTIONAL EXAMPLES / NEXT STEPS
-- 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.
@ -947,44 +921,18 @@ require('lazy').setup({
-- 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).
--
-- require 'kickstart.plugins.debug' ,
-- 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
-- require 'kickstart.plugins.debug'
-- 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: The import below can automatically add your own plugins, configuration, etc from `lua/custom/plugins/*.lua`
-- This is the easiest way to modularize your config.
-- 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.
-- { import = 'custom.plugins' },
--
-- For additional information with loading, sourcing and examples see `:help lazy.nvim-🔌-plugin-spec`
-- Or use telescope!
-- In normal mode type `<space>sh` then write `lazy.nvim-plugin`
-- you can continue same window with `<space>sr` which resumes last telescope search
} , { ---@diagnostic disable-line: missing-fields
ui = {
-- If you are using a Nerd Font: set icons to an empty table which will use the
-- default lazy.nvim defined Nerd Font icons, otherwise define a unicode icons table
icons = vim.g . have_nerd_font and { } or {
cmd = ' ⌘ ' ,
config = ' 🛠 ' ,
event = ' 📅 ' ,
ft = ' 📂 ' ,
init = ' ⚙ ' ,
keys = ' 🗝 ' ,
plugin = ' 🔌 ' ,
runtime = ' 💻 ' ,
require = ' 🌙 ' ,
source = ' 📄 ' ,
start = ' 🚀 ' ,
task = ' 📌 ' ,
lazy = ' 💤 ' ,
} ,
} ,
} )
-- require 'custom.plugins'
end
-- The line beneath this is called `modeline`. See `:help modeline`
-- vim: ts=2 sts=2 sw=2 et