summaryrefslogtreecommitdiffstats
path: root/nvim
diff options
context:
space:
mode:
authorTJ DeVries <devries.timothyj@gmail.com>2024-02-26 10:03:53 -0500
committerGitHub <noreply@github.com>2024-02-26 10:03:53 -0500
commit4071939be002b015a5846517b16778aabe17f0d6 (patch)
treec6cf6b0cd3ded17b0f53a4b2a7397f45cf6b01d9 /nvim
parent1e144cf840854a731f37c2c4fef2f21f9cca45d6 (diff)
downloaddots-4071939be002b015a5846517b16778aabe17f0d6.tar.gz
rewrite: slimmer, trimmer and more lazy kickstart.nvim (#635)
We've removed over 1/3 of the code that was in kickstart previously, and more than doubled the amount of comments explaining every line of code (to the best of my ability). kickstart now properly uses many of the lazy.nvim config and loading idioms, which should be really helpful for people moving both to modular configs, as well as extending the kickstart config in one file. Additional features: - Beautiful ascii art - Added some documentation that explains what is an LSP, what is telescope, etc - There is now a `:checkhealth` for kickstart, which checks some basic information and adds useful information for maintainers (for people cloning the repo). - Improved LSP configuration and tool installation, for easier first time startup - Changed init.lua ordering, so that it moves from simple options to complicated config ``` ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- Lua 1 108 404 298 ------------------------------------------------------------------------------- ```
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')