summaryrefslogtreecommitdiffstats
path: root/nvim
diff options
context:
space:
mode:
Diffstat (limited to 'nvim')
-rw-r--r--nvim/.gitignore3
-rw-r--r--nvim/README.md176
-rw-r--r--nvim/init.lua1314
-rw-r--r--nvim/lua/kickstart/health.lua51
-rw-r--r--nvim/lua/kickstart/plugins/autoformat.lua74
-rw-r--r--nvim/lua/kickstart/plugins/indent_line.lua9
6 files changed, 844 insertions, 783 deletions
diff --git a/nvim/.gitignore b/nvim/.gitignore
index d699e1d..005b535 100644
--- a/nvim/.gitignore
+++ b/nvim/.gitignore
@@ -2,3 +2,6 @@ tags
test.sh
.luarc.json
nvim
+
+spell/
+lazy-lock.json
diff --git a/nvim/README.md b/nvim/README.md
index 345a288..c9b9d84 100644
--- a/nvim/README.md
+++ b/nvim/README.md
@@ -1,60 +1,73 @@
-# kickstart-modular.nvim
+# kickstart.nvim
-https://github.com/kdheepak/kickstart.nvim/assets/1813121/f3ff9a2b-c31f-44df-a4fa-8a0d7b17cf7b
-
-### Introduction
-
-*This is a fork of [nvim-lua/kickstart.nvim](https://github.com/nvim-lua/kickstart.nvim) that moves from a single file to a multi file configuration.*
+## Introduction
A starting point for Neovim that is:
* Small
-* Documented
-* Modular
+* Single-file
+* Completely Documented
+
+**NOT** a Neovim distribution, but instead a starting point for your configuration.
-This repo is meant to be used by **YOU** to begin your Neovim journey; remove the things you don't use and add what you miss.
+## Installation
-Kickstart.nvim targets *only* the latest ['stable'](https://github.com/neovim/neovim/releases/tag/stable) and latest ['nightly'](https://github.com/neovim/neovim/releases/tag/nightly) of Neovim. If you are experiencing issues, please make sure you have the latest versions.
+### Install Neovim
-Distribution Alternatives:
-- [LazyVim](https://www.lazyvim.org/): A delightful distribution maintained by @folke (the author of lazy.nvim, the package manager used here)
+Kickstart.nvim targets *only* the latest
+['stable'](https://github.com/neovim/neovim/releases/tag/stable) and latest
+['nightly'](https://github.com/neovim/neovim/releases/tag/nightly) of Neovim.
+If you are experiencing issues, please make sure you have the latest versions.
-### Installation
+### Install External Dependencies
> **NOTE**
> [Backup](#FAQ) your previous configuration (if any exists)
-Requirements:
-* Make sure to review the readmes of the plugins if you are experiencing errors. In particular:
- * [ripgrep](https://github.com/BurntSushi/ripgrep#installation) is required for multiple [telescope](https://github.com/nvim-telescope/telescope.nvim#suggested-dependencies) pickers.
-* See [Windows Installation](#Windows-Installation) if you have trouble with `telescope-fzf-native`
+External Requirements:
+- Basic utils: `git`, `make`, `unzip`, C Compiler (`gcc`)
+- [ripgrep](https://github.com/BurntSushi/ripgrep#installation)
+- Language Setup:
+ - If want to write Typescript, you need `npm`
+ - If want to write Golang, you will need `go`
+ - etc.
+
+> **NOTE**
+> See [Windows Installation](#Windows-Installation) to double check any additional Windows notes
Neovim's configurations are located under the following paths, depending on your OS:
| OS | PATH |
| :- | :--- |
-| Linux | `$XDG_CONFIG_HOME/nvim`, `~/.config/nvim` |
-| MacOS | `$XDG_CONFIG_HOME/nvim`, `~/.config/nvim` |
+| Linux, MacOS | `$XDG_CONFIG_HOME/nvim`, `~/.config/nvim` |
| Windows (cmd)| `%userprofile%\AppData\Local\nvim\` |
| Windows (powershell)| `$env:USERPROFILE\AppData\Local\nvim\` |
Clone kickstart.nvim:
-- on Linux and Mac
+<details><summary> Linux and Mac </summary>
+
```sh
-git clone https://github.com/dam9000/kickstart-modular.nvim.git "${XDG_CONFIG_HOME:-$HOME/.config}"/nvim
+git clone https://github.com/nvim-lua/kickstart.nvim.git "${XDG_CONFIG_HOME:-$HOME/.config}"/nvim
```
-- on Windows (cmd)
+</details>
+
+<details><summary> Windows </summary>
+
+If you're using `cmd.exe`:
+
```
-git clone https://github.com/dam9000/kickstart-modular.nvim.git %userprofile%\AppData\Local\nvim\
+git clone https://github.com/nvim-lua/kickstart.nvim.git %userprofile%\AppData\Local\nvim\
```
-- on Windows (powershell)
+If you're using `powershell.exe`
+
```
-git clone https://github.com/dam9000/kickstart-modular.nvim.git $env:USERPROFILE\AppData\Local\nvim\
+git clone https://github.com/nvim-lua/kickstart.nvim.git $env:USERPROFILE\AppData\Local\nvim\
```
+</details>
### Post Installation
@@ -64,37 +77,33 @@ Start Neovim
nvim
```
-The `Lazy` plugin manager will start automatically on the first run and install the configured plugins - as can be seen in the introduction video. After the installation is complete you can press `q` to close the `Lazy` UI and **you are ready to go**! Next time you run nvim `Lazy` will no longer show up.
+That's it! Lazy will install all the plugins you have. Use `:Lazy` to view
+current plugin status.
-If you would prefer to hide this step and run the plugin sync from the command line, you can use:
-
-```sh
-nvim --headless "+Lazy! sync" +qa
-```
+Read through the `init.lua` file in your configuration folder for more
+information about extending and exploring Neovim.
### Getting Started
-See [Effective Neovim: Instant IDE](https://youtu.be/stqUbv-5u2s), covering the previous version. Note: The install via init.lua is outdated, please follow the install instructions in this file instead. An updated video is coming soon.
+See [Effective Neovim: Instant IDE](https://youtu.be/stqUbv-5u2s), covering the
+previous version. Note: The install via init.lua is outdated, please follow the
+install instructions in this file instead. An updated video is coming soon.
### Recommended Steps
-[Fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) this repo (so that you have your own copy that you can modify) and then installing you can install to your machine using the methods above.
+[Fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) this repo
+(so that you have your own copy that you can modify) and then installing you
+can install to your machine using the methods above.
> **NOTE**
-> Your fork's url will be something like this: `https://github.com/<your_github_username>/kickstart-modular.nvim.git`
-
-### Configuration And Extension
+> Your fork's url will be something like this: `https://github.com/<your_github_username>/kickstart.nvim.git`
-* Inside of your copy, feel free to modify any file you like! It's your copy!
-* Feel free to change any of the default options in `init.lua` to better suit your needs.
-* For adding plugins, there are 3 primary options:
- * Add new configuration in `lua/custom/plugins/*` files, which will be auto sourced using `lazy.nvim` (uncomment the line importing the `custom/plugins` directory in the `lua/lazy-plugins.lua` file to enable this)
- * Modify `init.lua` with additional plugins.
- * Include the `lua/kickstart/plugins/*` files in your configuration.
+#### Examples of adding popularly requested plugins
-You can also merge updates/changes from the repo back into your fork, to keep up-to-date with any changes for the default configuration.
+<details>
+ <summary>Adding autopairs</summary>
-#### Example: Adding an autopairs plugin
+This will automatically install [windwp/nvim-autopairs](https://github.com/windwp/nvim-autopairs) and enable it on startup. For more information, see documentation for [lazy.nvim](https://github.com/folke/lazy.nvim).
In the file: `lua/custom/plugins/autopairs.lua`, add:
@@ -118,10 +127,11 @@ return {
}
```
+</details>
+<details>
+ <summary>Adding a file tree plugin</summary>
-This will automatically install [windwp/nvim-autopairs](https://github.com/windwp/nvim-autopairs) and enable it on startup. For more information, see documentation for [lazy.nvim](https://github.com/folke/lazy.nvim).
-
-#### Example: Adding a file tree plugin
+This will install the tree plugin and add the command `:Neotree` for you. You can explore the documentation at [neo-tree.nvim](https://github.com/nvim-neo-tree/neo-tree.nvim) for more information.
In the file: `lua/custom/plugins/filetree.lua`, add:
@@ -143,23 +153,13 @@ return {
}
```
-This will install the tree plugin and add the command `:Neotree` for you. You can explore the documentation at [neo-tree.nvim](https://github.com/nvim-neo-tree/neo-tree.nvim) for more information.
-
-### Contribution
-
-Pull-requests are welcome. The goal of this repo is not to create a Neovim configuration framework, but to offer a starting template that shows, by example, available features in Neovim. Some things that will not be included:
-
-* Custom language server configuration (null-ls templates)
-* Theming beyond a default colorscheme necessary for LSP highlight groups
-
-Each PR, especially those which increase the line count, should have a description as to why the PR is necessary.
+</details>
### FAQ
* What should I do if I already have a pre-existing neovim configuration?
* You should back it up, then delete all files associated with it.
* This includes your existing init.lua and the neovim files in `~/.local` which can be deleted with `rm -rf ~/.local/share/nvim/`
- * You may also want to look at the [migration guide for lazy.nvim](https://github.com/folke/lazy.nvim#-migration-guide)
* Can I keep my existing configuration in parallel to kickstart?
* Yes! You can use [NVIM_APPNAME](https://neovim.io/doc/user/starting.html#%24NVIM_APPNAME)`=nvim-NAME` to maintain multiple configurations. For example you can install the kickstart configuration in `~/.config/nvim-kickstart` and create an alias:
```
@@ -172,10 +172,9 @@ Each PR, especially those which increase the line count, should have a descripti
* The main purpose of kickstart is to serve as a teaching tool and a reference
configuration that someone can easily `git clone` as a basis for their own.
As you progress in learning Neovim and Lua, you might consider splitting `init.lua`
- into smaller parts. *This is the fork of the original project that splits the configuration into smaller parts.*
- The original repo that maintains the exact
- same functionality in a single `init.lua` file is available here:
- * [kickstart.nvim](https://github.com/dam9000/kickstart-modular.nvim)
+ into smaller parts. A fork of kickstart that does this while maintaining the exact
+ same functionality is available here:
+ * [kickstart-modular.nvim](https://github.com/dam9000/kickstart-modular.nvim)
* Discussions on this topic can be found here:
* [Restructure the configuration](https://github.com/nvim-lua/kickstart.nvim/issues/218)
* [Reorganize init.lua into a multi-file setup](https://github.com/nvim-lua/kickstart.nvim/pull/473)
@@ -193,56 +192,3 @@ This requires:
```lua
{'nvim-telescope/telescope-fzf-native.nvim', build = 'cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build' }
```
-
-### Hints And Tips For New Neovimmers
-
-Neovim is a very rich and powerful environment, but it can also feel a bit
-intimidating for new users trying to find their way around, especially if
-they're coming from other environments like Visual Studio Code or a traditional
-IDE.
-
-There's no way this README can provide you with everything you need to know, but
-here are a few tips so you can learn how to learn.
-
-### Use The Help, Luke!
-
-Neovim's help system is incredibly thorough and extensive. You should really
-take a moment to get comfortable navigating through help topics, going back and
-forth, navigating the menus, etc. This won't just help you read the help, it
-will empower you in the rest of your Neovim journey.
-
-You can double click on a topic to drill down, and hit Ctrl-o (Hold down the
-Control key and the 'o' key) to go back.
-
-Read the first page you get when you run :help carefully. it will serve you
-well.
-
-You can also get help on a particular thing by typing ":help <topic>".
-
-Like, let's say we want to learn more about folding, just type ":help folding".
-
-### To The Telescope!
-
-One of the more powerful features you get by installing this project is the
-brilliant Telescope plugin co-written by @tjdevries.
-
-Take a minute to browse through ":help telescope" and get a sense for all the
-amazing superpowers you've gained.
-
-In particular, there are two Telescope features that are incredible for helping
-you understand how to do a particular thing or how to configure a particular
-feature.
-
-If you're not sure what to look for, try ":Telescope help_tags". Let's say we
-want to configure Neovim to automatically word wrap. We might type ":Telescope
-help_tags" and then type w, r, a, p. Notice how the list of results changes with
-each new letter you type? When you're done you've got a screen full of topics
-involving word wrap.
-
-Another common question is "What keys do I hit to make a thing happen?". To get
-an answer, one way is to use ":Telescope keymaps". You'll get the same list of
-results that changes to adapt with each new key you press.
-
-With these hints in mind you should be in good shape to get learning. Remember,
-you are on a journey of discovery here, adapting your programming environment to
-your needs. It will take effort, but the rewards are worth it! :)
diff --git a/nvim/init.lua b/nvim/init.lua
index fd4567d..0d19b08 100644
--- a/nvim/init.lua
+++ b/nvim/init.lua
@@ -3,101 +3,627 @@
=====================================================================
==================== READ THIS BEFORE CONTINUING ====================
=====================================================================
+======== .-----. ========
+======== .----------------------. | === | ========
+======== |.-""""""""""""""""""-.| |-----| ========
+======== || || | === | ========
+======== || KICKSTART.NVIM || |-----| ========
+======== || || | === | ========
+======== || || |-----| ========
+======== ||:Tutor || |:::::| ========
+======== |'-..................-'| |____o| ========
+======== `"")----------------(""` ___________ ========
+======== /::::::::::| |::::::::::\ \ no mouse \ ========
+======== /:::========| |==hjkl==:::\ \ required \ ========
+======== '""""""""""""' '""""""""""""' '""""""""""' ========
+======== ========
+=====================================================================
+=====================================================================
-Kickstart.nvim is *not* a distribution.
-
-Kickstart.nvim is a template for your own configuration.
- The goal is that you can read every line of code, top-to-bottom, understand
- what your configuration is doing, and modify it to suit your needs.
+What is Kickstart?
- Once you've done that, you should start exploring, configuring and tinkering to
- explore Neovim!
+ Kickstart.nvim is *not* a distribution.
- If you don't know anything about Lua, I recommend taking some time to read through
- a guide. One possible example:
- - https://learnxinyminutes.com/docs/lua/
+ Kickstart.nvim is a starting point for your own configuration.
+ The goal is that you can read every line of code, top-to-bottom, understand
+ what your configuration is doing, and modify it to suit your needs.
+ Once you've done that, you can start exploring, configuring and tinkering to
+ make Neovim your own! That might mean leaving kickstart just the way it is for a while
+ or immediately breaking it into modular pieces. It's up to you!
- And then you can explore or search through `:help lua-guide`
- - https://neovim.io/doc/user/lua-guide.html
+ If you don't know anything about Lua, I recommend taking some time to read through
+ a guide. One possible example which will only take 10-15 minutes:
+ - https://learnxinyminutes.com/docs/lua/
+ After understanding a bit more about Lua, you can use `:help lua-guide` as a
+ reference for how Neovim integrates Lua.
+ - :help lua-guide
+ - (or HTML version): https://neovim.io/doc/user/lua-guide.html
Kickstart Guide:
-I have left several `:help X` comments throughout the init.lua
-You should run that command and read that help section for more information.
+ TODO: The very first thing you should do is to run the command `:Tutor` in Neovim.
+
+ If you don't know what this means, type the following:
+ - <escape key>
+ - :
+ - Tutor
+ - <enter key>
+
+ (If you already know how the Neovim basics, you can skip this step)
+
+ Once you've completed that, you can continue working through **AND READING** the rest
+ of the kickstart init.lua
+
+ Next, run AND READ `:help`.
+ This will open up a help window with some basic information
+ about reading, navigating and searching the builtin help documentation.
+
+ This should be the first place you go to look when you're stuck or confused
+ with something. It's one of my favorite neovim features.
-In addition, I have some `NOTE:` items throughout the file.
-These are for you, the reader to help understand what is happening. Feel free to delete
-them once you know what you're doing, but they should serve as a guide for when you
-are first encountering a few different constructs in your nvim config.
+ MOST IMPORTANTLY, we provide a keymap "<space>sh" to [s]earch the [h]elp documentation,
+ which is very useful when you're not sure exactly what you're looking for.
+
+ I have left several `:help X` comments throughout the init.lua
+ These are hints about where to find more information about the relevant settings,
+ plugins or neovim features used in kickstart.
+
+ NOTE: Look for lines like this
+
+ Throughout the file. These are for you, the reader, to help understand what is happening.
+ Feel free to delete them once you know what you're doing, but they should serve as a guide
+ for when you are first encountering a few different constructs in your nvim config.
+
+If you experience any errors while trying to install kickstart, run `:checkhealth` for more info
I hope you enjoy your Neovim journey,
- TJ
-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
-- See `:help mapleader`
--- NOTE: Must happen before plugins are required (otherwise wrong leader will be used)
+-- NOTE: Must happen before plugins are loaded (otherwise wrong leader will be used)
vim.g.mapleader = ' '
vim.g.maplocalleader = ' '
+-- [[ Setting options ]]
+-- See `:help vim.opt`
+-- NOTE: You can change these options as you wish!
+-- For more options, you can see `:help option-list`
+
+-- Make line numbers default
+vim.opt.number = true
+-- You can also add relative line numbers, for 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
+vim.opt.showmode = false
+
+-- Sync clipboard between OS and Neovim.
+-- Remove this option if you want your OS clipboard to remain independent.
+-- See `:help 'clipboard'`
+vim.opt.clipboard = 'unnamedplus'
+
+-- Enable break indent
+vim.opt.breakindent = true
+
+-- Save undo history
+vim.opt.undofile = true
+
+-- Case-insensitive searching UNLESS \C or capital in search
+vim.opt.ignorecase = true
+vim.opt.smartcase = true
+
+-- Keep signcolumn on by default
+vim.opt.signcolumn = 'yes'
+
+-- Decrease update time
+vim.opt.updatetime = 250
+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'
+vim.opt.list = true
+vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '␣' }
+
+-- Preview substitutions live, as you type!
+vim.opt.inccommand = 'split'
+
+-- Show which line your cursor is on
+vim.opt.cursorline = true
+
+-- Minimal number of screen lines to keep above and below the cursor.
+vim.opt.scrolloff = 10
+
+-- [[ Basic Keymaps ]]
+-- See `:help vim.keymap.set()`
+
+-- Set highlight on search, but clear on pressing <Esc> in normal mode
+vim.opt.hlsearch = true
+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
+-- for people to discover. Otherwise, you normally need to press <C-\><C-n>, which
+-- is not what someone will guess without a bit more experience.
+--
+-- NOTE: This won't work in all terminal emulators/tmux/etc. Try your own mapping
+-- or just use <C-\><C-n> to exit terminal mode
+vim.keymap.set('t', '<Esc><Esc>', '<C-\\><C-n>', { desc = 'Exit terminal mode' })
+
+-- TIP: Disable arrow keys in normal mode
+-- vim.keymap.set('n', '<left>', '<cmd>echo "Use h to move!!"<CR>')
+-- vim.keymap.set('n', '<right>', '<cmd>echo "Use l to move!!"<CR>')
+-- vim.keymap.set('n', '<up>', '<cmd>echo "Use k to move!!"<CR>')
+-- vim.keymap.set('n', '<down>', '<cmd>echo "Use j to move!!"<CR>')
+
+-- Keybinds to make split navigation easier.
+-- Use CTRL+<hjkl> to switch between windows
+--
+-- See `:help wincmd` for a list of all window commands
+vim.keymap.set('n', '<C-h>', '<C-w><C-h>', { desc = 'Move focus to the left window' })
+vim.keymap.set('n', '<C-l>', '<C-w><C-l>', { desc = 'Move focus to the right window' })
+vim.keymap.set('n', '<C-j>', '<C-w><C-j>', { desc = 'Move focus to the lower window' })
+vim.keymap.set('n', '<C-k>', '<C-w><C-k>', { desc = 'Move focus to the upper window' })
+
+-- Highlight when yanking (copying) text
+-- Try it with `yap` in normal mode
+-- See `:help vim.highlight.on_yank()`
+vim.api.nvim_create_autocmd('TextYankPost', {
+ group = vim.api.nvim_create_augroup('kickstart-highlight-yank', { clear = true }),
+ callback = function()
+ vim.highlight.on_yank()
+ end,
+})
+
-- [[ Install `lazy.nvim` plugin manager ]]
--- https://github.com/folke/lazy.nvim
--- `:help lazy.nvim.txt` for more info
+-- 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
- vim.fn.system {
- 'git',
- 'clone',
- '--filter=blob:none',
- 'https://github.com/folke/lazy.nvim.git',
- '--branch=stable', -- latest stable release
- lazypath,
- }
-end
+ local lazyrepo = 'https://github.com/folke/lazy.nvim.git'
+ vim.fn.system { 'git', 'clone', '--filter=blob:none', '--branch=stable', lazyrepo, lazypath }
+end ---@diagnostic disable-next-line: undefined-field
vim.opt.rtp:prepend(lazypath)
--- [[ Configure plugins ]]
--- NOTE: Here is where you install your plugins.
--- You can configure plugins using the `config` key.
+-- [[ Configure and install plugins ]]
+--
+-- To check the current status of your plugins, run
+-- :Lazy
--
--- You can also configure plugins after the setup call,
--- as they will be available in your neovim runtime.
+-- You can press `?` in this menu for help. Use `:q` to close the window
+--
+-- To update plugins, you can run
+-- :Lazy update
+--
+-- NOTE: Here is where you install your plugins.
require('lazy').setup({
- -- NOTE: First, some plugins that don't require any configuration
- -- Git related plugins
- '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
- -- Detect tabstop and shiftwidth automatically
- 'tpope/vim-sleuth',
+ -- 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({})
- -- NOTE: This is where your plugins related to LSP can be installed.
- -- The configuration is done below. Search for lspconfig to find it below.
- {
- -- LSP Configuration & Plugins
+ -- "gc" to comment visual regions/lines
+ { 'numToStr/Comment.nvim', opts = {} },
+
+ -- 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 = {
+ add = { text = '+' },
+ change = { text = '~' },
+ delete = { text = '_' },
+ topdelete = { text = '‾' },
+ changedelete = { text = '~' },
+ },
+ },
+ },
+
+ -- NOTE: Plugins can also be configured to run lua code when they are loaded.
+ --
+ -- This is often very useful to both group configuration, as well as handle
+ -- lazy loading plugins that don't need to be loaded immediately at startup.
+ --
+ -- For example, in the following configuration, we use:
+ -- event = 'VeryLazy'
+ --
+ -- which loads which-key after all the UI elements are loaded. Events can be
+ -- normal autocommands events (:help autocomd-events).
+ --
+ -- Then, because we use the `config` key, the configuration only runs
+ -- after the plugin has been loaded:
+ -- config = function() ... end
+
+ { -- 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()
+
+ -- 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,
+ },
+
+ -- NOTE: Plugins can specify dependencies.
+ --
+ -- The dependencies are proper plugin specifications as well - anything
+ -- you do for a plugin at the top level, you can do for a dependency.
+ --
+ -- Use the `dependencies` key to specify the dependencies of a particular plugin
+
+ { -- Fuzzy Finder (files, lsp, etc)
+ 'nvim-telescope/telescope.nvim',
+ event = 'VeryLazy',
+ branch = '0.1.x',
+ dependencies = {
+ 'nvim-lua/plenary.nvim',
+ { -- If encountering errors, see telescope-fzf-native README for install 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 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' }
+ },
+ 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 telescope, is to start by doing something like:
+ -- :Telescope help_tags
+ --
+ -- After running this command, a window will open up and you're able to
+ -- type in the prompt window. You'll see a list of help_tags options and
+ -- a corresponding preview of the help.
+ --
+ -- Two important keymaps to use while in telescope are:
+ -- - Insert mode: <c-/>
+ -- - Normal mode: ?
+ --
+ -- This opens a window that shows you all of the keymaps for the current
+ -- telescope picker. This is really useful to discover what Telescope can
+ -- do as well as how to actually do it!
+
+ -- [[ Configure Telescope ]]
+ -- See `:help telescope` and `:help telescope.setup()`
+ require('telescope').setup {
+ -- You can put your default mappings / updates / etc. in here
+ -- All the info you're looking for is in `:help telescope.setup()`
+ --
+ -- defaults = {
+ -- mappings = {
+ -- i = { ['<c-enter>'] = 'to_fuzzy_refine' },
+ -- },
+ -- },
+ -- pickers = {}
+ extensions = {
+ ['ui-select'] = {
+ require('telescope.themes').get_dropdown(),
+ },
+ },
+ }
+
+ -- Enable telescope extensions, if they are installed
+ pcall(require('telescope').load_extension, 'fzf')
+ pcall(require('telescope').load_extension, 'ui-select')
+
+ -- See `:help telescope.builtin`
+ local builtin = require 'telescope.builtin'
+ vim.keymap.set('n', '<leader>sh', builtin.help_tags, { desc = '[S]earch [H]elp' })
+ vim.keymap.set('n', '<leader>sk', builtin.keymaps, { desc = '[S]earch [K]eymaps' })
+ vim.keymap.set('n', '<leader>sf', builtin.find_files, { desc = '[S]earch [F]iles' })
+ vim.keymap.set('n', '<leader>ss', builtin.builtin, { desc = '[S]earch [S]elect Telescope' })
+ vim.keymap.set('n', '<leader>sw', builtin.grep_string, { desc = '[S]earch current [W]ord' })
+ vim.keymap.set('n', '<leader>sg', builtin.live_grep, { desc = '[S]earch by [G]rep' })
+ vim.keymap.set('n', '<leader>sd', builtin.diagnostics, { desc = '[S]earch [D]iagnostics' })
+ vim.keymap.set('n', '<leader>sr', builtin.resume, { desc = '[S]earch [R]esume' })
+ vim.keymap.set('n', '<leader>s.', builtin.oldfiles, { desc = '[S]earch Recent Files ("." for repeat)' })
+ vim.keymap.set('n', '<leader><leader>', builtin.buffers, { desc = '[ ] Find existing buffers' })
+
+ -- Slightly advanced example of overriding default behavior and theme
+ vim.keymap.set('n', '<leader>/', function()
+ -- You can pass additional configuration to telescope to change theme, layout, etc.
+ builtin.current_buffer_fuzzy_find(require('telescope.themes').get_dropdown {
+ winblend = 10,
+ previewer = false,
+ })
+ end, { desc = '[/] Fuzzily search in current buffer' })
+
+ -- Also 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 {
+ grep_open_files = true,
+ prompt_title = 'Live Grep in Open Files',
+ }
+ end, { desc = '[S]earch [/] in Open 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' })
+ end,
+ },
+
+ { -- LSP Configuration & Plugins
'neovim/nvim-lspconfig',
dependencies = {
- -- Automatically install LSPs to stdpath for neovim
- { 'williamboman/mason.nvim', config = true },
+ -- Automatically install LSPs and related tools to stdpath for neovim
+ 'williamboman/mason.nvim',
'williamboman/mason-lspconfig.nvim',
+ 'WhoIsSethDaniel/mason-tool-installer.nvim',
- -- Useful status updates for LSP
+ -- Useful status updates for LSP.
-- NOTE: `opts = {}` is the same as calling `require('fidget').setup({})`
{ 'j-hui/fidget.nvim', opts = {} },
+ },
+ config = function()
+ -- Brief Aside: **What is LSP?**
+ --
+ -- LSP is an acronym 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
+ -- (sometimes called LSP servers, but that's kind of like ATM Machine) are standalone
+ -- processes that communicate with some "client" - in this case, Neovim!
+ --
+ -- LSP provides Neovim with features like:
+ -- - Go to definition
+ -- - Find references
+ -- - Autocompletion
+ -- - Symbol Search
+ -- - and more!
+ --
+ -- Thus, Language Servers are external tools that must be installed separately from
+ -- Neovim. This is where `mason` and related plugins come into play.
+ --
+ -- If you're wondering about lsp vs treesitter, you can check out the wonderfully
+ -- and elegantly composed help section, :help lsp-vs-treesitter
+
+ -- This function gets run when an LSP attaches to a particular buffer.
+ -- That is to say, every time a new file is opened that is associated with
+ -- an lsp (for example, opening `main.rs` is associated with `rust_analyzer`) this
+ -- function will be executed to configure the current buffer
+ 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.
+ --
+ -- 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 })
+ end
+
+ -- Jump to the definition of the word under your cursor.
+ -- This is where a variable was first declared, or where a function is defined, etc.
+ -- To jump back, press <C-T>.
+ map('gd', require('telescope.builtin').lsp_definitions, '[G]oto [D]efinition')
+
+ -- Find references for the word under your cursor.
+ map('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences')
+
+ -- Jump to the implementation of the word under your cursor.
+ -- Useful when your language has ways of declaring types without an actual implementation.
+ map('gI', require('telescope.builtin').lsp_implementations, '[G]oto [I]mplementation')
+
+ -- Jump to the type of the word under your cursor.
+ -- Useful when you're not sure what type a variable is and you want to see
+ -- the definition of its *type*, not where it was *defined*.
+ map('<leader>D', require('telescope.builtin').lsp_type_definitions, 'Type [D]efinition')
+
+ -- Fuzzy find all the symbols in your current document.
+ -- Symbols are things like variables, functions, types, etc.
+ map('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols')
+
+ -- Fuzzy find all the symbols in your current workspace
+ -- Similar to document symbols, except searches over your whole project.
+ map('<leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols')
+
+ -- Rename the variable under your cursor
+ -- Most Language Servers support renaming across files, etc.
+ map('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame')
+
+ -- 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')
+
+ -- WARN: This is not Goto Definition, this is Goto Declaration.
+ -- For example, in C this would take you to the header
+ map('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
+
+ -- The following two autocommands are used to highlight references of the
+ -- word under your cursor when your cursor rests there for a little while.
+ -- See `:help CursorHold` for information about when this is executed
+ --
+ -- 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
+ vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, {
+ buffer = event.buf,
+ callback = vim.lsp.buf.document_highlight,
+ })
+
+ vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, {
+ buffer = event.buf,
+ callback = vim.lsp.buf.clear_references,
+ })
+ 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.
+ -- When you add nvim-cmp, luasnip, etc. Neovim now has *more* capabilities.
+ -- So, we create new capabilities with nvim cmp, and then broadcast that to the servers.
+ local capabilities = vim.lsp.protocol.make_client_capabilities()
+ capabilities = vim.tbl_deep_extend('force', capabilities, require('cmp_nvim_lsp').default_capabilities())