Compare commits

..

No commits in common. "174b5fa2b13e7107a05e974e44f9bf59dece95f9" and "4b065ad2f71935b8b053d26a65735f40bdc85969" have entirely different histories.

11 changed files with 1093 additions and 1057 deletions

4
.gitignore vendored
View File

@ -6,9 +6,9 @@ nvim
spell/ spell/
# In your personal fork, you likely want to comment this, since it's recommended to track # In your personal fork, you likely want to comment this, since it's recommended to track
# nvim-pack-lock.json in version control - see :help vim.pack-lockfile # lazy-lock.json in version control - see https://lazy.folke.io/usage/lockfile
# For the official `nvim-lua/kickstart.nvim` git repository, we leave it ignored to avoid unneeded # For the official `nvim-lua/kickstart.nvim` git repository, we leave it ignored to avoid unneeded
# merge conflicts. # merge conflicts.
nvim-pack-lock.json lazy-lock.json
.DS_Store .DS_Store

View File

@ -69,9 +69,9 @@ fork to your machine using one of the commands below, depending on your OS.
> Your fork's URL will be something like this: > Your fork's URL will be something like this:
> `https://github.com/<your_github_username>/kickstart.nvim.git` > `https://github.com/<your_github_username>/kickstart.nvim.git`
You likely want to remove `nvim-pack-lock.json` from your fork's `.gitignore` You likely want to remove `lazy-lock.json` from your fork's `.gitignore` file
file too - it's ignored in the kickstart repo to make maintenance easier, but too - it's ignored in the kickstart repo to make maintenance easier, but it's
it's recommended to track it in version control (see `:help vim.pack-lockfile`). [recommended to track it in version control](https://lazy.folke.io/usage/lockfile).
#### Clone kickstart.nvim #### Clone kickstart.nvim
@ -111,10 +111,8 @@ Start Neovim
nvim nvim
``` ```
That's it! `vim.pack` will install all the plugins from your config. Use That's it! Lazy will install all the plugins you have. Use `:Lazy` to view
`:lua vim.pack.update(nil, { offline = true })` to inspect plugin state and the current plugin status. Hit `q` to close the window.
`:lua vim.pack.update()` to fetch updates (`:write` applies updates, `:quit`
cancels them).
#### Read The Friendly Documentation #### Read The Friendly Documentation
@ -148,8 +146,7 @@ examples of adding popularly requested plugins.
`~/.local/share/nvim-kickstart`. You can apply this approach to any Neovim `~/.local/share/nvim-kickstart`. You can apply this approach to any Neovim
distribution that you would like to try out. distribution that you would like to try out.
* What if I want to "uninstall" this configuration: * What if I want to "uninstall" this configuration:
* Remove your config directory and local data directory (for example, * See [lazy.nvim uninstall](https://lazy.folke.io/usage#-uninstalling) information
`~/.config/nvim` and `~/.local/share/nvim`).
* Why is the kickstart `init.lua` a single file? Wouldn't it make sense to split it into multiple files? * Why is the kickstart `init.lua` a single file? Wouldn't it make sense to split it into multiple files?
* The main purpose of kickstart is to serve as a teaching tool and a reference * The main purpose of kickstart is to serve as a teaching tool and a reference
configuration that someone can easily use to `git clone` as a basis for their own. configuration that someone can easily use to `git clone` as a basis for their own.
@ -170,36 +167,17 @@ After installing all the dependencies continue with the [Install Kickstart](#ins
#### Windows Installation #### Windows Installation
<details><summary>Windows with Microsoft C++ Build Tools and CMake</summary> <details><summary>Windows with Microsoft C++ Build Tools and CMake</summary>
Kickstart's default config is make-only for `telescope-fzf-native.nvim`. Installation may require installing build tools and updating the run command for `telescope-fzf-native`
If `make` is unavailable, the plugin is skipped.
Recommended: install `make` (see the chocolatey section below). See `telescope-fzf-native` documentation for [more details](https://github.com/nvim-telescope/telescope-fzf-native.nvim#installation)
If you want a CMake-only setup, customize `init.lua` in two places: This requires:
1. Include `telescope-fzf-native.nvim` when `cmake` is available: - Install CMake and the Microsoft C++ Build Tools on Windows
```lua ```lua
if vim.fn.executable 'make' == 1 or vim.fn.executable 'cmake' == 1 then {'nvim-telescope/telescope-fzf-native.nvim', build = 'cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build' }
table.insert(plugins, gh 'nvim-telescope/telescope-fzf-native.nvim')
end
``` ```
2. In the `PackChanged` hook, use CMake when `make` is unavailable:
```lua
if name == 'telescope-fzf-native.nvim' then
if vim.fn.executable 'make' == 1 then
run_build(name, { 'make' }, ev.data.path)
elseif vim.fn.executable 'cmake' == 1 then
run_build(name, { 'cmake', '-S.', '-Bbuild', '-DCMAKE_BUILD_TYPE=Release' }, ev.data.path)
run_build(name, { 'cmake', '--build', 'build', '--config', 'Release', '--target', 'install' }, ev.data.path)
end
return
end
```
See `telescope-fzf-native` documentation for [build details](https://github.com/nvim-telescope/telescope-fzf-native.nvim#installation).
</details> </details>
<details><summary>Windows with gcc/make using chocolatey</summary> <details><summary>Windows with gcc/make using chocolatey</summary>
Alternatively, one can install gcc and make which don't require changing the config, Alternatively, one can install gcc and make which don't require changing the config,

811
init.lua
View File

@ -84,104 +84,96 @@ 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! :)
--]] --]]
-- ============================================================ -- Set <space> as the leader key
-- SECTION 1: FOUNDATION -- See `:help mapleader`
-- Core Neovim settings, leaders, options, basic keymaps, basic autocmds -- NOTE: Must happen before plugins are loaded (otherwise wrong leader will be used)
-- ============================================================ vim.g.mapleader = ' '
do vim.g.maplocalleader = ' '
-- Enable faster startup by caching compiled Lua modules
vim.loader.enable()
-- Set <space> as the leader key -- Set to true if you have a Nerd Font installed and selected in the terminal
-- See `:help mapleader` vim.g.have_nerd_font = false
-- NOTE: Must happen before plugins are loaded (otherwise wrong leader will be used)
vim.g.mapleader = ' '
vim.g.maplocalleader = ' '
-- Set to true if you have a Nerd Font installed and selected in the terminal -- [[ Setting options ]]
vim.g.have_nerd_font = false -- See `:help vim.o`
-- NOTE: You can change these options as you wish!
-- For more options, you can see `:help option-list`
-- [[ Setting options ]] -- Make line numbers default
-- See `:help vim.o` vim.o.number = true
-- NOTE: You can change these options as you wish! -- You can also add relative line numbers, to help with jumping.
-- For more options, you can see `:help option-list` -- Experiment for yourself to see if you like it!
-- vim.o.relativenumber = true
-- Make line numbers default -- Enable mouse mode, can be useful for resizing splits for example!
vim.o.number = true vim.o.mouse = 'a'
-- You can also add relative line numbers, to help with jumping.
-- Experiment for yourself to see if you like it!
-- vim.o.relativenumber = true
-- Enable mouse mode, can be useful for resizing splits for example! -- Don't show the mode, since it's already in the status line
vim.o.mouse = 'a' vim.o.showmode = false
-- Don't show the mode, since it's already in the status line -- Sync clipboard between OS and Neovim.
vim.o.showmode = false -- 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)
-- Sync clipboard between OS and Neovim. -- Enable break indent
-- Schedule the setting after `UiEnter` because it can increase startup-time. vim.o.breakindent = true
-- Remove this option if you want your OS clipboard to remain independent.
-- See `:help 'clipboard'`
vim.schedule(function() vim.o.clipboard = 'unnamedplus' end)
-- Enable break indent -- Enable undo/redo changes even after closing and reopening a file
vim.o.breakindent = true vim.o.undofile = true
-- Enable undo/redo changes even after closing and reopening a file -- Case-insensitive searching UNLESS \C or one or more capital letters in the search term
vim.o.undofile = true vim.o.ignorecase = true
vim.o.smartcase = true
-- Case-insensitive searching UNLESS \C or one or more capital letters in the search term -- Keep signcolumn on by default
vim.o.ignorecase = true vim.o.signcolumn = 'yes'
vim.o.smartcase = true
-- Keep signcolumn on by default -- Decrease update time
vim.o.signcolumn = 'yes' vim.o.updatetime = 250
-- Decrease update time -- Decrease mapped sequence wait time
vim.o.updatetime = 250 vim.o.timeoutlen = 300
-- Decrease mapped sequence wait time -- Configure how new splits should be opened
vim.o.timeoutlen = 300 vim.o.splitright = true
vim.o.splitbelow = true
-- Configure how new splits should be opened -- Sets how neovim will display certain whitespace characters in the editor.
vim.o.splitright = true -- See `:help 'list'`
vim.o.splitbelow = true -- 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 = '' }
-- Sets how neovim will display certain whitespace characters in the editor. -- Preview substitutions live, as you type!
-- See `:help 'list'` vim.o.inccommand = 'split'
-- 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 = '' }
-- Preview substitutions live, as you type! -- Show which line your cursor is on
vim.o.inccommand = 'split' vim.o.cursorline = true
-- Show which line your cursor is on -- Minimal number of screen lines to keep above and below the cursor.
vim.o.cursorline = true vim.o.scrolloff = 10
-- Minimal number of screen lines to keep above and below the cursor. -- if performing an operation that would fail due to unsaved changes in the buffer (like `:q`),
vim.o.scrolloff = 10 -- instead raise a dialog asking if you wish to save the current file(s)
-- See `:help 'confirm'`
vim.o.confirm = true
-- if performing an operation that would fail due to unsaved changes in the buffer (like `:q`), -- [[ Basic Keymaps ]]
-- instead raise a dialog asking if you wish to save the current file(s) -- See `:help vim.keymap.set()`
-- See `:help 'confirm'`
vim.o.confirm = true
-- [[ Basic Keymaps ]] -- Clear highlights on search when pressing <Esc> in normal mode
-- See `:help vim.keymap.set()` -- See `:help hlsearch`
vim.keymap.set('n', '<Esc>', '<cmd>nohlsearch<CR>')
-- Clear highlights on search when pressing <Esc> in normal mode -- Diagnostic Config & Keymaps
-- See `:help hlsearch` -- See :help vim.diagnostic.Opts
vim.keymap.set('n', '<Esc>', '<cmd>nohlsearch<CR>') vim.diagnostic.config {
-- Diagnostic Config & Keymaps
-- See `:help vim.diagnostic.Opts`
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' },
@ -193,158 +185,100 @@ do
-- 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,
}) })
-- [[ 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 end
-- ============================================================ ---@type vim.Option
-- SECTION 2: PLUGIN MANAGER INTRO local rtp = vim.opt.rtp
-- vim.pack intro, build hooks rtp:prepend(lazypath)
-- ============================================================
do
-- [[ Intro to `vim.pack` ]]
-- `vim.pack` is a new plugin manager built into Neovim,
-- which provides a Lua interface for installing and managing plugins.
--
-- See `:help vim.pack`, `:help vim.pack-examples` or the
-- excellent blog post from the creator of vim.pack and mini.nvim:
-- https://echasnovski.com/blog/2026-03-13-a-guide-to-vim-pack
--
-- To inspect plugin state and pending updates, run
-- :lua vim.pack.update(nil, { offline = true })
--
-- To update plugins, run
-- :lua vim.pack.update()
--
--
-- Throughout the rest of the config there will be examples
-- of how to install and configure plugins using `vim.pack`.
--
-- In this section we set up some autocommands to run build
-- steps for certain plugins after they are installed or updated.
local function run_build(name, cmd, cwd) -- [[ Configure and install plugins ]]
local result = vim.system(cmd, { cwd = cwd }):wait() --
if result.code ~= 0 then -- To check the current status of your plugins, run
local stderr = result.stderr or '' -- :Lazy
local stdout = result.stdout or '' --
local output = stderr ~= '' and stderr or stdout -- You can press `?` in this menu for help. Use `:q` to close the window
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) -- To update plugins you can run
end -- :Lazy update
end --
-- 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 = {} },
-- This autocommand runs after a plugin is installed or updated and -- Alternatively, use `config = function() ... end` for full control over the configuration.
-- runs the appropriate build command for that plugin if necessary. -- If you prefer to call `setup` explicitly, use:
-- {
-- 'lewis6991/gitsigns.nvim',
-- config = function()
-- require('gitsigns').setup({
-- -- Your gitsigns configuration here
-- })
-- end,
-- }
-- --
-- See `:help vim.pack-events` -- Here is a more advanced example where we pass configuration
vim.api.nvim_create_autocmd('PackChanged', { -- options to `gitsigns.nvim`.
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,
})
end
---Because most plugins are hosted on GitHub, you can use the helper
---function to have less repetition in the following sections.
---@param repo string
---@return string
local function gh(repo) return 'https://github.com/' .. repo end
-- ============================================================
-- SECTION 3: UI / CORE UX PLUGINS
-- guess-indent, gitsigns, which-key, colorscheme, todo-comments, mini modules
-- ============================================================
do
-- [[ Installing and Configuring Plugins ]]
-- --
-- To install a plugin simply call `vim.pack.add` with its git url. -- See `:help gitsigns` to understand what the configuration keys do
-- This will download the default branch of the plugin, which will usually be `main` or `master` { -- Adds git related signs to the gutter, as well as utilities for managing changes
-- You can also have more advanced specs, which we will talk about later. 'lewis6991/gitsigns.nvim',
-- ---@module 'gitsigns'
-- For most plugins its not enough to install them, you also need to call their `.setup()` to start them. ---@type Gitsigns.Config
-- ---@diagnostic disable-next-line: missing-fields
-- For example, lets say we want to install `guess-indent.nvim` - a plugin for opts = {
-- automatically detecting and setting the indentation.
--
-- We first install it from https://github.com/NMAC427/guess-indent.nvim
-- and then call its `setup()` function to start it with default settings.
vim.pack.add { gh 'NMAC427/guess-indent.nvim' }
require('guess-indent').setup {}
-- Because lua is a real programming language, you can also have some logic to your installation -
-- like only installing a plugin if a condition is met.
--
-- Here we only install `nvim-web-devicons` (which adds pretty icons) if we have a Nerd Font,
-- since otherwise the icons won't display properly.
if vim.g.have_nerd_font then vim.pack.add { gh 'nvim-tree/nvim-web-devicons' } end
-- Here is a more advanced configuration example that passes options to `gitsigns.nvim`
--
-- See `:help gitsigns` to understand what each configuration key does.
-- Adds git related signs to the gutter, as well as utilities for managing changes
vim.pack.add { gh 'lewis6991/gitsigns.nvim' }
require('gitsigns').setup {
signs = { 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
@ -352,14 +286,34 @@ do
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. -- NOTE: Plugins can also be configured to run Lua code when they are loaded.
vim.pack.add { gh 'folke/which-key.nvim' } --
require('which-key').setup { -- This is often very useful to both group configuration, as well as handle
-- Delay between pressing a key and opening which-key (milliseconds) -- 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)
delay = 0, delay = 0,
icons = { mappings = vim.g.have_nerd_font }, icons = { mappings = vim.g.have_nerd_font },
-- Document existing key chains -- Document existing key chains
spec = { spec = {
{ '<leader>s', group = '[S]earch', mode = { 'n', 'v' } }, { '<leader>s', group = '[S]earch', mode = { 'n', 'v' } },
@ -367,88 +321,52 @@ do
{ '<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' } },
}, },
}
-- [[ 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.
--
-- If you want to see what colorschemes are already installed, you can use `:Telescope colorscheme`.
vim.pack.add { gh 'folke/tokyonight.nvim' }
---@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
vim.pack.add { gh 'folke/todo-comments.nvim' }
require('todo-comments').setup { signs = false }
-- [[ mini.nvim ]]
-- A collection of various small independent plugins/modules
vim.pack.add { gh 'nvim-mini/mini.nvim' }
-- Better Around/Inside textobjects
--
-- Examples:
-- - va) - [V]isually select [A]round [)]paren
-- - yiiq - [Y]ank [I]nside [I]+1 [Q]uote
-- - ci' - [C]hange [I]nside [']quote
require('mini.ai').setup {
-- NOTE: Avoid conflicts with the built-in incremental selection mappings on Neovim>=0.12 (see `:help treesitter-incremental-selection`)
mappings = {
around_next = 'aa',
inside_next = 'ii',
}, },
n_lines = 500,
}
-- Add/delete/replace surroundings (brackets, quotes, etc.) -- NOTE: Plugins can specify dependencies.
-- --
-- - saiw) - [S]urround [A]dd [I]nner [W]ord [)]Paren -- The dependencies are proper plugin specifications as well - anything
-- - sd' - [S]urround [D]elete [']quotes -- you do for a plugin at the top level, you can do for a dependency.
-- - 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) ]]
-- --
-- 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,
-- its 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,
},
{ 'nvim-telescope/telescope-ui-select.nvim' },
-- 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 -- 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 -- 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! -- 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: -- The easiest way to use Telescope, is to start by doing something like:
-- :Telescope help_tags -- :Telescope help_tags
-- --
@ -464,17 +382,7 @@ do
-- Telescope picker. This is really useful to discover what Telescope can -- Telescope picker. This is really useful to discover what Telescope can
-- do as well as how to actually do it! -- do as well as how to actually do it!
---@type (string|vim.pack.Spec)[] -- [[ Configure Telescope ]]
local telescope_plugins = {
gh 'nvim-lua/plenary.nvim',
gh 'nvim-telescope/telescope.nvim',
gh 'nvim-telescope/telescope-ui-select.nvim',
}
if vim.fn.executable 'make' == 1 then table.insert(telescope_plugins, gh 'nvim-telescope/telescope-fzf-native.nvim') end
-- NOTE: You can install multiple plugins at once
vim.pack.add(telescope_plugins)
-- See `:help telescope` and `:help telescope.setup()` -- See `:help telescope` and `:help telescope.setup()`
require('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
@ -509,8 +417,8 @@ do
vim.keymap.set('n', '<leader>sc', builtin.commands, { desc = '[S]earch [C]ommands' }) vim.keymap.set('n', '<leader>sc', builtin.commands, { desc = '[S]earch [C]ommands' })
vim.keymap.set('n', '<leader><leader>', builtin.buffers, { desc = '[ ] Find existing buffers' }) vim.keymap.set('n', '<leader><leader>', builtin.buffers, { desc = '[ ] Find existing buffers' })
-- Add Telescope-based LSP pickers when an LSP attaches to a buffer. -- This runs on LSP attach per buffer (see main LSP attach function in 'neovim/nvim-lspconfig' config for more info,
-- If you later switch picker plugins, this is where to update these mappings. -- it is better explained there). This allows easily switching between pickers if you prefer using something else!
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)
@ -568,14 +476,32 @@ do
-- 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 end,
},
-- ============================================================ -- LSP Plugins
-- SECTION 5: LSP {
-- LSP keymaps, server configuration, Mason tools installations -- Main LSP Configuration
-- ============================================================ 'neovim/nvim-lspconfig',
do dependencies = {
-- [[ LSP Configuration ]] -- 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()
-- Brief aside: **What is LSP?** -- Brief aside: **What is LSP?**
-- --
-- LSP is an initialism you've probably heard, but might not understand what it is. -- LSP is an initialism you've probably heard, but might not understand what it is.
@ -601,10 +527,6 @@ do
-- If you're wondering about lsp vs treesitter, you can check out the wonderfully -- 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`
-- Useful status updates for LSP.
vim.pack.add { gh 'j-hui/fidget.nvim' }
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
@ -726,16 +648,6 @@ do
}, },
} }
vim.pack.add {
gh 'neovim/nvim-lspconfig',
gh 'mason-org/mason.nvim',
gh 'mason-org/mason-lspconfig.nvim',
gh 'WhoIsSethDaniel/mason-tool-installer.nvim',
}
-- Automatically install LSPs and related tools to stdpath for Neovim
require('mason').setup {}
-- 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
@ -754,16 +666,24 @@ do
vim.lsp.config(name, server) vim.lsp.config(name, server)
vim.lsp.enable(name) vim.lsp.enable(name)
end end
end end,
},
-- ============================================================ { -- Autoformat
-- SECTION 6: FORMATTING 'stevearc/conform.nvim',
-- conform.nvim setup and keymap event = { 'BufWritePre' },
-- ============================================================ cmd = { 'ConformInfo' },
do keys = {
-- [[ Formatting ]] {
vim.pack.add { gh 'stevearc/conform.nvim' } '<leader>f',
require('conform').setup { function() require('conform').format { async = true } end,
mode = '',
desc = '[F]ormat buffer',
},
},
---@module 'conform'
---@type conform.setupOpts
opts = {
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:
@ -789,33 +709,42 @@ do
-- 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' })
end
-- ============================================================
-- SECTION 7: AUTOCOMPLETE & SNIPPETS
-- blink.cmp and luasnip setup
-- ============================================================
do
-- [[ Snippet Engine ]]
-- NOTE: You can also specify plugin using a version range for its git tag.
-- See `:help vim.version.range()` for more info
vim.pack.add { { src = gh 'L3MON4D3/LuaSnip', version = vim.version.range '2.*' } }
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. -- `friendly-snippets` contains a variety of premade snippets.
-- See the README about individual language/framework/plugin snippets: -- See the README about individual language/framework/plugin snippets:
-- https://github.com/rafamadriz/friendly-snippets -- https://github.com/rafamadriz/friendly-snippets
-- -- {
-- vim.pack.add { gh 'rafamadriz/friendly-snippets' } -- 'rafamadriz/friendly-snippets',
-- config = function()
-- require('luasnip.loaders.from_vscode').lazy_load() -- require('luasnip.loaders.from_vscode').lazy_load()
-- end,
-- [[ Autocomplete Engine ]] -- },
vim.pack.add { { src = gh 'saghen/blink.cmp', version = vim.version.range '1.*' } } },
require('blink.cmp').setup { opts = {},
},
},
---@module 'blink.cmp'
---@type blink.cmp.Config
opts = {
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.
@ -837,7 +766,7 @@ do
-- <c-e>: Hide menu -- <c-e>: Hide menu
-- <c-k>: Toggle signature help -- <c-k>: Toggle signature help
-- --
-- See `:help blink-cmp-config-keymap` for defining your own keymap -- See :h blink-cmp-config-keymap for defining your own keymap
preset = 'default', preset = 'default',
-- For more advanced Luasnip keymaps (e.g. selecting choice nodes, expansion) see: -- For more advanced Luasnip keymaps (e.g. selecting choice nodes, expansion) see:
@ -868,49 +797,119 @@ do
-- By default, we use the Lua implementation instead, but you may enable -- By default, we use the Lua implementation instead, but you may enable
-- the rust implementation via `'prefer_rust_with_warning'` -- the rust implementation via `'prefer_rust_with_warning'`
-- --
-- See `:help blink-cmp-config-fuzzy` for more information -- See :h blink-cmp-config-fuzzy for more information
fuzzy = { implementation = 'lua' }, fuzzy = { implementation = 'lua' },
-- 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 },
-- ============================================================ { -- 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 in the config to whatever the name of that colorscheme is.
-- ============================================================
do
-- [[ Configure Treesitter ]]
-- Used to highlight, edit, and navigate code
-- --
-- See `:help nvim-treesitter-intro` -- 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
},
}
-- NOTE: You can also specify a branch or a specific commit -- Load the colorscheme here.
vim.pack.add { { src = gh 'nvim-treesitter/nvim-treesitter', version = 'main' } } -- 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,
},
-- Ensure basic parsers are installed -- 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
--
-- 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,
},
{ -- 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
local parsers = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' } local parsers = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' }
require('nvim-treesitter').install(parsers) require('nvim-treesitter').install(parsers)
---@param buf integer ---@param buf integer
---@param language string ---@param language string
local function treesitter_try_attach(buf, language) local function treesitter_try_attach(buf, language)
-- Check if a parser exists and load it -- check if 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 -- enables syntax highlighting and other treesitter features
vim.treesitter.start(buf, language) vim.treesitter.start(buf, language)
-- Enable treesitter based folds -- enables treesitter based folds
-- For more info on folds see `:help folds` -- for more info on folds see `:help folds`
-- vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()' -- vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()'
-- vim.wo.foldmethod = 'expr' -- vim.wo.foldmethod = 'expr'
-- Check if treesitter indentation is available for this language, and if so enable it -- 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 -- in case there is no indent query, the indentexpr will fallback to the vim's built in one
local has_indent_query = vim.treesitter.query.get(language, 'indents') ~= nil local has_indent_query = vim.treesitter.query.get(language, 'indents') ~= nil
-- Enable treesitter based indentation -- enables 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
@ -925,24 +924,20 @@ do
local installed_parsers = require('nvim-treesitter').get_installed 'parsers' local installed_parsers = require('nvim-treesitter').get_installed 'parsers'
if vim.tbl_contains(installed_parsers, language) then if vim.tbl_contains(installed_parsers, language) then
-- Enable the parser if it is already installed -- enable the parser if it is installed
treesitter_try_attach(buf, language) treesitter_try_attach(buf, language)
elseif vim.tbl_contains(available_parsers, language) then elseif vim.tbl_contains(available_parsers, language) then
-- If a parser is available in `nvim-treesitter`, auto-install it and enable it after the installation is done -- if a parser is available in `nvim-treesitter` auto install it, and enable it after the installation is done
require('nvim-treesitter').install(language):await(function() treesitter_try_attach(buf, language) end) require('nvim-treesitter').install(language):await(function() treesitter_try_attach(buf, language) end)
else else
-- Try to enable treesitter features in case the parser exists but is not available from `nvim-treesitter` -- try to enable treesitter features in case the parser exists but is not available from `nvim-treesitter`
treesitter_try_attach(buf, language) treesitter_try_attach(buf, language)
end end
end, end,
}) })
end end,
},
-- ============================================================
-- SECTION 9: OPTIONAL EXAMPLES / NEXT STEPS
-- kickstart.plugins.* examples
-- ============================================================
do
-- The following comments only work if you have downloaded the kickstart repo, not just copy pasted the -- 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 -- 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. -- place them in the correct locations.
@ -952,18 +947,44 @@ do
-- 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: 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.
-- --
-- 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' -- { import = 'custom.plugins' },
end --
-- 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 = '💤 ',
},
},
})
-- 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

View File

@ -3,11 +3,6 @@
-- --
-- See the kickstart.nvim README for more information -- See the kickstart.nvim README for more information
-- Iterate over all Lua files in the plugins directory and load them ---@module 'lazy'
local plugins_dir = vim.fs.joinpath(vim.fn.stdpath 'config', 'lua', 'custom', 'plugins') ---@type LazySpec
for file_name, type in vim.fs.dir(plugins_dir) do return {}
if type == 'file' and file_name:match '%.lua$' and file_name ~= 'init.lua' then
local module = file_name:gsub('%.lua$', '')
require('custom.plugins.' .. module)
end
end

View File

@ -12,7 +12,7 @@ local check_version = function()
return return
end end
if vim.version.ge(vim.version(), '0.12') then if vim.version.ge(vim.version(), '0.11') then
vim.health.ok(string.format("Neovim version is: '%s'", verstr)) vim.health.ok(string.format("Neovim version is: '%s'", verstr))
else else
vim.health.error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr)) vim.health.error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr))

View File

@ -1,5 +1,10 @@
-- autopairs -- autopairs
-- https://github.com/windwp/nvim-autopairs -- https://github.com/windwp/nvim-autopairs
vim.pack.add { 'https://github.com/windwp/nvim-autopairs' } ---@module 'lazy'
require('nvim-autopairs').setup {} ---@type LazySpec
return {
'windwp/nvim-autopairs',
event = 'InsertEnter',
opts = {},
}

View File

@ -6,29 +6,42 @@
-- be extended to other languages as well. That's why it's called -- be extended to other languages as well. That's why it's called
-- kickstart.nvim and not kitchen-sink.nvim ;) -- kickstart.nvim and not kitchen-sink.nvim ;)
vim.pack.add { ---@module 'lazy'
'https://github.com/mfussenegger/nvim-dap', ---@type LazySpec
'https://github.com/rcarriga/nvim-dap-ui', return {
'https://github.com/nvim-neotest/nvim-nio', -- NOTE: Yes, you can install new plugins here!
'https://github.com/mason-org/mason.nvim', 'mfussenegger/nvim-dap',
'https://github.com/jay-babu/mason-nvim-dap.nvim', -- NOTE: And you can specify dependencies as well
'https://github.com/leoluz/nvim-dap-go', dependencies = {
} -- Creates a beautiful debugger UI
'rcarriga/nvim-dap-ui',
-- Basic debugging keymaps, feel free to change to your liking! -- Required dependency for nvim-dap-ui
vim.keymap.set('n', '<F5>', function() require('dap').continue() end, { desc = 'Debug: Start/Continue' }) 'nvim-neotest/nvim-nio',
vim.keymap.set('n', '<F1>', function() require('dap').step_into() end, { desc = 'Debug: Step Into' })
vim.keymap.set('n', '<F2>', function() require('dap').step_over() end, { desc = 'Debug: Step Over' })
vim.keymap.set('n', '<F3>', function() require('dap').step_out() end, { desc = 'Debug: Step Out' })
vim.keymap.set('n', '<leader>b', function() require('dap').toggle_breakpoint() end, { desc = 'Debug: Toggle Breakpoint' })
vim.keymap.set('n', '<leader>B', function() require('dap').set_breakpoint(vim.fn.input 'Breakpoint condition: ') end, { desc = 'Debug: Set Breakpoint' })
-- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
vim.keymap.set('n', '<F7>', function() require('dapui').toggle() end, { desc = 'Debug: See last session result.' })
local dap = require 'dap' -- Installs the debug adapters for you
local dapui = require 'dapui' 'mason-org/mason.nvim',
'jay-babu/mason-nvim-dap.nvim',
require('mason-nvim-dap').setup { -- Add your own debuggers here
'leoluz/nvim-dap-go',
},
keys = {
-- Basic debugging keymaps, feel free to change to your liking!
{ '<F5>', function() require('dap').continue() end, desc = 'Debug: Start/Continue' },
{ '<F1>', function() require('dap').step_into() end, desc = 'Debug: Step Into' },
{ '<F2>', function() require('dap').step_over() end, desc = 'Debug: Step Over' },
{ '<F3>', function() require('dap').step_out() end, desc = 'Debug: Step Out' },
{ '<leader>b', function() require('dap').toggle_breakpoint() end, desc = 'Debug: Toggle Breakpoint' },
{ '<leader>B', function() require('dap').set_breakpoint(vim.fn.input 'Breakpoint condition: ') end, desc = 'Debug: Set Breakpoint' },
-- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
{ '<F7>', function() require('dapui').toggle() end, desc = 'Debug: See last session result.' },
},
config = function()
local dap = require 'dap'
local dapui = require 'dapui'
require('mason-nvim-dap').setup {
-- Makes a best effort to setup the various debuggers with -- Makes a best effort to setup the various debuggers with
-- reasonable debug configurations -- reasonable debug configurations
automatic_installation = true, automatic_installation = true,
@ -43,12 +56,12 @@ require('mason-nvim-dap').setup {
-- Update this to ensure that you have the debuggers for the langs you want -- Update this to ensure that you have the debuggers for the langs you want
'delve', 'delve',
}, },
} }
-- Dap UI setup -- Dap UI setup
-- For more information, see |:help nvim-dap-ui| -- For more information, see |:help nvim-dap-ui|
---@diagnostic disable-next-line: missing-fields ---@diagnostic disable-next-line: missing-fields
dapui.setup { dapui.setup {
-- Set icons to characters that are more likely to work in every terminal. -- Set icons to characters that are more likely to work in every terminal.
-- Feel free to remove or use ones that you like more! :) -- Feel free to remove or use ones that you like more! :)
-- Don't feel like these are good choices. -- Don't feel like these are good choices.
@ -67,29 +80,31 @@ dapui.setup {
disconnect = '', disconnect = '',
}, },
}, },
} }
-- Change breakpoint icons -- Change breakpoint icons
-- vim.api.nvim_set_hl(0, 'DapBreak', { fg = '#e51400' }) -- vim.api.nvim_set_hl(0, 'DapBreak', { fg = '#e51400' })
-- vim.api.nvim_set_hl(0, 'DapStop', { fg = '#ffcc00' }) -- vim.api.nvim_set_hl(0, 'DapStop', { fg = '#ffcc00' })
-- local breakpoint_icons = vim.g.have_nerd_font -- local breakpoint_icons = vim.g.have_nerd_font
-- and { Breakpoint = '', BreakpointCondition = '', BreakpointRejected = '', LogPoint = '', Stopped = '' } -- and { Breakpoint = '', BreakpointCondition = '', BreakpointRejected = '', LogPoint = '', Stopped = '' }
-- or { Breakpoint = '●', BreakpointCondition = '⊜', BreakpointRejected = '⊘', LogPoint = '◆', Stopped = '⭔' } -- or { Breakpoint = '●', BreakpointCondition = '⊜', BreakpointRejected = '⊘', LogPoint = '◆', Stopped = '⭔' }
-- for type, icon in pairs(breakpoint_icons) do -- for type, icon in pairs(breakpoint_icons) do
-- local tp = 'Dap' .. type -- local tp = 'Dap' .. type
-- local hl = (type == 'Stopped') and 'DapStop' or 'DapBreak' -- local hl = (type == 'Stopped') and 'DapStop' or 'DapBreak'
-- vim.fn.sign_define(tp, { text = icon, texthl = hl, numhl = hl }) -- vim.fn.sign_define(tp, { text = icon, texthl = hl, numhl = hl })
-- end -- end
dap.listeners.after.event_initialized['dapui_config'] = dapui.open dap.listeners.after.event_initialized['dapui_config'] = dapui.open
dap.listeners.before.event_terminated['dapui_config'] = dapui.close dap.listeners.before.event_terminated['dapui_config'] = dapui.close
dap.listeners.before.event_exited['dapui_config'] = dapui.close dap.listeners.before.event_exited['dapui_config'] = dapui.close
-- Install golang specific config -- Install golang specific config
require('dap-go').setup { require('dap-go').setup {
delve = { delve = {
-- On Windows delve must be run attached or it crashes. -- On Windows delve must be run attached or it crashes.
-- See https://github.com/leoluz/nvim-dap-go/blob/main/README.md#configuring -- See https://github.com/leoluz/nvim-dap-go/blob/main/README.md#configuring
detached = vim.fn.has 'win32' == 0, detached = vim.fn.has 'win32' == 0,
}, },
}
end,
} }

View File

@ -2,9 +2,14 @@
-- NOTE: gitsigns is already included in init.lua but contains only the base -- NOTE: gitsigns is already included in init.lua but contains only the base
-- config. This will add also the recommended keymaps. -- config. This will add also the recommended keymaps.
vim.pack.add { 'https://github.com/lewis6991/gitsigns.nvim' } ---@module 'lazy'
---@type LazySpec
require('gitsigns').setup { return {
'lewis6991/gitsigns.nvim',
---@module 'gitsigns'
---@type Gitsigns.Config
---@diagnostic disable-next-line: missing-fields
opts = {
on_attach = function(bufnr) on_attach = function(bufnr)
local gitsigns = require 'gitsigns' local gitsigns = require 'gitsigns'
@ -54,4 +59,5 @@ require('gitsigns').setup {
-- Text object -- Text object
map({ 'o', 'x' }, 'ih', gitsigns.select_hunk) map({ 'o', 'x' }, 'ih', gitsigns.select_hunk)
end, end,
},
} }

View File

@ -1,6 +1,13 @@
-- Add indentation guides even on blank lines -- Add indentation guides even on blank lines
-- Enable `lukas-reineke/indent-blankline.nvim` ---@module 'lazy'
-- See `:help ibl` ---@type LazySpec
vim.pack.add { 'https://github.com/lukas-reineke/indent-blankline.nvim' } return {
require('ibl').setup {} 'lukas-reineke/indent-blankline.nvim',
-- Enable `lukas-reineke/indent-blankline.nvim`
-- See `:help ibl`
main = 'ibl',
---@module 'ibl'
---@type ibl.config
opts = {},
}

View File

@ -1,48 +1,52 @@
-- Linting -- Linting
vim.pack.add { 'https://github.com/mfussenegger/nvim-lint' } ---@module 'lazy'
---@type LazySpec
local lint = require 'lint' return {
lint.linters_by_ft = { 'mfussenegger/nvim-lint',
event = { 'BufReadPre', 'BufNewFile' },
config = function()
local lint = require 'lint'
lint.linters_by_ft = {
markdown = { 'markdownlint' }, -- Make sure to install `markdownlint` via mason / npm markdown = { 'markdownlint' }, -- Make sure to install `markdownlint` via mason / npm
} }
-- To allow other plugins to add linters to require('lint').linters_by_ft, -- To allow other plugins to add linters to require('lint').linters_by_ft,
-- instead set linters_by_ft like this: -- instead set linters_by_ft like this:
-- lint.linters_by_ft = lint.linters_by_ft or {} -- lint.linters_by_ft = lint.linters_by_ft or {}
-- lint.linters_by_ft['markdown'] = { 'markdownlint' } -- lint.linters_by_ft['markdown'] = { 'markdownlint' }
-- --
-- However, note that this will enable a set of default linters, -- However, note that this will enable a set of default linters,
-- which will cause errors unless these tools are available: -- which will cause errors unless these tools are available:
-- { -- {
-- clojure = { "clj-kondo" }, -- clojure = { "clj-kondo" },
-- dockerfile = { "hadolint" }, -- dockerfile = { "hadolint" },
-- inko = { "inko" }, -- inko = { "inko" },
-- janet = { "janet" }, -- janet = { "janet" },
-- json = { "jsonlint" }, -- json = { "jsonlint" },
-- markdown = { "vale" }, -- markdown = { "vale" },
-- rst = { "vale" }, -- rst = { "vale" },
-- ruby = { "ruby" }, -- ruby = { "ruby" },
-- terraform = { "tflint" }, -- terraform = { "tflint" },
-- text = { "vale" } -- text = { "vale" }
-- } -- }
-- --
-- You can disable the default linters by setting their filetypes to nil: -- You can disable the default linters by setting their filetypes to nil:
-- lint.linters_by_ft['clojure'] = nil -- lint.linters_by_ft['clojure'] = nil
-- lint.linters_by_ft['dockerfile'] = nil -- lint.linters_by_ft['dockerfile'] = nil
-- lint.linters_by_ft['inko'] = nil -- lint.linters_by_ft['inko'] = nil
-- lint.linters_by_ft['janet'] = nil -- lint.linters_by_ft['janet'] = nil
-- lint.linters_by_ft['json'] = nil -- lint.linters_by_ft['json'] = nil
-- lint.linters_by_ft['markdown'] = nil -- lint.linters_by_ft['markdown'] = nil
-- lint.linters_by_ft['rst'] = nil -- lint.linters_by_ft['rst'] = nil
-- lint.linters_by_ft['ruby'] = nil -- lint.linters_by_ft['ruby'] = nil
-- lint.linters_by_ft['terraform'] = nil -- lint.linters_by_ft['terraform'] = nil
-- lint.linters_by_ft['text'] = nil -- lint.linters_by_ft['text'] = nil
-- Create autocommand which carries out the actual linting -- Create autocommand which carries out the actual linting
-- on the specified events. -- on the specified events.
local lint_augroup = vim.api.nvim_create_augroup('lint', { clear = true }) local lint_augroup = vim.api.nvim_create_augroup('lint', { clear = true })
vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, { vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, {
group = lint_augroup, group = lint_augroup,
callback = function() callback = function()
-- Only run the linter in buffers that you can modify in order to -- Only run the linter in buffers that you can modify in order to
@ -50,4 +54,6 @@ vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, {
-- describe the hovered symbol using Markdown. -- describe the hovered symbol using Markdown.
if vim.bo.modifiable then lint.try_lint() end if vim.bo.modifiable then lint.try_lint() end
end, end,
}) })
end,
}

View File

@ -1,21 +1,23 @@
-- Neo-tree is a Neovim plugin to browse the file system -- Neo-tree is a Neovim plugin to browse the file system
-- https://github.com/nvim-neo-tree/neo-tree.nvim -- https://github.com/nvim-neo-tree/neo-tree.nvim
local plugins = { ---@module 'lazy'
{ src = 'https://github.com/nvim-neo-tree/neo-tree.nvim', version = vim.version.range '*' }, ---@type LazySpec
'https://github.com/nvim-lua/plenary.nvim', return {
'https://github.com/MunifTanjim/nui.nvim', 'nvim-neo-tree/neo-tree.nvim',
} version = '*',
dependencies = {
if vim.g.have_nerd_font then 'nvim-lua/plenary.nvim',
table.insert(plugins, 'https://github.com/nvim-tree/nvim-web-devicons') -- not strictly required, but recommended 'nvim-tree/nvim-web-devicons', -- not strictly required, but recommended
end 'MunifTanjim/nui.nvim',
},
vim.pack.add(plugins) lazy = false,
keys = {
vim.keymap.set('n', '\\', '<Cmd>Neotree reveal<CR>', { desc = 'NeoTree reveal', silent = true }) { '\\', ':Neotree reveal<CR>', desc = 'NeoTree reveal', silent = true },
},
require('neo-tree').setup { ---@module 'neo-tree'
---@type neotree.Config
opts = {
filesystem = { filesystem = {
window = { window = {
mappings = { mappings = {
@ -23,4 +25,5 @@ require('neo-tree').setup {
}, },
}, },
}, },
},
} }