All checks were successful
continuous-integration/drone/push Build is passing
189 lines
7.4 KiB
Markdown
189 lines
7.4 KiB
Markdown
---
|
|
title: "My Neovim Setup"
|
|
date: 2023-01-17
|
|
lastmod: 2024-04-16
|
|
draft: false
|
|
---
|
|
|
|
> This is being published well after the config was finished, I don't care much
|
|
> for blogging, so I never properly finished writing this.
|
|
|
|
So I have, for the last six or so months, been really trying to learn to use
|
|
Neovim. I started with Vim, as I imagine many people do, and had a simple
|
|
single file configuration with a couple of plugins and little else interesting
|
|
going on. This original setup was *stolen* from Luke Smith, who really
|
|
introduced me to Vim and why it's so great. However, it didn't take me long to
|
|
learn about Neovim, and quickly I wanted to switch.
|
|
|
|
I think I got lucky regarding when I learnt about Neovim. It was soon after
|
|
they integrated Lua into it and people were starting to really explore plugins
|
|
for Neovim written in Lua. I quickly came across creators like TJ DeVries,
|
|
chris@machine, and ThePrimeagen. By this point it was too late to turn
|
|
back.
|
|
|
|
## A Short Timeline
|
|
|
|
- Initially I was using plain old vim, a pretty much vanilla experience with
|
|
much holding of j, k, and the rest of the bad habits. This was based on Luke
|
|
Smiths setup. My favourite part of this was his autocommand to clear
|
|
whitespace on write.
|
|
- Following this I moved on to nvim and came across chris@machines config for
|
|
nvim. I don't believe he maintains one anymore due to his work on LunarVim. I
|
|
found his config right as he was making the decision to give up maintaining
|
|
it, which turned out to be a blessing as I had to figure out many issues and
|
|
really learned a lot about Lua, Neovim, and their combination. I also learned a
|
|
lot about the different plugins available for nvim.
|
|
- After getting Chris's setup functional I quickly realised that much of it was
|
|
not exactly to my liking, so I took it upon myself to rewrite it. Although I
|
|
did so from scratch, much of it remained very similar, i.e.: the way he had
|
|
his LSP setup.
|
|
- I spent a while working on this new config, tinkering with bits here and
|
|
there. I used/am using it for most of my personal development and my work at
|
|
University. I was generally very happy with it.
|
|
- About 2 weeks ago, from time of writing, I came across folke's post on
|
|
[r/Neovim](https://www.reddit.com/r/Neovim) about his new plugin manager
|
|
[lazy.nvim](https://github.com/folke/lazy.nvim). I had until that point been
|
|
using [packer.nvim](https://github.com/wbthomason/packer.nvim) and before
|
|
that I was using [vim-plug](https://github.com/junegunn/vim-plug), which I
|
|
honestly still love. This is where this story really starts.
|
|
|
|
# [My Config](https://git.inkletblot.com/inkletblot/config/-/tree/main/.config/nvim)
|
|
|
|
Starting two weeks ago I started a full rewrite of my nvim config based around
|
|
[lazy.nvim](https://github.com/folke/lazy.nvim) and the early commits of [LazyVim](https://github.com/LazyVim/LazyVim) which is the *distribution* of nvim
|
|
folke and others are creating around lazy.
|
|
|
|
> I want to be really honest and clear here, Although I wrote all of my config
|
|
> myself, I leant very heavily on LazyVim. I learn by doing more than I learn
|
|
> by reading. I want to be clear that I am not taking credit for other peoples
|
|
> work. Folke is a wizard of a dev.
|
|
|
|
In this post I'm only going to cover setting up lazy.nvim in the manner than I
|
|
have it configured. I will go further into depth about my config in future
|
|
posts. I will omit things like my utility functions, keymaps, and indepth
|
|
descriptions of my list of plugins.
|
|
|
|
## File Structure
|
|
|
|
In the `~/.config/nvim/` folder I have the following items:
|
|
|
|
```
|
|
lua/
|
|
chris/
|
|
...
|
|
lazyvim/
|
|
config/
|
|
icons.lua
|
|
autocommands.lua
|
|
keymaps.lua
|
|
options.lua
|
|
plugins/
|
|
core.lua
|
|
...
|
|
utils/
|
|
init.lua
|
|
...
|
|
init.lua
|
|
init.lua
|
|
lazy-lock.json
|
|
```
|
|
|
|
The `chris` subdirectory contains my old config which I didn't want to simply
|
|
delete before completing my setup with lazy. I won't be going into detail about
|
|
what it contains here.
|
|
|
|
## `init.lua`
|
|
|
|
Following the design of LazyVim my configuration is in its own module so my
|
|
`init.lua` contains only a single line requiring said module. I used to
|
|
configure each plugin separately and require them all from this file.
|
|
|
|
## `lazy-lock.json`
|
|
|
|
This is a file that is automatically generated by lazy.nvim, it allows you to
|
|
specifically version the plugins you have installed, down to specific commits.
|
|
I don't do this. Some people complain about their configurations breaking all
|
|
the time due to plugin updates however I have had this happen only once so the
|
|
effort required to version everything just isn't worth it for me.
|
|
|
|
## `lua/lazyvim/`
|
|
|
|
This is where the magic happens. It is a self contained module which describes
|
|
and defines my config for Neovim.
|
|
|
|
## `lua/lazyvim/config`
|
|
|
|
The `config` directory contains all of my non-plugin related configuration.
|
|
I treat it like it's its own module with an `init.lua` to pull everything together.
|
|
Icons, keymaps (those not handled within plugin definitions, etc), autocommands,
|
|
and options are all dealt with here.
|
|
|
|
Some great keymaps that I value a lot:
|
|
```
|
|
-- move lines up and down
|
|
map("n", "<C-k>", "<ESC>:m .-2<CR>==", opts)
|
|
map("n", "<C-j>", "<ESC>:m .+1<CR>==", opts)
|
|
|
|
-- center after up and down movements
|
|
map("n", "<C-u>", "<C-u>zz", opts)
|
|
map("n", "<C-d>", "<C-d>zz", opts)
|
|
|
|
-- move through quickfix list
|
|
map("n", "<C-n>", ":cnext<cr>", opts)
|
|
map("n", "<C-p>", ":cprev<cr>", opts)
|
|
```
|
|
Also, these autocommands:
|
|
|
|
```
|
|
-- highlight on yank, thanks stack overflow
|
|
vim.api.nvim_create_autocmd('TextYankPost', {
|
|
group = vim.api.nvim_create_augroup('highlight_yank', {}),
|
|
desc = 'Hightlight selection on yank',
|
|
pattern = '*',
|
|
callback = function()
|
|
vim.highlight.on_yank { higroup = 'IncSearch', timeout = 500 }
|
|
end,
|
|
})
|
|
|
|
-- go to last loc when opening a buffer
|
|
vim.api.nvim_create_autocmd("BufReadPost", {
|
|
callback = function()
|
|
local mark = vim.api.nvim_buf_get_mark(0, '"')
|
|
local lcount = vim.api.nvim_buf_line_count(0)
|
|
if mark[1] > 0 and mark[1] <= lcount then
|
|
pcall(vim.api.nvim_win_set_cursor, 0, mark)
|
|
end
|
|
end,
|
|
})
|
|
```
|
|
|
|
## `lua/lazyvim/utils`
|
|
|
|
The utils folder contains some miscellaneous utilities such as a function to
|
|
get a projects root for Language Server Protocols (LSPs) or a workspace
|
|
switcher function for Neorg (a org mode like plugin for nvim).
|
|
|
|
Many of these utils have been pilfered from other Neovim users, thanks everyone.
|
|
Other peoples configs are always a good place to start learning, especially in
|
|
the context of Neovim. I hope to greatly expand the content of this folder in
|
|
the future.
|
|
|
|
## `lua/lazyvim/init.lua`
|
|
|
|
This is the primary initialisation for my config, following the `lazy.nvim`
|
|
spec, it ensures that `lazy` is installed and then runs the basic initialisation
|
|
for `lazy`, my config, colorscheme, etc.
|
|
|
|
## `lua/lazyvim/plugins`
|
|
|
|
This is where all of the specifications for the plugins I use live. I change
|
|
these a little from time to time, but now everything is set up, I try to limit
|
|
changes in general. I strongly recommend looking through if you're interested,
|
|
[here's a link](https://git.inkletblot.com/inkletblot/config/-/tree/main/.config/nvim/lua/lazyvim/plugins?ref_type=heads)
|
|
|
|
## Notes
|
|
|
|
For now, this is where I'm going to leave it at, I might add more in the future
|
|
though. For the interested individual I think that the best way to learn is to
|
|
read the code, so I suggest looking at my config on gitlab.
|