[{"data":1,"prerenderedAt":857},["ShallowReactive",2],{"content-query-tFaqTysNVu":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":8,"publishedAt":9,"toc":10,"body":11,"_type":851,"_id":852,"_source":853,"_file":854,"_stem":855,"_extension":856},"/blog/2026/05/my_new_neovim_config","05",false,"","My New Minimal Neovim Configuration (Part 2)","2026-05-28 15:00:00",true,{"type":12,"children":13,"toc":838},"root",[14,22,32,46,51,56,63,68,73,78,140,146,151,186,191,204,243,248,262,267,274,280,285,290,295,354,359,367,373,378,383,441,446,452,457,462,498,503,509,514,542,556,575,598,603,616,622,627,632,646,651,698,703,709,721,726,731,737,742,785,790,795,801,806,811,816,822,832],{"type":15,"tag":16,"props":17,"children":19},"element","h1",{"id":18},"my-new-minimal-neovim-configuration-part-2",[20],{"type":21,"value":8},"text",{"type":15,"tag":23,"props":24,"children":25},"p",{},[26],{"type":15,"tag":27,"props":28,"children":31},"img",{"alt":29,"src":30},"dashboard","/images/nvim_dashboard.png",[],{"type":15,"tag":23,"props":33,"children":34},{},[35,37,44],{"type":21,"value":36},"A while ago I wrote about my minimal Neovim configuration. At that time, the idea was to keep the editor small by using only a few plugins and relying heavily on ",{"type":15,"tag":38,"props":39,"children":41},"code",{"className":40},[],[42],{"type":21,"value":43},"mini.nvim",{"type":21,"value":45},".",{"type":15,"tag":23,"props":47,"children":48},{},[49],{"type":21,"value":50},"My setup changed again, and now it is even simpler.",{"type":15,"tag":23,"props":52,"children":53},{},[54],{"type":21,"value":55},"This version is basically Neovim itself, a tiny amount of Lua, and only the plugins I really want to keep around every day.",{"type":15,"tag":57,"props":58,"children":60},"h2",{"id":59},"the-main-idea",[61],{"type":21,"value":62},"The Main Idea",{"type":15,"tag":23,"props":64,"children":65},{},[66],{"type":21,"value":67},"The goal of this configuration is simple: use as much built-in Neovim as possible.",{"type":15,"tag":23,"props":69,"children":70},{},[71],{"type":21,"value":72},"Neovim has improved a lot. Today I can get a very good editor experience without adding many dependencies, and without splitting the configuration into too many moving parts.",{"type":15,"tag":23,"props":74,"children":75},{},[76],{"type":21,"value":77},"So the new config focuses on:",{"type":15,"tag":79,"props":80,"children":81},"ol",{},[82,110,120,130],{"type":15,"tag":83,"props":84,"children":85},"li",{},[86,92,94,100,102,108],{"type":15,"tag":87,"props":88,"children":89},"strong",{},[90],{"type":21,"value":91},"Built-in features first",{"type":21,"value":93},": LSP, completion, snippets, terminal, quickfix, ",{"type":15,"tag":38,"props":95,"children":97},{"className":96},[],[98],{"type":21,"value":99},":find",{"type":21,"value":101},", ",{"type":15,"tag":38,"props":103,"children":105},{"className":104},[],[106],{"type":21,"value":107},":grep",{"type":21,"value":109},", and netrw do most of the work.",{"type":15,"tag":83,"props":111,"children":112},{},[113,118],{"type":15,"tag":87,"props":114,"children":115},{},[116],{"type":21,"value":117},"Very few plugins",{"type":21,"value":119},": only add a plugin when it gives me something Neovim itself does not already cover well.",{"type":15,"tag":83,"props":121,"children":122},{},[123,128],{"type":15,"tag":87,"props":124,"children":125},{},[126],{"type":21,"value":127},"Small Lua files",{"type":21,"value":129},": options, keymaps, autocommands, LSP setup, and plugin setup stay easy to read.",{"type":15,"tag":83,"props":131,"children":132},{},[133,138],{"type":15,"tag":87,"props":134,"children":135},{},[136],{"type":21,"value":137},"Personal workflow",{"type":21,"value":139},": the config is made for how I code, not for every possible use case.",{"type":15,"tag":57,"props":141,"children":143},{"id":142},"plugins",[144],{"type":21,"value":145},"Plugins",{"type":15,"tag":23,"props":147,"children":148},{},[149],{"type":21,"value":150},"The active setup is very small:",{"type":15,"tag":79,"props":152,"children":153},{},[154,171],{"type":15,"tag":83,"props":155,"children":156},{},[157,169],{"type":15,"tag":87,"props":158,"children":159},{},[160],{"type":15,"tag":161,"props":162,"children":166},"a",{"href":163,"rel":164},"https://github.com/nvim-treesitter/nvim-treesitter",[165],"nofollow",[167],{"type":21,"value":168},"nvim-treesitter",{"type":21,"value":170},": better syntax highlighting and indentation for the languages I use.",{"type":15,"tag":83,"props":172,"children":173},{},[174,184],{"type":15,"tag":87,"props":175,"children":176},{},[177],{"type":15,"tag":161,"props":178,"children":181},{"href":179,"rel":180},"https://github.com/tpope/vim-fugitive",[165],[182],{"type":21,"value":183},"vim-fugitive",{"type":21,"value":185},": Git integration that is still hard to replace.",{"type":15,"tag":23,"props":187,"children":188},{},[189],{"type":21,"value":190},"That is it for the core plugin list.",{"type":15,"tag":23,"props":192,"children":193},{},[194,196,202],{"type":21,"value":195},"There is no external plugin manager in this setup. I use Neovim's built-in ",{"type":15,"tag":38,"props":197,"children":199},{"className":198},[],[200],{"type":21,"value":201},"vim.pack",{"type":21,"value":203}," to add the plugins directly from Lua.",{"type":15,"tag":205,"props":206,"children":210},"pre",{"className":207,"code":208,"language":209,"meta":7,"style":7},"language-lua shiki shiki-themes poimandres","vim.pack.add({\n  { src = 'https://github.com/nvim-treesitter/nvim-treesitter' },\n})\n","lua",[211],{"type":15,"tag":38,"props":212,"children":213},{"__ignoreMap":7},[214,225,234],{"type":15,"tag":215,"props":216,"children":219},"span",{"class":217,"line":218},"line",1,[220],{"type":15,"tag":215,"props":221,"children":222},{},[223],{"type":21,"value":224},"vim.pack.add({\n",{"type":15,"tag":215,"props":226,"children":228},{"class":217,"line":227},2,[229],{"type":15,"tag":215,"props":230,"children":231},{},[232],{"type":21,"value":233},"  { src = 'https://github.com/nvim-treesitter/nvim-treesitter' },\n",{"type":15,"tag":215,"props":235,"children":237},{"class":217,"line":236},3,[238],{"type":15,"tag":215,"props":239,"children":240},{},[241],{"type":21,"value":242},"})\n",{"type":15,"tag":23,"props":244,"children":245},{},[246],{"type":21,"value":247},"And for Git:",{"type":15,"tag":205,"props":249,"children":251},{"className":207,"code":250,"language":209,"meta":7,"style":7},"vim.pack.add({ 'https://github.com/tpope/vim-fugitive' })\n",[252],{"type":15,"tag":38,"props":253,"children":254},{"__ignoreMap":7},[255],{"type":15,"tag":215,"props":256,"children":257},{"class":217,"line":218},[258],{"type":15,"tag":215,"props":259,"children":260},{},[261],{"type":21,"value":250},{"type":15,"tag":23,"props":263,"children":264},{},[265],{"type":21,"value":266},"This keeps the configuration very direct. Open the file, see the plugin, understand what it does.",{"type":15,"tag":23,"props":268,"children":269},{},[270],{"type":15,"tag":27,"props":271,"children":273},{"alt":142,"src":272},"/images/nvim_plugins.png",[],{"type":15,"tag":57,"props":275,"children":277},{"id":276},"built-in-lsp",[278],{"type":21,"value":279},"Built-in LSP",{"type":15,"tag":23,"props":281,"children":282},{},[283],{"type":21,"value":284},"The LSP setup is based on Neovim's built-in LSP client.",{"type":15,"tag":23,"props":286,"children":287},{},[288],{"type":21,"value":289},"I enable the servers I use for my daily work, including Lua, TypeScript, Vue, CSS, PHP, Laravel, Go, Zig, Odin, Elixir, Emmet, and Copilot.",{"type":15,"tag":23,"props":291,"children":292},{},[293],{"type":21,"value":294},"The mappings are simple:",{"type":15,"tag":296,"props":297,"children":298},"ul",{},[299,310,321,332,343],{"type":15,"tag":83,"props":300,"children":301},{},[302,308],{"type":15,"tag":38,"props":303,"children":305},{"className":304},[],[306],{"type":21,"value":307},"gd",{"type":21,"value":309}," goes to definition",{"type":15,"tag":83,"props":311,"children":312},{},[313,319],{"type":15,"tag":38,"props":314,"children":316},{"className":315},[],[317],{"type":21,"value":318},"gD",{"type":21,"value":320}," goes to declaration",{"type":15,"tag":83,"props":322,"children":323},{},[324,330],{"type":15,"tag":38,"props":325,"children":327},{"className":326},[],[328],{"type":21,"value":329},"K",{"type":21,"value":331}," shows hover information",{"type":15,"tag":83,"props":333,"children":334},{},[335,341],{"type":15,"tag":38,"props":336,"children":338},{"className":337},[],[339],{"type":21,"value":340},"\u003Cleader>rn",{"type":21,"value":342}," renames a symbol",{"type":15,"tag":83,"props":344,"children":345},{},[346,352],{"type":15,"tag":38,"props":347,"children":349},{"className":348},[],[350],{"type":21,"value":351},"\u003Cleader>fm",{"type":21,"value":353}," formats the current buffer",{"type":15,"tag":23,"props":355,"children":356},{},[357],{"type":21,"value":358},"I also use inline completion when the server supports it, with small insert-mode mappings to accept or cycle suggestions.",{"type":15,"tag":23,"props":360,"children":361},{},[362],{"type":15,"tag":27,"props":363,"children":366},{"alt":364,"src":365},"lsp","/images/nvim_lsp.png",[],{"type":15,"tag":57,"props":368,"children":370},{"id":369},"treesitter",[371],{"type":21,"value":372},"Treesitter",{"type":15,"tag":23,"props":374,"children":375},{},[376],{"type":21,"value":377},"Treesitter is the only plugin I keep for language parsing.",{"type":15,"tag":23,"props":379,"children":380},{},[381],{"type":21,"value":382},"The config installs the languages I use most:",{"type":15,"tag":296,"props":384,"children":385},{},[386,391,396,401,406,411,416,421,426,431,436],{"type":15,"tag":83,"props":387,"children":388},{},[389],{"type":21,"value":390},"Go",{"type":15,"tag":83,"props":392,"children":393},{},[394],{"type":21,"value":395},"Lua",{"type":15,"tag":83,"props":397,"children":398},{},[399],{"type":21,"value":400},"TypeScript",{"type":15,"tag":83,"props":402,"children":403},{},[404],{"type":21,"value":405},"JavaScript",{"type":15,"tag":83,"props":407,"children":408},{},[409],{"type":21,"value":410},"CSS",{"type":15,"tag":83,"props":412,"children":413},{},[414],{"type":21,"value":415},"Vim",{"type":15,"tag":83,"props":417,"children":418},{},[419],{"type":21,"value":420},"PHP",{"type":15,"tag":83,"props":422,"children":423},{},[424],{"type":21,"value":425},"Vue",{"type":15,"tag":83,"props":427,"children":428},{},[429],{"type":21,"value":430},"Markdown",{"type":15,"tag":83,"props":432,"children":433},{},[434],{"type":21,"value":435},"Elixir / HEEx",{"type":15,"tag":83,"props":437,"children":438},{},[439],{"type":21,"value":440},"Zig",{"type":15,"tag":23,"props":442,"children":443},{},[444],{"type":21,"value":445},"After that, it starts Treesitter automatically for supported filetypes and enables the Treesitter indentation expression.",{"type":15,"tag":57,"props":447,"children":449},{"id":448},"git-with-fugitive",[450],{"type":21,"value":451},"Git with Fugitive",{"type":15,"tag":23,"props":453,"children":454},{},[455],{"type":21,"value":456},"For Git, I still use Fugitive.",{"type":15,"tag":23,"props":458,"children":459},{},[460],{"type":21,"value":461},"The mappings are intentionally small:",{"type":15,"tag":296,"props":463,"children":464},{},[465,476,487],{"type":15,"tag":83,"props":466,"children":467},{},[468,474],{"type":15,"tag":38,"props":469,"children":471},{"className":470},[],[472],{"type":21,"value":473},"\u003Cleader>gg",{"type":21,"value":475}," opens Fugitive",{"type":15,"tag":83,"props":477,"children":478},{},[479,485],{"type":15,"tag":38,"props":480,"children":482},{"className":481},[],[483],{"type":21,"value":484},"\u003Cleader>gd",{"type":21,"value":486}," opens a Git diff",{"type":15,"tag":83,"props":488,"children":489},{},[490,496],{"type":15,"tag":38,"props":491,"children":493},{"className":492},[],[494],{"type":21,"value":495},"\u003Cleader>gv",{"type":21,"value":497}," opens a diff split",{"type":15,"tag":23,"props":499,"children":500},{},[501],{"type":21,"value":502},"I do not need much more than that most of the time. Fugitive gives me the Git workflow I like without requiring a big UI around it.",{"type":15,"tag":57,"props":504,"children":506},{"id":505},"finding-files-and-grepping",[507],{"type":21,"value":508},"Finding Files and Grepping",{"type":15,"tag":23,"props":510,"children":511},{},[512],{"type":21,"value":513},"One of the biggest changes is that I now rely more on built-in commands.",{"type":15,"tag":23,"props":515,"children":516},{},[517,519,524,526,532,534,540],{"type":21,"value":518},"For files, I use ",{"type":15,"tag":38,"props":520,"children":522},{"className":521},[],[523],{"type":21,"value":99},{"type":21,"value":525}," with ",{"type":15,"tag":38,"props":527,"children":529},{"className":528},[],[530],{"type":21,"value":531},"ripgrep",{"type":21,"value":533}," powering ",{"type":15,"tag":38,"props":535,"children":537},{"className":536},[],[538],{"type":21,"value":539},"findfunc",{"type":21,"value":541},". That gives me fuzzy file lookup using the files in the project, while still staying inside Neovim's own command-line workflow.",{"type":15,"tag":205,"props":543,"children":545},{"className":207,"code":544,"language":209,"meta":7,"style":7},"vim.o.findfunc = 'v:lua.RgFindFiles'\n",[546],{"type":15,"tag":38,"props":547,"children":548},{"__ignoreMap":7},[549],{"type":15,"tag":215,"props":550,"children":551},{"class":217,"line":218},[552],{"type":15,"tag":215,"props":553,"children":554},{},[555],{"type":21,"value":544},{"type":15,"tag":23,"props":557,"children":558},{},[559,561,566,567,573],{"type":21,"value":560},"For search, I use ",{"type":15,"tag":38,"props":562,"children":564},{"className":563},[],[565],{"type":21,"value":107},{"type":21,"value":525},{"type":15,"tag":38,"props":568,"children":570},{"className":569},[],[571],{"type":21,"value":572},"rg",{"type":21,"value":574},":",{"type":15,"tag":205,"props":576,"children":578},{"className":207,"code":577,"language":209,"meta":7,"style":7},"vim.opt.grepprg = 'rg --vimgrep --smart-case --hidden --glob \"!.git\"'\nvim.opt.grepformat = '%f:%l:%c:%m'\n",[579],{"type":15,"tag":38,"props":580,"children":581},{"__ignoreMap":7},[582,590],{"type":15,"tag":215,"props":583,"children":584},{"class":217,"line":218},[585],{"type":15,"tag":215,"props":586,"children":587},{},[588],{"type":21,"value":589},"vim.opt.grepprg = 'rg --vimgrep --smart-case --hidden --glob \"!.git\"'\n",{"type":15,"tag":215,"props":591,"children":592},{"class":217,"line":227},[593],{"type":15,"tag":215,"props":594,"children":595},{},[596],{"type":21,"value":597},"vim.opt.grepformat = '%f:%l:%c:%m'\n",{"type":15,"tag":23,"props":599,"children":600},{},[601],{"type":21,"value":602},"The results go to quickfix, which is already one of the best parts of Vim/Neovim.",{"type":15,"tag":23,"props":604,"children":605},{},[606,611],{"type":15,"tag":27,"props":607,"children":610},{"alt":608,"src":609},"find files","/images/nvim_files.png",[],{"type":15,"tag":27,"props":612,"children":615},{"alt":613,"src":614},"grep","/images/nvim_grep.png",[],{"type":15,"tag":57,"props":617,"children":619},{"id":618},"netrw-and-terminal",[620],{"type":21,"value":621},"Netrw and Terminal",{"type":15,"tag":23,"props":623,"children":624},{},[625],{"type":21,"value":626},"I still keep things simple for files and terminals.",{"type":15,"tag":23,"props":628,"children":629},{},[630],{"type":21,"value":631},"For file browsing, I use netrw with a small keymap:",{"type":15,"tag":296,"props":633,"children":634},{},[635],{"type":15,"tag":83,"props":636,"children":637},{},[638,644],{"type":15,"tag":38,"props":639,"children":641},{"className":640},[],[642],{"type":21,"value":643},"\u003CC-e>",{"type":21,"value":645}," toggles the explorer",{"type":15,"tag":23,"props":647,"children":648},{},[649],{"type":21,"value":650},"For terminals, I use Neovim's built-in terminal:",{"type":15,"tag":296,"props":652,"children":653},{},[654,665,676,687],{"type":15,"tag":83,"props":655,"children":656},{},[657,663],{"type":15,"tag":38,"props":658,"children":660},{"className":659},[],[661],{"type":21,"value":662},"\u003Cleader>T",{"type":21,"value":664}," opens a terminal",{"type":15,"tag":83,"props":666,"children":667},{},[668,674],{"type":15,"tag":38,"props":669,"children":671},{"className":670},[],[672],{"type":21,"value":673},"\u003Cleader>st",{"type":21,"value":675}," opens a small terminal split at the bottom",{"type":15,"tag":83,"props":677,"children":678},{},[679,685],{"type":15,"tag":38,"props":680,"children":682},{"className":681},[],[683],{"type":21,"value":684},"\u003Cesc>",{"type":21,"value":686}," leaves terminal mode",{"type":15,"tag":83,"props":688,"children":689},{},[690,696],{"type":15,"tag":38,"props":691,"children":693},{"className":692},[],[694],{"type":21,"value":695},"\u003CC-q>",{"type":21,"value":697}," closes the terminal job",{"type":15,"tag":23,"props":699,"children":700},{},[701],{"type":21,"value":702},"This is enough for quick commands without leaving the editor.",{"type":15,"tag":57,"props":704,"children":706},{"id":705},"custom-colorscheme",[707],{"type":21,"value":708},"Custom Colorscheme",{"type":15,"tag":23,"props":710,"children":711},{},[712,714,720],{"type":21,"value":713},"Another part of the new setup is my own colorscheme, ",{"type":15,"tag":38,"props":715,"children":717},{"className":716},[],[718],{"type":21,"value":719},"tama",{"type":21,"value":45},{"type":15,"tag":23,"props":722,"children":723},{},[724],{"type":21,"value":725},"It is a dark, high-contrast colorscheme with a small palette and explicit highlight groups for the editor UI, syntax, LSP diagnostics, Treesitter, Markdown, HTML, CSS, diff views, and terminal colors.",{"type":15,"tag":23,"props":727,"children":728},{},[729],{"type":21,"value":730},"I like having the colorscheme inside the config because it is one less dependency and it makes the editor feel more personal.",{"type":15,"tag":57,"props":732,"children":734},{"id":733},"filetype-tweaks-and-snippets",[735],{"type":21,"value":736},"Filetype Tweaks and Snippets",{"type":15,"tag":23,"props":738,"children":739},{},[740],{"type":21,"value":741},"The config also has small filetype-specific files for the languages I use most:",{"type":15,"tag":296,"props":743,"children":744},{},[745,750,754,759,763,767,771,775,780],{"type":15,"tag":83,"props":746,"children":747},{},[748],{"type":21,"value":749},"Elixir",{"type":15,"tag":83,"props":751,"children":752},{},[753],{"type":21,"value":390},{"type":15,"tag":83,"props":755,"children":756},{},[757],{"type":21,"value":758},"JavaScript / TypeScript",{"type":15,"tag":83,"props":760,"children":761},{},[762],{"type":21,"value":395},{"type":15,"tag":83,"props":764,"children":765},{},[766],{"type":21,"value":420},{"type":15,"tag":83,"props":768,"children":769},{},[770],{"type":21,"value":425},{"type":15,"tag":83,"props":772,"children":773},{},[774],{"type":21,"value":440},{"type":15,"tag":83,"props":776,"children":777},{},[778],{"type":21,"value":779},"Git and gitcommit",{"type":15,"tag":83,"props":781,"children":782},{},[783],{"type":21,"value":784},"Diff files",{"type":15,"tag":23,"props":786,"children":787},{},[788],{"type":21,"value":789},"I also keep snippets in the config for common languages like Elixir, Go, HTML, JavaScript, Lua, Markdown, PHP, and Vue.",{"type":15,"tag":23,"props":791,"children":792},{},[793],{"type":21,"value":794},"Again, the idea is not to build a huge framework. It is just enough customization to make daily work faster.",{"type":15,"tag":57,"props":796,"children":798},{"id":797},"why-this-version-is-better-for-me",[799],{"type":21,"value":800},"Why This Version Is Better for Me",{"type":15,"tag":23,"props":802,"children":803},{},[804],{"type":21,"value":805},"This config is easier to maintain than my old one.",{"type":15,"tag":23,"props":807,"children":808},{},[809],{"type":21,"value":810},"There are fewer plugins, fewer abstractions, and fewer decisions hidden behind someone else's defaults. When something changes, I know where to look. When something breaks, there are only a few files involved.",{"type":15,"tag":23,"props":812,"children":813},{},[814],{"type":21,"value":815},"I also like that this setup follows Neovim's direction. The editor itself now provides many of the things I used to install plugins for, so it makes sense to remove dependencies and use the built-in tools.",{"type":15,"tag":57,"props":817,"children":819},{"id":818},"repo",[820],{"type":21,"value":821},"Repo",{"type":15,"tag":23,"props":823,"children":824},{},[825],{"type":15,"tag":161,"props":826,"children":829},{"href":827,"rel":828},"https://github.com/DamascenoV/nvim",[165],[830],{"type":21,"value":831},"Here is the repo of my Neovim configuration",{"type":15,"tag":833,"props":834,"children":835},"style",{},[836],{"type":21,"value":837},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":227,"depth":227,"links":839},[840,841,842,843,844,845,846,847,848,849,850],{"id":59,"depth":227,"text":62},{"id":142,"depth":227,"text":145},{"id":276,"depth":227,"text":279},{"id":369,"depth":227,"text":372},{"id":448,"depth":227,"text":451},{"id":505,"depth":227,"text":508},{"id":618,"depth":227,"text":621},{"id":705,"depth":227,"text":708},{"id":733,"depth":227,"text":736},{"id":797,"depth":227,"text":800},{"id":818,"depth":227,"text":821},"markdown","content:blog:2026:05:my_new_neovim_config.md","content","blog/2026/05/my_new_neovim_config.md","blog/2026/05/my_new_neovim_config","md",1779987059196]