Skip to content

Instantly share code, notes, and snippets.

@teki
Last active March 31, 2026 22:36
Show Gist options
  • Select an option

  • Save teki/e5ed709de70b1e7556b9a2088ddfdb50 to your computer and use it in GitHub Desktop.

Select an option

Save teki/e5ed709de70b1e7556b9a2088ddfdb50 to your computer and use it in GitHub Desktop.
nvim config
-- Learn about Neovim's lua api
-- https://neovim.io/doc/user/lua-guide.html
vim.o.number = true
vim.o.tabstop = 2
vim.o.shiftwidth = 2
vim.o.expandtab = true
vim.o.smartcase = true
vim.o.ignorecase = true
vim.o.wrap = false
vim.o.hlsearch = true
vim.o.signcolumn = 'yes'
vim.g.mapleader = ' '
local ok_theme = pcall(vim.cmd.colorscheme, 'retrobox')
if not ok_theme then
vim.cmd.colorscheme('habamax')
end
local min_version = "0.12.0"
if vim.fn.has("nvim-" .. min_version) == 0 then
vim.notify(
"This config requires Neovim >= " .. min_version .. ". Please update!",
vim.log.levels.ERROR
)
return
end
-- Install plugins
vim.pack.add({'https://github.com/nvim-mini/mini.nvim'})
vim.pack.add({'https://github.com/neovim/nvim-lspconfig'})
vim.pack.add({'https://github.com/nvim-lua/plenary.nvim'})
vim.pack.add({'https://github.com/mikavilpas/yazi.nvim'})
vim.pack.add({'https://github.com/ibhagwan/fzf-lua'})
vim.pack.add({'https://github.com/akinsho/toggleterm.nvim'})
vim.pack.add({'https://github.com/Punity122333/hexinspector.nvim'})
require('mini.icons').setup({})
require('mini.snippets').setup({})
-- completion
require('mini.completion').setup({})
-- basic git support
require('mini.git').setup({})
require('mini.diff').setup({})
require('mini.notify').setup({})
-- used by fzf-lua
require('fzf-lua').setup({'fzf-native'})
-- terminal window manage
require('toggleterm').setup({})
-- HexEdit [path] and HexInspect [path]
require('hexinspector').setup({})
-- auto cwd to project, restore cursor position
require('mini.misc').setup()
require('mini.statusline').setup()
-- not sure: show indent on line
require('mini.indentscope').setup({})
-- highlight whitespace end of line
require('mini.trailspace').setup({})
-- highlight word under cursor
require('mini.cursorword').setup({})
-- open screen
require('mini.starter').setup({})
-- lazygit overlay
local Terminal = require('toggleterm.terminal').Terminal
local lazygit = Terminal:new({ cmd = "lazygit", hidden = true, direction = "float", name = "lazygit" })
function _G._lazygit_toggle()
lazygit:toggle()
end
vim.keymap.set('n', '<leader>g', '<cmd>lua _lazygit_toggle()<cr>', {noremap = true, silent = true})
-- terminal overlay
local myterm = Terminal:new({ hidden = true, direction = "float", name = "myterm", dir="~/work" })
function _G._myterm_toggle()
myterm:toggle()
end
vim.keymap.set('n', '<leader>t', '<cmd>lua _myterm_toggle()<cr>', {desc = 'Open terminal'})
-- common term: if you only want these mappings for toggle term use term://*toggleterm#* instead
function _G.set_terminal_keymaps()
local opts = {buffer = 0}
vim.keymap.set('t', '<C-w>', [[<C-\><C-n><C-w>]], opts)
end
vim.cmd('autocmd! TermOpen term://* lua set_terminal_keymaps()')
-- Basic clipboard interaction
vim.keymap.set({'n', 'x', 'v'}, 'gy', '"+y', {desc = 'Copy to clipboard'})
vim.keymap.set({'n', 'x', 'v'}, 'gp', '"+p', {desc = 'Paste clipboard text'})
-- MacOS stuff
-- cmd+c support from here: https://www.reddit.com/r/Ghostty/comments/1hzj8el/how_to_get_cmdc_and_cmda_working_in_neovim/
vim.keymap.set({ 'n', 'i', 'v', 'x' }, '<D-c>', '"+y', { desc = 'MacOS copy' })
vim.keymap.set({ 'n', 'i', 'v', 'x' }, '<D-v>', '"+p', { desc = 'MacOS paste' })
-- generic
vim.keymap.set('n', '<leader>q', '<cmd>quitall<cr>', {desc = 'Exit vim'})
vim.keymap.set('n', '<leader>w', '<cmd>w<cr>', {desc = 'Save file'})
-- edit config --
vim.keymap.set('n', '<leader>0', '<cmd>e $MYVIMRC<cr>', {desc = 'Edit config'})
vim.keymap.set('n', '<leader>9', '<cmd>source $MYVIMRC<cr>', {desc = 'Reload config'})
-- yazi --
vim.keymap.set('n', '<leader>y', '<cmd>Yazi toggle<cr>', {desc = 'Open yazi'})
-- fzf --
-- global has prefix support: $buffer, @lsp buffer, #lsp project
vim.keymap.set('n', '<leader>o', '<cmd>FzfLua global<cr>', {desc = 'fzf find files'})
vim.keymap.set('n', '<tab>', '<cmd>FzfLua buffers<cr>', {desc = 'fzf find files'})
vim.keymap.set('n', '<leader>s', '<cmd>lua FzfLua.live_grep({resume=true})<cr>', {desc = 'fzf live grep'})
vim.keymap.set('n', '<leader>f', '<cmd>FzfLua lgrep_curbuf<cr>', {desc = 'fzf grep in buffer'})
vim.keymap.set('n', '<leader><space>', '<cmd>FzfLua resume<cr>', {desc = 'fzf show window'})
-- use tab for auto complete
local imap_expr = function(lhs, rhs)
vim.keymap.set('i', lhs, rhs, { expr = true })
end
imap_expr('<Tab>', [[pumvisible() ? "\<C-n>" : "\<Tab>"]])
imap_expr('<S-Tab>', [[pumvisible() ? "\<C-p>" : "\<S-Tab>"]])
-- lsp --
-- "gra" (Normal and Visual mode) is mapped to vim.lsp.buf.code_action()
-- "gri" is mapped to vim.lsp.buf.implementation()
-- "grn" is mapped to vim.lsp.buf.rename()
-- "grr" is mapped to vim.lsp.buf.references()
-- "grt" is mapped to vim.lsp.buf.type_definition()
-- "gO" is mapped to vim.lsp.buf.document_symbol()
-- CTRL-S (Insert mode) is mapped to vim.lsp.buf.signature_help()
vim.api.nvim_create_autocmd('LspAttach', {
callback = function(event)
-- NOTE: By default `K` uses the program specified in the 'keywordprg' option.
-- Here we override the default behavior, we force it to use the LSP client
-- Display documentation of the symbol under the cursor
vim.keymap.set('n', 'K', '<cmd>lua vim.lsp.buf.hover()<cr>', {buffer = event.buf})
end,
})
-- List of compatible language servers is here:
-- https://github.com/neovim/nvim-lspconfig/blob/master/doc/configs.md
vim.lsp.enable('clangd')
vim.lsp.enable('bashls')
vim.lsp.enable('ty')
-- default configs come from: https://github.com/neovim/nvim-lspconfig
-- to change config: vim.lsp.config(server, opts)
-- Display errors, warning inline
vim.diagnostic.config({
virtual_text = true,
})
MiniMisc.setup_restore_cursor()
MiniMisc.setup_auto_root({".git"})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment