Skip to content

Instantly share code, notes, and snippets.

@hunzo
Last active April 2, 2026 16:59
Show Gist options
  • Select an option

  • Save hunzo/38751a7a388d19464f00d91598355a49 to your computer and use it in GitHub Desktop.

Select an option

Save hunzo/38751a7a388d19464f00d91598355a49 to your computer and use it in GitHub Desktop.
simple nvim 0.12 config
local opt = vim.opt
local g = vim.g
local keymap = vim.keymap
-- Basic editor settings
opt.expandtab = true -- Use spaces instead of tabs
opt.tabstop = 2 -- Number of spaces that a <Tab> in the file counts for
opt.softtabstop = 2 -- Number of spaces that a <Tab> counts for while performing editing operations
opt.shiftwidth = 2 -- Size of an indent
opt.relativenumber = true -- Show relative line numbers
opt.number = true -- Show absolute line number on current line
opt.signcolumn = "yes" -- Always show the signcolumn
opt.termguicolors = true -- Enable 24-bit RGB colors
opt.wrap = false -- Disable line wrap
-- Markdown indentation fix
g.markdown_recommended_style = 0
-- Leader key
g.mapleader = " "
-- Key mapping defaults
local opts = { noremap = true, silent = true }
-- Move selected lines
keymap.set("v", "J", ":m '>+1<CR>gv=gv", opts)
keymap.set("v", "K", ":m '<-2<CR>gv=gv", opts)
-- Window navigation
keymap.set("n", "<C-h>", "<C-w>h", opts)
keymap.set("n", "<C-j>", "<C-w>j", opts)
keymap.set("n", "<C-k>", "<C-w>k", opts)
keymap.set("n", "<C-l>", "<C-w>l", opts)
-- Clear search highlight
keymap.set("n", "<leader>n", ":nohlsearch<CR>", opts)
-- Tabs
keymap.set("n", "te", ":tabedit<CR>", opts)
keymap.set("n", "<Tab>", ":tabnext<CR>", opts)
keymap.set("n", "<S-Tab>", ":tabprev<CR>", opts)
-- Increment/decrement
keymap.set("n", "+", "<C-a>", opts)
keymap.set("n", "-", "<C-x>", opts)
-- Split windows
keymap.set("n", "ss", ":split<CR>", opts)
keymap.set("n", "sv", ":vsplit<CR>", opts)
-- Resize windows easily
keymap.set("n", "<C-Left>", "<C-w><", opts)
keymap.set("n", "<C-Right>", "<C-w>>", opts)
keymap.set("n", "<C-Up>", "<C-w>+", opts)
keymap.set("n", "<C-Down>", "<C-w>-", opts)
-- Mini.Pick
keymap.set("n", "<leader>ff", ":Pick files<CR>", opts)
keymap.set("n", "<leader>fg", ":Pick grep_live<CR>", opts)
keymap.set("n", "<leader>fb", ":Pick buffer<CR>", opts)
keymap.set("n", "<leader>d", ":Trouble diagnostics toggle<CR>", opts)
vim.pack.add({
{ src = "https://github.com/rose-pine/neovim" },
{ src = "https://github.com/mason-org/mason.nvim" },
{ src = "https://github.com/mason-org/mason-lspconfig.nvim" },
{ src = "https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim" },
{ src = "https://github.com/nvim-mini/mini.nvim" },
{ src = "https://github.com/akinsho/toggleterm.nvim" },
{ src = "https://github.com/stevearc/oil.nvim" },
{ src = "https://github.com/folke/trouble.nvim" },
{ src = "https://github.com/stevearc/conform.nvim.git" },
{ src = "https://github.com/folke/lazydev.nvim" },
})
require("mini.pick").setup()
require("mini.pairs").setup()
require("mini.surround").setup()
require("mini.statusline").setup()
require("trouble").setup()
require("lazydev").setup()
require("toggleterm").setup({
open_mapping = [[<c-\>]],
direction = "float",
})
require("mason").setup()
require("mason-lspconfig").setup({})
require("mason-tool-installer").setup({
ensure_installed = {
-- Formatters
"autopep8",
"djlint",
"stylua",
"yamlfmt",
"nginx-config-formatter",
"jq",
"shfmt",
"mdformat",
-- Linters
"ruff",
"ansible-lint",
},
})
-- auto format on save
require("conform").setup({
formatters_by_ft = {
json = { "jq" },
markdown = { "mdformat" },
yaml = { "yamlfmt" },
lua = { "stylua" },
python = { "autopep8" },
htmldjango = { "djlint" },
html = { "djlint" },
nginx = { "nginxfmt" },
sh = { "shfmt" },
},
format_on_save = {
timeout_ms = 500,
lsp_format = "fallback",
},
async = false,
timeout_ms = 500,
notify_on_error = true,
log_level = vim.log.levels.DEBUG,
})
-- manual format
local conform = require("conform")
vim.keymap.set({ "n", "v" }, "<leader>fm", function()
conform.format({
lsp_fallback = true,
async = false,
timeout_ms = 500,
})
end, { desc = "Format file or range (in vitual mode)" })
require("oil").setup({
view_options = {
show_hidden = true,
},
})
require("rose-pine").setup({
styles = {
bold = false,
italic = true,
transparency = true,
},
})
vim.cmd("colorscheme rose-pine")
vim.g.mapleader = " "
local opt = vim.opt
-- basic editor settings
opt.expandtab = true -- Use spaces instead of tabs
opt.tabstop = 4 -- Number of spaces that a <Tab> in the file counts for
opt.softtabstop = 4 -- Number of spaces that a <Tab> counts for while performing editing operations
opt.shiftwidth = 4 -- Size of an indent
opt.relativenumber = true -- Show relative line numbers
opt.number = true -- Show absolute line number on current line
opt.signcolumn = "yes" -- Always show the signcolumn
opt.termguicolors = true -- Enable 24-bit RGB colors
opt.wrap = false -- Disable line wrap
opt.winborder = "rounded"
-- add package
vim.pack.add({
{ src = "https://github.com/rose-pine/neovim" },
{ src = "https://github.com/neovim/nvim-lspconfig" },
{ src = "https://github.com/mason-org/mason.nvim" },
{ src = "https://github.com/mason-org/mason-lspconfig.nvim" },
{ src = "https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim" },
{ src = "https://github.com/nvim-mini/mini.nvim" },
{ src = "https://github.com/saghen/blink.cmp" },
{ src = "https://github.com/akinsho/toggleterm.nvim" },
{ src = "https://github.com/stevearc/oil.nvim" },
{ src = "https://github.com/folke/trouble.nvim" },
{ src = "https://github.com/L3MON4D3/LuaSnip.git" },
{ src = "https://github.com/stevearc/conform.nvim.git" },
{ src = "https://github.com/folke/lazydev.nvim" },
})
-- indent and filestypes settings
vim.api.nvim_create_autocmd("FileType", {
pattern = "go",
callback = function()
vim.bo.tabstop = 4
vim.bo.shiftwidth = 4
vim.bo.softtabstop = 4
end,
})
vim.api.nvim_create_autocmd("FileType", {
pattern = "python",
callback = function()
vim.bo.tabstop = 4
vim.bo.shiftwidth = 4
vim.bo.softtabstop = 4
end,
})
vim.api.nvim_create_autocmd("FileType", {
pattern = { "html", "javascript", "typescript", "javascriptreact", "typescriptreact" },
callback = function()
vim.bo.tabstop = 2
vim.bo.shiftwidth = 2
vim.bo.softtabstop = 2
end,
})
vim.filetype.add({
pattern = {
[".*/ansible/.*%.yml"] = "yaml.ansible",
[".*/playbooks/.*%.yml"] = "yaml.ansible",
[".*/roles/.*/tasks/.*%.yml"] = "yaml.ansible",
[".*/handlers/.*%.yml"] = "yaml.ansible",
[".*/group_vars/.*%.yml"] = "yaml.ansible",
[".*/host_vars/.*%.yml"] = "yaml.ansible",
},
})
-- enable plugins
require("mini.pick").setup()
require("mini.pairs").setup()
require("mini.surround").setup()
require("mini.statusline").setup()
require("trouble").setup()
require("lazydev").setup()
require("toggleterm").setup({
open_mapping = [[<c-\>]],
direction = "float",
})
require("oil").setup({
view_options = {
show_hidden = true,
},
})
require("mason").setup()
require("mason-lspconfig").setup({
ensure_installed = {
-- install LSP
"tailwindcss",
"ts_ls",
"gopls",
"pyright",
"emmet_ls",
"html",
"lua_ls",
"yamlls",
"dockerls",
"bashls",
"jsonls",
"cssls",
"ansiblels",
"docker_compose_language_service",
"terraformls",
},
})
require("mason-tool-installer").setup({
ensure_installed = {
-- install formatters
"autopep8",
"prettierd",
"stylua",
"gofumpt",
"golines",
"sqlfmt",
"yamlfmt",
"shfmt",
"nginx-config-formatter",
"goimports-reviser",
"terraform",
-- install linters
"ruff",
"eslint_d",
"djlint",
"golangci-lint",
"ansible-lint",
"hadolint",
"hadolint",
},
})
-- colorscheme
require("rose-pine").setup({
styles = {
bold = false,
italic = true,
transparency = true,
},
})
-- autocomplete
require("luasnip.loaders.from_vscode").lazy_load()
require("blink.cmp").setup({
signature = { enabled = true },
keymap = {
["<CR>"] = { "accept", "fallback" },
},
completion = {
list = {
selection = {
preselect = true,
auto_insert = true,
},
},
},
})
-- ~/.local/share/nvim/site/pack/core/opt/blink.cmp $ cargo build --release
-- auto format on save
require("conform").setup({
formatters_by_ft = {
javascript = { "prettierd" },
typescript = { "prettierd" },
javascriptreact = { "prettierd" },
typescriptreact = { "prettierd" },
css = { "prettierd" },
json = { "prettierd" },
markdown = { "prettierd" },
yaml = { "yamlfmt" },
lua = { "stylua" },
python = { "autopep8" },
htmldjango = { "djlint" },
html = { "djlint" },
go = { "gofumpt", "golines", "goimports-reviser" },
sql = { "sqlfmt" },
sh = { "shfmt" },
nginx = { "nginxfmt" },
},
format_on_save = {
timeout_ms = 500,
lsp_format = "fallback",
},
async = false,
timeout_ms = 500,
notify_on_error = true,
log_level = vim.log.levels.DEBUG,
})
-- manual format
local conform = require("conform")
vim.keymap.set({ "n", "v" }, "<leader>fm", function()
conform.format({
lsp_fallback = true,
async = false,
timeout_ms = 500,
})
end, { desc = "Format file or range (in vitual mode)" })
vim.cmd("colorscheme rose-pine")
local opts = { noremap = true, silent = true }
local keymap = vim.keymap
-- Mini.Pick
keymap.set("n", "<leader>ff", ":Pick files<CR>", opts)
keymap.set("n", "<leader>fg", ":Pick grep_live<CR>", opts)
keymap.set("n", "<leader>fb", ":Pick buffer<CR>", opts)
keymap.set("n", "<leader>d", ":Trouble diagnostics toggle<CR>", opts)
-- Move selected lines
keymap.set("v", "J", ":m '>+1<CR>gv=gv", opts)
keymap.set("v", "K", ":m '<-2<CR>gv=gv", opts)
-- Window navigation
keymap.set("n", "<C-h>", "<C-w>h", opts)
keymap.set("n", "<C-j>", "<C-w>j", opts)
keymap.set("n", "<C-k>", "<C-w>k", opts)
keymap.set("n", "<C-l>", "<C-w>l", opts)
-- Clear search highlight
keymap.set("n", "<leader>n", ":nohlsearch<CR>", opts)
-- Tabs
keymap.set("n", "te", ":tabedit<CR>", opts)
keymap.set("n", "<Tab>", ":tabnext<CR>", opts)
keymap.set("n", "<S-Tab>", ":tabprev<CR>", opts)
-- Increment/decrement
keymap.set("n", "+", "<C-a>", opts)
keymap.set("n", "-", "<C-x>", opts)
-- Split windows
keymap.set("n", "ss", ":split<CR>", opts)
keymap.set("n", "sv", ":vsplit<CR>", opts)
-- Resize windows easily
keymap.set("n", "<C-Left>", "<C-w><", opts)
keymap.set("n", "<C-Right>", "<C-w>>", opts)
keymap.set("n", "<C-Up>", "<C-w>+", opts)
keymap.set("n", "<C-Down>", "<C-w>-", opts)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment