Created
February 28, 2026 15:30
-
-
Save bdougie/97a666798c73fa7ed7f0ca12aca2c96e to your computer and use it in GitHub Desktop.
Neovim init.lua - migrated from vimrc with space leader and netrw file explorer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| -- Leader key: spacebar (set before any mappings) | |
| vim.g.mapleader = " " | |
| vim.g.maplocalleader = " " | |
| ------------------------------------------------- | |
| -- Options | |
| ------------------------------------------------- | |
| vim.opt.wrap = true | |
| vim.opt.textwidth = 80 | |
| vim.opt.autoindent = true | |
| vim.opt.cindent = true | |
| vim.opt.number = true | |
| vim.opt.relativenumber = true | |
| vim.opt.ignorecase = true | |
| vim.opt.smartcase = true | |
| vim.opt.hlsearch = true | |
| vim.opt.incsearch = true | |
| vim.opt.termguicolors = true | |
| vim.opt.scrolloff = 8 | |
| vim.opt.signcolumn = "yes" | |
| vim.opt.updatetime = 250 | |
| vim.opt.splitright = true | |
| vim.opt.splitbelow = true | |
| vim.opt.clipboard = "unnamedplus" | |
| vim.opt.expandtab = true | |
| vim.opt.tabstop = 2 | |
| vim.opt.shiftwidth = 2 | |
| vim.opt.softtabstop = 2 | |
| vim.opt.spell = false | |
| vim.opt.background = "dark" | |
| vim.opt.omnifunc = "syntaxcomplete#Complete" | |
| ------------------------------------------------- | |
| -- Netrw (built-in file explorer, replaces NERDTree) | |
| ------------------------------------------------- | |
| vim.g.netrw_banner = 0 -- hide banner | |
| vim.g.netrw_liststyle = 3 -- tree view | |
| vim.g.netrw_browse_split = 4 -- open in prior window | |
| vim.g.netrw_altv = 1 -- open splits to the right | |
| vim.g.netrw_winsize = 25 -- 25% width | |
| -- Toggle netrw sidebar (NERDTree-style) | |
| vim.keymap.set("n", "<leader>e", ":Lexplore<CR>", { silent = true, desc = "Toggle file explorer" }) | |
| ------------------------------------------------- | |
| -- File explorer splits (from your vimrc) | |
| ------------------------------------------------- | |
| vim.keymap.set("n", "<leader>ss", ":Sex<CR>", { silent = true, desc = "Horizontal split explorer" }) | |
| vim.keymap.set("n", "<leader>vv", ":Vex<CR>", { silent = true, desc = "Vertical split explorer" }) | |
| ------------------------------------------------- | |
| -- Save / Quit | |
| ------------------------------------------------- | |
| vim.keymap.set("n", "<leader>w", ":retab<bar>:w<CR>", { desc = "Retab and save" }) | |
| vim.keymap.set("n", "<leader>wq", ":retab<bar>:wq<CR>", { desc = "Retab, save, and quit" }) | |
| vim.keymap.set("n", "<leader>q", ":q!<CR>", { desc = "Quit without saving" }) | |
| ------------------------------------------------- | |
| -- Edit config | |
| ------------------------------------------------- | |
| vim.keymap.set("n", "<leader>v", ":edit $MYVIMRC<CR>", { desc = "Edit neovim config" }) | |
| ------------------------------------------------- | |
| -- Copy paths to clipboard | |
| ------------------------------------------------- | |
| vim.keymap.set("n", "<leader>ff", ':let @+=expand("%")<CR>', { desc = "Copy relative path" }) | |
| vim.keymap.set("n", "<leader>F", ':let @+=expand("%:p")<CR>', { desc = "Copy full path" }) | |
| vim.keymap.set("n", "<leader>fl", ':let @+=expand("%:t")<CR>', { desc = "Copy filename" }) | |
| ------------------------------------------------- | |
| -- Search | |
| ------------------------------------------------- | |
| vim.keymap.set("n", "\\", ":grep ", { desc = "Grep search" }) | |
| vim.keymap.set("n", "K", ':grep! "\\b<C-R><C-W>\\b"<CR>:cw<CR>', { desc = "Grep word under cursor" }) | |
| vim.keymap.set("n", "<leader>2", ":noh<CR>", { silent = true, desc = "Clear search highlights" }) | |
| -- Use ripgrep if available (modern ag replacement) | |
| if vim.fn.executable("rg") == 1 then | |
| vim.opt.grepprg = "rg --vimgrep --no-heading --smart-case" | |
| vim.opt.grepformat = "%f:%l:%c:%m" | |
| elseif vim.fn.executable("ag") == 1 then | |
| vim.opt.grepprg = "ag --nogroup --nocolor" | |
| end | |
| ------------------------------------------------- | |
| -- Buffers | |
| ------------------------------------------------- | |
| vim.keymap.set("n", "<leader>bb", ":ls<CR>", { desc = "List buffers" }) | |
| vim.keymap.set("n", "<leader>bl", ":b#<CR>", { desc = "Previous buffer" }) | |
| ------------------------------------------------- | |
| -- Window layout switching | |
| ------------------------------------------------- | |
| vim.keymap.set("n", "<leader>H", ":windo wincmd K<CR>", { silent = true, desc = "Windows to horizontal" }) | |
| vim.keymap.set("n", "<leader>h", ":windo wincmd H<CR>", { silent = true, desc = "Windows to vertical" }) | |
| ------------------------------------------------- | |
| -- Spelling | |
| ------------------------------------------------- | |
| vim.keymap.set("n", "<leader>sp", ":set spell!<CR>", { silent = true, desc = "Toggle spell check" }) | |
| vim.keymap.set("n", "<leader>sz", "1z=", { silent = true, desc = "Fix spelling" }) | |
| ------------------------------------------------- | |
| -- Syntax / display | |
| ------------------------------------------------- | |
| vim.keymap.set("n", "<leader>1", ":syntax enable<CR>", { desc = "Enable syntax" }) | |
| ------------------------------------------------- | |
| -- Format JSON | |
| ------------------------------------------------- | |
| vim.keymap.set("n", "<leader>3", ":%!python3 -m json.tool<CR>", { desc = "Format JSON" }) | |
| ------------------------------------------------- | |
| -- Move lines up/down (Ctrl+Shift style) | |
| ------------------------------------------------- | |
| vim.keymap.set("n", "<C-S-Up>", ":move .-2<CR>==", { silent = true, desc = "Move line up" }) | |
| vim.keymap.set("n", "<C-S-Down>", ":move .+1<CR>==", { silent = true, desc = "Move line down" }) | |
| vim.keymap.set("v", "<C-S-Up>", ":move '<-2<CR>gv=gv", { silent = true, desc = "Move selection up" }) | |
| vim.keymap.set("v", "<C-S-Down>", ":move '>+1<CR>gv=gv", { silent = true, desc = "Move selection down" }) | |
| ------------------------------------------------- | |
| -- Move highlighted text left/right | |
| ------------------------------------------------- | |
| vim.keymap.set("v", "<", "<gv", { desc = "Indent left and reselect" }) | |
| vim.keymap.set("v", ">", ">gv", { desc = "Indent right and reselect" }) | |
| ------------------------------------------------- | |
| -- Commonly misspelled words | |
| ------------------------------------------------- | |
| vim.cmd("iabbrev mispell misspell") | |
| ------------------------------------------------- | |
| -- Auto-reload config on save | |
| ------------------------------------------------- | |
| vim.api.nvim_create_autocmd("BufWritePost", { | |
| pattern = vim.fn.expand("$MYVIMRC"), | |
| callback = function() | |
| vim.cmd("source $MYVIMRC") | |
| vim.notify("Config reloaded", vim.log.levels.INFO) | |
| end, | |
| desc = "Reload config on save", | |
| }) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment