@ -135,7 +135,6 @@ vim.opt.signcolumn = 'yes'
vim.opt . updatetime = 250
-- Decrease mapped sequence wait time
-- Displays which-key popup sooner
vim.opt . timeoutlen = 300
-- Configure how new splits should be opened
@ -157,6 +156,7 @@ vim.opt.cursorline = true
-- Minimal number of screen lines to keep above and below the cursor.
vim.opt . scrolloff = 10
vim.opt . tabstop = 4
vim.opt . shiftwidth = 4
@ -164,6 +164,12 @@ vim.opt.shiftwidth = 4
vim.opt . expandtab = true
vim.opt . list = false
-- 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.opt . confirm = true
-- [[ Basic Keymaps ]]
-- See `:help vim.keymap.set()`
@ -197,8 +203,15 @@ vim.keymap.set('n', '<C-l>', '<C-w><C-l>', { desc = 'Move focus to the right win
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 ' , ' <leader><tab> ' , ' <Cmd>Neotree toggle<CR> ' , { desc = ' Toggle Neo-tree ' } )
-- 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`
@ -252,12 +265,22 @@ require('lazy').setup({
-- with the first argument being the link and the following
-- keys can be used to configure plugin behavior/loading/etc.
--
-- Use `opts = {}` to force a plugin to be loaded.
-- Use `opts = {}` to automatically pass options to a plugin's `setup()` function, forcing the plugin to be loaded.
--
-- 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,
-- }
--
-- Here is a more advanced example where we pass configuration
-- options to `gitsigns.nvim`. This is equivalent to the following Lua:
-- require('gitsigns').setup({ ... })
-- options to `gitsigns.nvim`.
--
-- See `:help gitsigns` to understand what the configuration keys do
{ -- Adds git related signs to the gutter, as well as utilities for managing changes
@ -284,19 +307,21 @@ require('lazy').setup({
-- 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 `config` key, the configuration only runs
-- after the plugin has been loaded:
-- config = function() ... end
-- 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 ' , -- Sets the loading event to 'VimEnter'
opts = {
-- delay between pressing a key and opening which-key (milliseconds)
-- this setting is independent of vim.opt.timeoutlen
delay = 0 ,
icons = {
-- set icon mappings to true if you have a Nerd Font
mappings = vim.g . have_nerd_font ,
-- If you are using a Nerd Font: set icons.keys to an empty table which will use the
-- default whic k -key.nvim defined Nerd Font icons, otherwise define a string table
-- default whic h -key.nvim defined Nerd Font icons, otherwise define a string table
keys = vim.g . have_nerd_font and { } or {
Up = ' <Up> ' ,
Down = ' <Down> ' ,
@ -331,11 +356,7 @@ require('lazy').setup({
-- Document existing key chains
spec = {
{ ' <leader>c ' , group = ' [C]ode ' , mode = { ' n ' , ' x ' } } ,
{ ' <leader>d ' , group = ' [D]ocument ' } ,
{ ' <leader>r ' , group = ' [R]ename ' } ,
{ ' <leader>s ' , group = ' [S]earch ' } ,
{ ' <leader>w ' , group = ' [W]orkspace ' } ,
{ ' <leader>t ' , group = ' [T]oggle ' } ,
{ ' <leader>h ' , group = ' Git [H]unk ' , mode = { ' n ' , ' v ' } } ,
} ,
@ -352,7 +373,6 @@ require('lazy').setup({
{ -- Fuzzy Finder (files, lsp, etc)
' nvim-telescope/telescope.nvim ' ,
event = ' VimEnter ' ,
branch = ' 0.1.x ' ,
dependencies = {
' nvim-lua/plenary.nvim ' ,
{ -- If encountering errors, see telescope-fzf-native README for installation instructions
@ -476,26 +496,26 @@ require('lazy').setup({
opts = {
library = {
-- Load luvit types when the `vim.uv` word is found
{ path = ' luvit-meta /library' , words = { ' vim%.uv ' } } ,
{ path = ' ${3rd}/ luv/library' , words = { ' vim%.uv ' } } ,
} ,
} ,
} ,
{ ' Bilal2453/luvit-meta ' , lazy = true } ,
{
-- Main LSP Configuration
' neovim/nvim-lspconfig ' ,
dependencies = {
-- Automatically install LSPs and related tools to stdpath for Neovim
{ ' williamboman/mason.nvim ' , config = true } , -- NOTE: Must be loaded before dependants
-- 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({})`
{ ' williamboman/mason.nvim ' , opts = { } } ,
' williamboman/mason-lspconfig.nvim ' ,
' WhoIsSethDaniel/mason-tool-installer.nvim ' ,
-- Useful status updates for LSP.
-- NOTE: `opts = {}` is the same as calling `require('fidget').setup({})`
{ ' j-hui/fidget.nvim ' , opts = { } } ,
-- Allows extra capabilities provided by nvim- cmp
' hrsh7th/cmp-nvim-ls p' ,
-- Allows extra capabilities provided by blink. cmp
' saghen/blink.cm p' ,
} ,
config = function ( )
-- Brief aside: **What is LSP?**
@ -540,42 +560,55 @@ require('lazy').setup({
vim.keymap . set ( mode , keys , func , { buffer = event.buf , desc = ' LSP: ' .. desc } )
end
-- 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>.
map ( ' gd ' , require ( ' telescope.builtin ' ) . lsp_definitions , ' [G]oto [D]efinition ' )
-- Rename the variable under your cursor.
-- Most Language Servers support renaming across files, etc.
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 ' } )
-- Find references for the word under your cursor.
map ( ' gr ' , require ( ' telescope.builtin ' ) . lsp_references , ' [G]oto [R]eferences ' )
map ( ' gr r ' , require ( ' telescope.builtin ' ) . lsp_references , ' [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.
map ( ' g I ' , require ( ' telescope.builtin ' ) . lsp_implementations , ' [G]oto [I]mplementation ' )
map ( ' g ri ' , require ( ' telescope.builtin ' ) . lsp_implementations , ' [G]oto [I]mplementation ' )
-- 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*.
map ( ' <leader>D ' , require ( ' telescope.builtin ' ) . lsp_type_definitions , ' Type [D]efinition ' )
-- 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>.
map ( ' grd ' , require ( ' telescope.builtin ' ) . lsp_definitions , ' [G]oto [D]efinition ' )
-- 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 ' )
-- Fuzzy find all the symbols in your current document.
-- Symbols are things like variables, functions, types, etc.
map ( ' <leader>ds ' , require ( ' telescope.builtin ' ) . lsp_document_symbols , ' [D]ocument [S]ymbols ' )
map ( ' gO ' , require ( ' telescope.builtin ' ) . lsp_document_symbols , ' Open Document S ymbols' )
-- Fuzzy find all the symbols in your current workspace.
-- Similar to document symbols, except searches over your entire project.
map ( ' <leader>ws ' , require ( ' telescope.builtin ' ) . lsp_dynamic_workspace_symbols , ' [W]orkspace [S]ymbols ' )
-- Rename the variable under your cursor.
-- Most Language Servers support renaming across files, etc.
map ( ' <leader>rn ' , vim.lsp . buf.rename , ' [R]e[n]ame ' )
map ( ' gW ' , require ( ' telescope.builtin ' ) . lsp_dynamic_workspace_symbols , ' Open Workspace Symbols ' )
-- 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 ( ' <leader>ca ' , vim.lsp . buf.code_action , ' [C]ode [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 ( ' gD ' , vim.lsp . buf.declaration , ' [G]oto [D]eclaration ' )
-- 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*.
map ( ' grt ' , require ( ' telescope.builtin ' ) . lsp_type_definitions , ' [G]oto [T]ype Definition ' )
-- This function resolves a difference between neovim nightly (version 0.11) and stable (version 0.10)
---@param client vim.lsp.Client
---@param method vim.lsp.protocol.Method
---@param bufnr? integer some lsp support methods only in specific files
---@return boolean
local function client_supports_method ( client , method , bufnr )
if vim.fn . has ' nvim-0.11 ' == 1 then
return client : supports_method ( method , bufnr )
else
return client.supports_method ( method , { bufnr = bufnr } )
end
end
-- The following two autocommands are used to highlight references of the
-- word under your cursor when your cursor rests there for a little while.
@ -583,7 +616,7 @@ require('lazy').setup({
--
-- 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 )
if client and client .supports_method( vim.lsp . protocol.Methods . textDocument_documentHighlight ) then
if client and client _supports_method( client , vim.lsp . protocol.Methods . textDocument_documentHighlight , event.buf ) then
local highlight_augroup = vim.api . nvim_create_augroup ( ' kickstart-lsp-highlight ' , { clear = false } )
vim.api . nvim_create_autocmd ( { ' CursorHold ' , ' CursorHoldI ' } , {
buffer = event.buf ,
@ -610,7 +643,7 @@ require('lazy').setup({
-- 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( vim.lsp . protocol.Methods . textDocument_inlayHint ) then
if client and client _supports_method( client , vim.lsp . protocol.Methods . 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 ' )
@ -618,12 +651,40 @@ require('lazy').setup({
end ,
} )
-- Diagnostic Config
-- See :help vim.diagnostic.Opts
vim.diagnostic . config {
severity_sort = true ,
float = { border = ' rounded ' , source = ' if_many ' } ,
underline = { severity = vim.diagnostic . severity.ERROR } ,
signs = vim.g . have_nerd_font and {
text = {
[ vim.diagnostic . severity.ERROR ] = ' ' ,
[ vim.diagnostic . severity.WARN ] = ' ' ,
[ vim.diagnostic . severity.INFO ] = ' ' ,
[ vim.diagnostic . severity.HINT ] = ' ' ,
} ,
} or { } ,
virtual_text = {
source = ' if_many ' ,
spacing = 2 ,
format = function ( diagnostic )
local diagnostic_message = {
[ vim.diagnostic . severity.ERROR ] = diagnostic.message ,
[ vim.diagnostic . severity.WARN ] = diagnostic.message ,
[ vim.diagnostic . severity.INFO ] = diagnostic.message ,
[ vim.diagnostic . severity.HINT ] = diagnostic.message ,
}
return diagnostic_message [ diagnostic.severity ]
end ,
} ,
}
-- LSP servers and clients are able to communicate to each other what features they support.
-- By default, Neovim doesn't support everything that is in the LSP specification.
-- When you add nvim-cmp, luasnip, etc. Neovim now has *more* capabilities.
-- So, we create new capabilities with nvim cmp, and then broadcast that to the servers.
local capabilities = vim.lsp . protocol.make_client_capabilities ( )
capabilities = vim.tbl_deep_extend ( ' force ' , capabilities , require ( ' cmp_nvim_lsp ' ) . default_capabilities ( ) )
-- When you add blink.cmp, luasnip, etc. Neovim now has *more* capabilities.
-- So, we create new capabilities with blink.cmp, and then broadcast that to the servers.
local capabilities = require ( ' blink.cmp ' ) . get_lsp_capabilities ( )
-- Enable the following language servers
-- Feel free to add/remove any LSPs that you want here. They will automatically be installed.
@ -644,8 +705,8 @@ require('lazy').setup({
-- 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 server `) will work just fine
-- ts server = {},
-- But for many setups, the LSP (`ts _l s`) will work just fine
-- ts _l s = {},
--
eslint = {
-- Enable auto-fix on save
@ -658,8 +719,8 @@ require('lazy').setup({
} ,
lua_ls = {
-- cmd = { ...},
-- filetypes = { ... },
-- cmd = { ... },
-- filetypes = { ... },
-- capabilities = {},
settings = {
Lua = {
@ -674,8 +735,9 @@ require('lazy').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
--
-- 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.
@ -685,8 +747,11 @@ require('lazy').setup({
' eslint-lsp ' , -- ESLint Language Server
} )
require ( ' mason ' ) . setup ( )
-- You can press `g?` for help in this menu.
--
-- `mason` had to be setup earlier: to configure its options see the
-- `dependencies` table for `nvim-lspconfig` above.
--
-- You can add other tools here that you want Mason to install
-- for you, so that they are available from within Neovim.
local ensure_installed = vim.tbl_keys ( servers or { } )
@ -696,12 +761,14 @@ require('lazy').setup({
require ( ' mason-tool-installer ' ) . setup { ensure_installed = ensure_installed }
require ( ' mason-lspconfig ' ) . setup {
ensure_installed = { } , -- explicitly set to an empty table (Kickstart populates installs via mason-tool-installer)
automatic_installation = false ,
handlers = {
function ( server_name )
local server = servers [ server_name ] or { }
-- This handles overriding only values explicitly passed
-- by the server configuration above. Useful when disabling
-- certain features of an LSP (for example, turning off formatting for ts server )
-- certain features of an LSP (for example, turning off formatting for ts _l s)
server.capabilities = vim.tbl_deep_extend ( ' force ' , { } , capabilities , server.capabilities or { } )
require ( ' lspconfig ' ) [ server_name ] . setup ( server )
end ,
@ -726,6 +793,20 @@ require('lazy').setup({
} ,
opts = {
notify_on_error = false ,
format_on_save = function ( bufnr )
-- Disable "format_on_save lsp_fallback" for languages that don't
-- have a well standardized coding style. You can add additional
-- languages here or re-enable it for the disabled ones.
local disable_filetypes = { c = true , cpp = true }
if disable_filetypes [ vim.bo [ bufnr ] . filetype ] then
return nil
else
return {
timeout_ms = 500 ,
lsp_format = ' fallback ' ,
}
end
end ,
formatters_by_ft = {
lua = { ' stylua ' } ,
-- Conform can also run multiple formatters sequentially
@ -739,11 +820,13 @@ require('lazy').setup({
{ -- Autocompletion
' saghen/blink.cmp ' ,
event = ' InsertEnter ' ,
event = ' VimEnter ' ,
version = ' 1.* ' ,
dependencies = {
-- Snippet Engine & its associated nvim-cmp source
-- 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.
@ -764,106 +847,90 @@ require('lazy').setup({
-- end,
-- },
} ,
opts = { } ,
} ,
' saadparwaiz1/cmp_luasnip ' ,
-- Adds other completion capabilities.
-- nvim-cmp does not ship with all sources by default. They are split
-- into multiple repos for maintenance purposes.
' hrsh7th/cmp-nvim-lsp ' ,
' hrsh7th/cmp-path ' ,
' folke/lazydev.nvim ' ,
} ,
config = function ( )
-- See `:help cmp`
local cmp = require ' cmp '
local luasnip = require ' luasnip '
luasnip.config . setup { }
cmp.setup {
snippet = {
expand = function ( args )
luasnip.lsp_expand ( args.body )
end ,
} ,
completion = { completeopt = ' menu,menuone,noinsert ' } ,
-- For an understanding of why these mappings were
-- chosen, you will need to read `:help ins-completion`
--- @module 'blink.cmp'
--- @type blink.cmp.Config
opts = {
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!
mapping = cmp.mapping . preset.insert {
-- Select the [n]ext item
[ ' <C-n> ' ] = cmp.mapping . select_next_item ( ) ,
-- Select the [p]revious item
[ ' <C-p> ' ] = cmp.mapping . select_prev_item ( ) ,
-- Scroll the documentation window [b]ack / [f]orward
[ ' <C-b> ' ] = cmp.mapping . scroll_docs ( - 4 ) ,
[ ' <C-f> ' ] = cmp.mapping . scroll_docs ( 4 ) ,
-- Accept ([y]es) the completion.
-- This will auto-import if your LSP supports it.
-- This will expand snippets if the LSP sent a snippet.
[ ' <C-y> ' ] = cmp.mapping . confirm { select = true } ,
-- If you prefer more traditional completion keymaps,
-- you can uncomment the following lines
--['<CR>'] = cmp.mapping.confirm { select = true },
--['<Tab>'] = cmp.mapping.select_next_item(),
--['<S-Tab>'] = cmp.mapping.select_prev_item(),
-- Manually trigger a completion from nvim-cmp.
-- Generally you don't need this, because nvim-cmp will display
-- completions whenever it has completion options available.
[ ' <C-Space> ' ] = cmp.mapping . complete { } ,
-- Think of <c-l> as moving to the right of your snippet expansion.
-- So if you have a snippet that's like:
-- function $name($args)
-- $body
-- end
--
-- <c-l> will move you to the right of each of the expansion locations.
-- <c-h> is similar, except moving you backwards.
[ ' <C-l> ' ] = cmp.mapping ( function ( )
if luasnip.expand_or_locally_jumpable ( ) then
luasnip.expand_or_jump ( )
end
end , { ' i ' , ' s ' } ) ,
[ ' <C-h> ' ] = cmp.mapping ( function ( )
if luasnip.locally_jumpable ( - 1 ) then
luasnip.jump ( - 1 )
end
end , { ' i ' , ' s ' } ) ,
--
-- 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 :h 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
} ,
sources = {
{
name = ' lazydev ' ,
-- set group index to 0 to skip loading LuaLS completions as lazydev recommends it
group_index = 0 ,
} ,
{ name = ' nvim_lsp ' } ,
{ name = ' luasnip ' } ,
{ name = ' path ' } ,
{ name = ' minuet-ai ' } ,
-- 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 ' ,
} ,
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 } ,
} ,
sources = {
default = { ' nvim_lsp ' , ' luasnip ' , ' lsp ' , ' path ' , ' snippets ' , ' lazydev ' } ,
providers = {
lazydev = { module = ' lazydev.integrations.blink ' , score_offset = 100 } ,
} ,
}
end ,
} ,
snippets = { preset = ' luasnip ' } ,
-- Blink.cmp includes an optional, recommended rust fuzzy matcher,
-- which automatically downloads a prebuilt binary when enabled.
--
-- 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
fuzzy = { implementation = ' lua ' } ,
-- Shows a signature help window while you type arguments for a function
signature = { enabled = true } ,
} ,
} ,
{
' folke/tokyonight.nvim ' ,
priority = 1000 , -- Make sure to load this before all the other start plugins.
init = function ( )
config = function ( )
---@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 '
-- You can configure highlights by doing something like:
vim.cmd . hi ' Comment gui=none '
end ,
} ,