@ -4,6 +4,9 @@
vim.g . mapleader = ' '
vim.g . maplocalleader = ' '
-- Set to true if you have a Nerd Font installed and selected in the terminal
vim.g . have_nerd_font = true
-- [[ Setting options ]]
-- See `:help vim.opt`
-- NOTE: You can change these options as you wish!
@ -11,20 +14,23 @@ vim.g.maplocalleader = ' '
-- Make line numbers default
vim.opt . number = true
-- You can also add relative line numbers, for help with jumping.
-- You can also add relative line numbers, to help with jumping.
-- Experiment for yourself to see if you like it!
-- vim.opt.relativenumber = true
-- Enable mouse mode, can be useful for resizing splits for example!
vim.opt . mouse = ' a '
-- Don't show the mode, since it's already in status line
-- Don't show the mode, since it's already in the status line
vim.opt . showmode = false
-- 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.opt . clipboard = ' unnamedplus '
end )
-- Enable break indent
vim.opt . breakindent = true
@ -32,7 +38,7 @@ vim.opt.breakindent = true
-- Save undo history
vim.opt . undofile = true
-- Case-insensitive searching UNLESS \C or capital in search
-- Case-insensitive searching UNLESS \C or one or more capital letters in the search term
vim.opt . ignorecase = true
vim.opt . smartcase = true
@ -41,15 +47,18 @@ vim.opt.signcolumn = 'yes'
-- Decrease update time
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
vim.opt . splitright = true
vim.opt . splitbelow = true
-- Sets how neovim will display certain whitespace in the editor.
-- See :help 'list'
-- and :help 'listchars'
-- Sets how neovim will display certain whitespace characters in the editor.
-- See ` :help 'list'`
-- and ` :help 'listchars'`
vim.opt . list = true
vim.opt . listchars = { tab = ' » ' , trail = ' · ' , nbsp = ' ␣ ' }
@ -65,14 +74,11 @@ vim.opt.scrolloff = 10
-- [[ Basic Keymaps ]]
-- See `:help vim.keymap.set()`
-- Set highlight on search, but clear o n pressing <Esc> in normal mode
vim.opt . hlsearch = true
-- Clear highlights on search whe n pressing <Esc> in normal mode
-- See `:help hlsearch`
vim.keymap . set ( ' n ' , ' <Esc> ' , ' <cmd>nohlsearch<CR> ' )
-- Diagnostic keymaps
vim.keymap . set ( ' n ' , ' [d ' , vim.diagnostic . goto_prev , { desc = ' Go to previous [D]iagnostic message ' } )
vim.keymap . set ( ' n ' , ' ]d ' , vim.diagnostic . goto_next , { desc = ' Go to next [D]iagnostic message ' } )
vim.keymap . set ( ' n ' , ' <leader>e ' , vim.diagnostic . open_float , { desc = ' Show diagnostic [E]rror messages ' } )
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
@ -99,7 +105,7 @@ vim.keymap.set('n', '<C-j>', '<C-w><C-j>', { desc = 'Move focus to the lower win
vim.keymap . set ( ' n ' , ' <C-k> ' , ' <C-w><C-k> ' , { desc = ' Move focus to the upper window ' } )
-- [[ Basic Autocommands ]]
-- See :help lua-guide-autocommands
-- See ` :help lua-guide-autocommands`
-- Highlight when yanking (copying) text
-- Try it with `yap` in normal mode
@ -115,9 +121,12 @@ vim.api.nvim_create_autocmd('TextYankPost', {
-- [[ 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.loop . fs_stat ( lazypath ) then
if not ( vim.uv or vim.loop ) . fs_stat ( lazypath ) then
local lazyrepo = ' https://github.com/folke/lazy.nvim.git '
vim.fn . system { ' git ' , ' clone ' , ' --filter=blob:none ' , ' --branch=stable ' , lazyrepo , lazypath }
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 ---@diagnostic disable-next-line: undefined-field
vim.opt . rtp : prepend ( lazypath )
@ -128,7 +137,7 @@ vim.opt.rtp:prepend(lazypath)
--
-- You can press `?` in this menu for help. Use `:q` to close the window
--
-- To update plugins , you can run
-- To update plugins you can run
-- :Lazy update
--
-- NOTE: Here is where you install your plugins.
@ -141,25 +150,20 @@ require('lazy').setup({
' tpope/vim-fugitive ' ,
' tpope/vim-rhubarb ' ,
-- NOTE: Plugins can be added with a link (or for a github repo: 'owner/repo' link).
' tpope/vim-sleuth ' , -- Detect tabstop and shiftwidth automatically
-- NOTE: Plugins can also be added by using a table,
-- 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.
--
-- This is equivalent to:
-- require('Comment').setup({})
-- "gc" to comment visual regions/lines
{ ' numToStr/Comment.nvim ' , opts = { } } ,
-- Useful status updates for LSP
-- NOTE: `opts = {}` is the same as calling `require('fidget').setup({})`
{ ' j-hui/fidget.nvim ' , tag = ' legacy ' , opts = { } } ,
-- Additional lua configuration, makes nvim stuff amazing!
' folke/neodev.nvim ' ,
{
-- Autocompletion
' hrsh7th/nvim-cmp ' ,
@ -175,8 +179,12 @@ require('lazy').setup({
-- Useful plugin to show you pending keybinds.
{ ' folke/which-key.nvim ' , opts = { } } ,
{
-- Adds git related signs to the gutter, as well as utilities for managing changes
-- Here is a more advanced example where we pass configuration
-- options to `gitsigns.nvim`. This is equivalent to the following Lua:
-- require('gitsigns').setup({ ... })
--
-- 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 ' ,
opts = {
signs = {
@ -233,10 +241,10 @@ require('lazy').setup({
-- lazy loading plugins that don't need to be loaded immediately at startup.
--
-- For example, in the following configuration, we use:
-- event = 'V eryLazy '
-- event = 'V imEnt er'
--
-- which loads which-key after all the UI elements are loaded. Events can be
-- normal autocommands events ( :help autoco md-events).
-- 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:
@ -244,19 +252,56 @@ require('lazy').setup({
{ -- Useful plugin to show you pending keybinds.
' folke/which-key.nvim ' ,
event = ' VeryLazy ' , -- Sets the loading event to 'VeryLazy'
config = function ( ) -- This is the function that runs, AFTER loading
require ( ' which-key ' ) . setup ( )
event = ' VimEnter ' , -- Sets the loading event to 'VimEnter'
opts = {
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 whick-key.nvim defined Nerd Font icons, otherwise define a string table
keys = vim.g . have_nerd_font and { } or {
Up = ' <Up> ' ,
Down = ' <Down> ' ,
Left = ' <Left> ' ,
Right = ' <Right> ' ,
C = ' <C-…> ' ,
M = ' <M-…> ' ,
D = ' <D-…> ' ,
S = ' <S-…> ' ,
CR = ' <CR> ' ,
Esc = ' <Esc> ' ,
ScrollWheelDown = ' <ScrollWheelDown> ' ,
ScrollWheelUp = ' <ScrollWheelUp> ' ,
NL = ' <NL> ' ,
BS = ' <BS> ' ,
Space = ' <Space> ' ,
Tab = ' <Tab> ' ,
F1 = ' <F1> ' ,
F2 = ' <F2> ' ,
F3 = ' <F3> ' ,
F4 = ' <F4> ' ,
F5 = ' <F5> ' ,
F6 = ' <F6> ' ,
F7 = ' <F7> ' ,
F8 = ' <F8> ' ,
F9 = ' <F9> ' ,
F10 = ' <F10> ' ,
F11 = ' <F11> ' ,
F12 = ' <F12> ' ,
} ,
} ,
-- Document existing key chains
require ( ' which-key ' ) . register {
[ ' <leader>c ' ] = { name = ' [C]ode ' , _ = ' which_key_ignore ' } ,
[ ' <leader>d ' ] = { name = ' [D]ocument ' , _ = ' which_key_ignore ' } ,
[ ' <leader>r ' ] = { name = ' [R]ename ' , _ = ' which_key_ignore ' } ,
[ ' <leader>s ' ] = { name = ' [S]earch ' , _ = ' which_key_ignore ' } ,
[ ' <leader>w ' ] = { name = ' [W]orkspace ' , _ = ' which_key_ignore ' } ,
}
end ,
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 ' } } ,
} ,
} ,
} ,
-- NOTE: Plugins can specify dependencies.
@ -268,11 +313,11 @@ require('lazy').setup({
{ -- Fuzzy Finder (files, lsp, etc)
' nvim-telescope/telescope.nvim ' ,
event = ' V eryLazy ' ,
event = ' V imEnt er' ,
branch = ' 0.1.x ' ,
dependencies = {
' nvim-lua/plenary.nvim ' ,
{ -- If encountering errors, see telescope-fzf-native README for install instructions
{ -- If encountering errors, see telescope-fzf-native README for install ation instructions
' nvim-telescope/telescope-fzf-native.nvim ' ,
-- `build` is used to run some command when the plugin is installed/updated.
@ -287,29 +332,27 @@ require('lazy').setup({
} ,
{ ' nvim-telescope/telescope-ui-select.nvim ' } ,
-- Useful for getting pretty icons, but requires special font.
-- If you already have a Nerd Font, or terminal set up with fallback fonts
-- you can enable this
-- { 'nvim-tree/nvim-web-devicons' }
-- Useful for getting pretty icons, but requires a Nerd Font.
{ ' nvim-tree/nvim-web-devicons ' , enabled = vim.g . have_nerd_font } ,
} ,
config = function ( )
-- 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!
--
-- The easiest way to use t elescope, is to start by doing something like:
-- The easiest way to use T elescope, 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
-- 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 t elescope are:
-- Two important keymaps to use while in T elescope are:
-- - Insert mode: <c-/>
-- - Normal mode: ?
--
-- This opens a window that shows you all of the keymaps for the current
-- t elescope picker. This is really useful to discover what Telescope can
-- T elescope picker. This is really useful to discover what Telescope can
-- do as well as how to actually do it!
-- [[ Configure Telescope ]]
@ -331,7 +374,7 @@ require('lazy').setup({
} ,
}
-- 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 , ' ui-select ' )
@ -350,14 +393,14 @@ require('lazy').setup({
-- Slightly advanced example of overriding default behavior and theme
vim.keymap . set ( ' n ' , ' <leader>/ ' , function ( )
-- You can pass additional configuration to telescope to chang e theme, layout, etc.
-- You can pass additional configuration to Telescope to change th e theme, layout, etc.
builtin.current_buffer_fuzzy_find ( require ( ' telescope.themes ' ) . get_dropdown {
winblend = 10 ,
previewer = false ,
} )
end , { desc = ' [/] Fuzzily search in current buffer ' } )
-- A lso possible to pass additional configuration options.
-- It's a lso possible to pass additional configuration options.
-- See `:help telescope.builtin.live_grep()` for information about particular keys
vim.keymap . set ( ' n ' , ' <leader>s/ ' , function ( )
builtin.live_grep {
@ -366,35 +409,53 @@ require('lazy').setup({
}
end , { desc = ' [S]earch [/] in Open Files ' } )
-- Shortcut for searching your n eovim configuration files
-- Shortcut for searching your N eovim 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 ,
} ,
{ -- LSP Configuration & Plugins
-- LSP Plugins
{
-- `lazydev` configures Lua LSP for your Neovim config, runtime and plugins
-- used for completion, annotations and signatures of Neovim apis
' folke/lazydev.nvim ' ,
ft = ' lua ' ,
opts = {
library = {
-- Load luvit types when the `vim.uv` word is found
{ path = ' luvit-meta/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 ' ,
-- Automatically install LSPs and related tools to stdpath for N eovim
{ ' williamboman/mason.nvim ' , config = true } , -- NOTE: Must be loaded before dependants
' 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-lsp ' ,
} ,
config = function ( )
-- Brief Aside: **What is LSP?**
-- Brief a side: **What is LSP?**
--
-- LSP is an acronym you've probably heard, but might not understand what it is.
-- LSP is an initialis m you've probably heard, but might not understand what it is.
--
-- LSP stands for Language Server Protocol. It's a protocol that helps editors
-- and language tooling communicate in a standardized fashion.
--
-- In general, you have a "server" which is some tool built to understand a particular
-- language (such as `gopls`, `lua_ls`, `rust_analyzer`, etc ). These Language Servers
-- language (such as `gopls`, `lua_ls`, `rust_analyzer`, etc . ). These Language Servers
-- (sometimes called LSP servers, but that's kind of like ATM Machine) are standalone
-- processes that communicate with some "client" - in this case, Neovim!
--
@ -409,7 +470,7 @@ require('lazy').setup({
-- 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
-- and elegantly composed help section, ` :help lsp-vs-treesitter`
-- 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
@ -418,19 +479,19 @@ require('lazy').setup({
vim.api . nvim_create_autocmd ( ' LspAttach ' , {
group = vim.api . nvim_create_augroup ( ' kickstart-lsp-attach ' , { clear = true } ) ,
callback = function ( event )
-- NOTE: Remember that lua is a real programming language, and as such it is possible
-- to define small helper and utility functions so you don't have to repeat yourself
-- many times.
-- NOTE: Remember that Lua is a real programming language, and as such it is possible
-- to define small helper and utility functions so you don't have to repeat yourself.
--
-- In this case, we create a function that lets us more easily define mappings specific
-- for LSP related items. It sets the mode, buffer and description for us each time.
local map = function ( keys , func , desc )
vim.keymap . set ( ' n ' , keys , func , { buffer = event.buf , desc = ' LSP: ' .. desc } )
local map = function ( keys , func , desc , mode )
mode = mode or ' n '
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 >.
-- To jump back, press <C- t >.
map ( ' gd ' , require ( ' telescope.builtin ' ) . lsp_definitions , ' [G]oto [D]efinition ' )
-- Find references for the word under your cursor.
@ -449,24 +510,20 @@ require('lazy').setup({
-- Symbols are things like variables, functions, types, etc.
map ( ' <leader>ds ' , require ( ' telescope.builtin ' ) . lsp_document_symbols , ' [D]ocument [S]ymbols ' )
-- Fuzzy find all the symbols in your current workspace
-- Similar to document symbols, except searches over your whol e project.
-- Fuzzy find all the symbols in your current workspace .
-- Similar to document symbols, except searches over your entir e project.
map ( ' <leader>ws ' , require ( ' telescope.builtin ' ) . lsp_dynamic_workspace_symbols , ' [W]orkspace [S]ymbols ' )
-- Rename the variable under your cursor
-- 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 ' )
-- 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 ' )
-- Opens a popup that displays documentation about the word under your cursor
-- See `:help K` for why this keymap
map ( ' K ' , vim.lsp . buf.hover , ' Hover Documentation ' )
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
-- For example, in C this would take you to the header.
map ( ' gD ' , vim.lsp . buf.declaration , ' [G]oto [D]eclaration ' )
-- The following two autocommands are used to highlight references of the
@ -475,22 +532,43 @@ 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.server_capabilities . documentHighlightProvider then
if client and client.supports_method ( vim.lsp . protocol.Methods . textDocument_documentHighlight ) then
local highlight_augroup = vim.api . nvim_create_augroup ( ' kickstart-lsp-highlight ' , { clear = false } )
vim.api . nvim_create_autocmd ( { ' CursorHold ' , ' CursorHoldI ' } , {
buffer = event.buf ,
group = highlight_augroup ,
callback = vim.lsp . buf.document_highlight ,
} )
vim.api . nvim_create_autocmd ( { ' CursorMoved ' , ' CursorMovedI ' } , {
buffer = event.buf ,
group = highlight_augroup ,
callback = vim.lsp . buf.clear_references ,
} )
vim.api . nvim_create_autocmd ( ' LspDetach ' , {
group = vim.api . nvim_create_augroup ( ' kickstart-lsp-detach ' , { clear = true } ) ,
callback = function ( event2 )
vim.lsp . buf.clear_references ( )
vim.api . nvim_clear_autocmds { group = ' kickstart-lsp-highlight ' , buffer = event2.buf }
end ,
} )
end
-- The following code creates a keymap to toggle inlay hints in your
-- code, if the language server you are using supports them
--
-- This may be unwanted, since they displace some of your code
if client and client.supports_method ( vim.lsp . protocol.Methods . textDocument_inlayHint ) 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 ' )
end
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.
-- By default, Neovim doesn't support everything that is in the LSP s pecification.
-- 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 ( )
@ -515,27 +593,18 @@ 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 = {},
--
lua_ls = {
-- cmd = {...},
-- filetypes { ...},
-- filetypes = { ...},
-- capabilities = {},
settings = {
Lua = {
runtime = { version = ' LuaJIT ' } ,
workspace = {
checkThirdParty = false ,
-- Tells lua_ls where to find all the Lua files that you have loaded
-- for your neovim configuration.
library = {
' ${3rd}/luv/library ' ,
unpack ( vim.api . nvim_get_runtime_file ( ' ' , true ) ) ,
} ,
-- If lua_ls is really slow on your computer, you can try this instead:
-- library = { vim.env.VIMRUNTIME },
completion = {
callSnippet = ' Replace ' ,
} ,
-- You can toggle below to ignore Lua_LS's noisy `missing-fields` warnings
-- diagnostics = { disable = { 'missing-fields' } },
@ -549,14 +618,14 @@ require('lazy').setup({
-- other tools, you can run
-- :Mason
--
-- You can press `g?` for help in this menu
-- You can press `g?` for help in this menu .
require ( ' mason ' ) . setup ( )
-- 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 { } )
vim.list_extend ( ensure_installed , {
' stylua ' , -- Used to format l ua code
' stylua ' , -- Used to format L ua code
} )
require ( ' mason-tool-installer ' ) . setup { ensure_installed = ensure_installed }
@ -564,15 +633,11 @@ require('lazy').setup({
handlers = {
function ( server_name )
local server = servers [ server_name ] or { }
require ( ' lspconfig ' ) [ server_name ] . setup {
cmd = server.cmd ,
settings = server.settings ,
filetypes = server.filetypes ,
-- 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 )
capabilities = vim.tbl_deep_extend ( ' force ' , { } , capabilities , server.capabilities or { } ) ,
}
-- certain features of an LSP (for example, turning off formatting for ts_ls)
server.capabilities = vim.tbl_deep_extend ( ' force ' , { } , capabilities , server.capabilities or { } )
require ( ' lspconfig ' ) [ server_name ] . setup ( server )
end ,
} ,
}
@ -581,6 +646,18 @@ require('lazy').setup({
{ -- Autoformat
' stevearc/conform.nvim ' ,
event = { ' BufWritePre ' } ,
cmd = { ' ConformInfo ' } ,
keys = {
{
' <leader>f ' ,
function ( )
require ( ' conform ' ) . format { async = true , lsp_format = ' fallback ' }
end ,
mode = ' ' ,
desc = ' [F]ormat buffer ' ,
} ,
} ,
opts = {
notify_on_error = false ,
format_on_save = false ,
@ -589,9 +666,8 @@ require('lazy').setup({
-- Conform can also run multiple formatters sequentially
-- python = { "isort", "black" },
--
-- You can use a sub-list to tell conform to run *until* a formatter
-- is found.
-- javascript = { { "prettierd", "prettier" } },
-- You can use 'stop_after_first' to run the first available formatter from the list
-- javascript = { "prettierd", "prettier", stop_after_first = true },
} ,
} ,
} ,
@ -604,14 +680,25 @@ require('lazy').setup({
{
' L3MON4D3/LuaSnip ' ,
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
-- 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()
-- require('luasnip.loaders.from_vscode').lazy_load()
-- end,
-- },
} ,
} ,
' saadparwaiz1/cmp_luasnip ' ,
@ -620,12 +707,6 @@ require('lazy').setup({
-- into multiple repos for maintenance purposes.
' hrsh7th/cmp-nvim-lsp ' ,
' hrsh7th/cmp-path ' ,
-- If you want to add a bunch of pre-configured snippets,
-- you can use this plugin to help you. It even has snippets
-- for various frameworks/libraries/etc. but you will have to
-- set up the ones that are useful for you.
-- 'rafamadriz/friendly-snippets',
} ,
config = function ( )
-- See `:help cmp`
@ -651,11 +732,21 @@ require('lazy').setup({
-- 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.
@ -679,8 +770,16 @@ require('lazy').setup({
luasnip.jump ( - 1 )
end
end , { ' i ' , ' s ' } ) ,
-- 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 ' } ,
@ -707,7 +806,7 @@ require('lazy').setup({
-- },
-- Highlight todo, notes, etc in comments
{ ' folke/todo-comments.nvim ' , dependencies = { ' nvim-lua/plenary.nvim ' } , opts = { signs = false } } ,
{ ' folke/todo-comments.nvim ' , event = ' VimEnter ' , dependencies = { ' nvim-lua/plenary.nvim ' } , opts = { signs = false } } ,
{ -- Collection of various small independent plugins/modules
' echasnovski/mini.nvim ' ,
@ -715,8 +814,8 @@ require('lazy').setup({
-- Better Around/Inside textobjects
--
-- Examples:
-- - va) - [V]isually select [A]round [)]paren then
-- - yinq - [Y]ank [I]nside [N]ext [ ']q uote
-- - va) - [V]isually select [A]round [)]paren
-- - yinq - [Y]ank [I]nside [N]ext [ Q] uote
-- - ci' - [C]hange [I]nside [']quote
require ( ' mini.ai ' ) . setup { n_lines = 500 }
@ -730,13 +829,22 @@ require('lazy').setup({
-- Simple and easy statusline.
-- You could remove this setup call if you don't like it,
-- and try some other statusline plugin
require ( ' mini.statusline ' ) . setup ( )
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/echasnovski/mini.nvim
end ,
} ,
{ -- Highlight, edit, and navigate code
' nvim-treesitter/nvim-treesitter ' ,
build = ' :TSUpdate ' ,
@ -773,22 +881,26 @@ require('lazy').setup({
-- The following two 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
-- p ut them in the right spots if you want .
-- p lace them in the correct locations .
-- NOTE: Next step on your Neovim journey: Add/Configure additional plugins for k ickstart
-- NOTE: Next step on your Neovim journey: Add/Configure additional plugins for K ickstart
--
-- Here are some example plugins that I've included in the k ickstart repository.
-- Here are some example plugins that I've included in the K ickstart 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 recommend 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.
--
-- For additional information see: https://github.com/folke/lazy.nvim#-structuring-your-plugins
{ import = ' custom.plugins ' } ,
} , { } )
} )
-- [[ Setting options ]]
-- See `:help vim.o`
@ -1122,9 +1234,6 @@ local servers = {
} ,
}
-- Setup neovim lua configuration
require ( ' neodev ' ) . setup ( )
-- nvim-cmp supports additional completion capabilities, so broadcast that to servers
local capabilities = vim.lsp . protocol.make_client_capabilities ( )
capabilities = require ( ' cmp_nvim_lsp ' ) . default_capabilities ( capabilities )