My personal Lua-based Neovim configuration. Focused on productivity, modern UI, and developer tools (likely for TypeScript development).
- Backup your current Neovim config:
mv ~/.config/nvim ~/.config/nvim.bak - Clone this repo:
git clone https://github.com/kovs713/nvim-config.git ~/.config/nvim - Launch Neovim:
nvim(plugins will auto-install via lazy.nvim)
This config uses lazy.nvim for plugin management, with plugins organized into enabled/disabled folders and categorized for easy maintenance. It includes LSP support, Obsidian notes tooling, Treesitter syntax, Git integration, and more.
- Modern UI: Customizable dashboard, statusline, notifications, and markdown rendering.
- Coding Tools: LSP with diagnostics, code actions, refactoring, formatting, and linting.
- Syntax & Completion: Treesitter-based highlighting, auto-tagging, Tailwind/Emmet support, and fast completion.
- Editing Enhancements: Auto-pairs, comments, TODO highlighting, and indentation visualization.
- Navigation: Fuzzy finders, file explorers, quick jumps, and window management.
- Git Integration: Signs for changes, hunk staging, blame, and diffs.
- Productivity: Note-taking with Obsidian, time tracking, Discord presence, and image pasting.
- Modular Mini.nvim: Lightweight modules for surroundings, textobjects, icons, and more.
- Customization: Easily enable/disable plugins by moving files between folders.
- Neovim v0.11.4
- Git (for repo management).
- Node.js (for some LSP servers like TypeScript).
- Optional: ripgrep (for faster searching), fd (for file finding), ImageMagick (for image previews).
Common Keymaps
| Mode | Key | Action | Description |
|---|---|---|---|
| Ⓝ | leaders | <cmd>wall<CR> | Save all buffers |
| Ⓝ | Ctrl + a | ggVG | Select all |
| Ⓝ | Ctrl + d | <C-d>zz | - |
| Ⓝ | Ctrl + u | <C-u>zz | - |
| Ⓥ | J | :m '>+1<CR>gv=gv | Move line down in Visual mode |
| Ⓥ | K | :m '<-2<CR>gv=gv | Move line up in Visual mode |
| Ⓝ | n | nzz | - |
| Ⓝ | N | Nzz | - |
| Ⓝ | * | *zz | - |
| Ⓝ | # | #zz | - |
| Ⓝ | g* | g*zz | - |
| Ⓝ | g# | g#zz | - |
| Ⓥ | < | <g | - |
| Ⓥ | > | >g | - |
| Ⓥ | p | "_dP | Paste without saving |
| Ⓝ,Ⓥ,Ⓞ | H | ^ | Go to start of line |
| Ⓝ,Ⓥ,Ⓞ | L | g_ | Go to end of line |
| Ⓝ | Ctrl + i | <C-o> | Replace goto next |
| Ⓝ | Ctrl + o | <C-i> | Replace goto prev |
| Ⓝ | Esc | <cmd>noh<CR> | Clear search |
TypeScript Tools
| Mode | Key | Action | Description |
|---|---|---|---|
| Ⓝ | leaderrf | <cmd>TSToolsRenameFile<CR> | TS [R]ename [F]ile + Fix Imports |
| Ⓝ | leaderoi | <cmd>TSToolsOrganizeImports<CR> | TS Tools Organize [I]mports |
Refactoring.nvim
| Mode | Key | Action | Description |
|---|---|---|---|
| Ⓝ | leaderrr | require('refactoring').select_refactor { prefer_ex_cmd = true } | Refactor… |
| Ⓝ | leaderre | require('refactoring').refactor 'Extract Function' | Extract Function |
| Ⓝ | leaderrv | require('refactoring').refactor 'Extract Variable' | Extract Variable |
| Ⓝ | leaderrI | require('refactoring').refactor 'Inline Function' | Inline Function |
| Ⓝ | leaderri | require('refactoring').refactor 'Inline Variable' | Inline Variable |
Gitsigns.nvim
| Mode | Key | Action | Description |
|---|---|---|---|
| Ⓝ | ]h | gitsigns.nav_hunk 'next' (or vim.cmd.normal in diff) | Jump to next git [c]hange |
| Ⓝ | [h | gitsigns.nav_hunk 'prev' (or vim.cmd.normal in diff) | Jump to previous git [c]hange |
| Ⓥ | leadergs | gitsigns.stage_hunk { vim.fn.line '.', vim.fn.line 'v' } | [g]it [s]tage hunk |
| Ⓥ | leadergr | gitsigns.reset_hunk { vim.fn.line '.', vim.fn.line 'v' } | [g]it [r]eset hunk |
| Ⓝ | leadergs | gitsigns.stage_hunk | [g]it [s]tage hunk |
| Ⓝ | leadergr | gitsigns.reset_hunk | [g]it [r]eset hunk |
| Ⓝ | leadergS | gitsigns.stage_buffer | [g]it [S]tage buffer |
| Ⓝ | leadergu | gitsigns.stage_hunk | [g]it [u]ndo stage hunk |
| Ⓝ | leadergR | gitsigns.reset_buffer | [g]it [R]eset buffer |
| Ⓝ | leadergp | gitsigns.preview_hunk | [g]it [p]review hunk |
| Ⓝ | leadergb | gitsigns.blame_line | [g]it [b]lame line |
| Ⓝ | leadergd | gitsigns.diffthis | [g]it [d]iff against index |
| Ⓝ | leadergD | gitsigns.diffthis '@' | [g]it [D]iff against last commit |
| Ⓝ | leadertb | gitsigns.toggle_current_line_blame | [T]oggle git show [b]lame line |
| Ⓝ | leadertD | gitsigns.preview_hunk_inline | [T]oggle git show [D]eleted |
Todo-Comments.nvim
| Mode | Key | Action | Description |
|---|---|---|---|
| Ⓝ | leaderft | <cmd>TodoFzfLua<CR> | [F]zfLua [T]odo Comments |
Which-Key.nvim
| Mode | Key | Action | Description |
|---|---|---|---|
| - | leader? | require('which-key').show { global = false } | Buffer Local Keymaps (which-key) |
Obsidian.nvim
| Mode | Key | Action | Description |
|---|---|---|---|
| Ⓝ | leaderod | <cmd>Obsidian dailies<cr> | [O]bsidian [D]ailies |
| Ⓝ | leaderont | <cmd>Obsidian today<cr> | [O]bsidian [N]ew [T]oday |
| Ⓝ | leaderony | <cmd>Obsidian yesterday<cr> | [O]bsidian [N]ew [Y]esterday |
| Ⓝ | leaderonn | <cmd>Obsidian new<cr> | [O]bsidian [N]ew [N]ote |
| Ⓝ | leaderos | <cmd>Obsidian search<cr> | [O]bsidian [S]earch |
| Ⓝ | gf | obsidian.util.gf_passthrough() | [G]oto markdown [F]ile |
| Ⓝ | Enter | obsidian.util.smart_action() | Obsidian smart action |
| Ⓝ | Tab | require('obsidian.api').nav_link 'next' | Go to next link |
| Ⓝ | Shift + Tab | require('obsidian.api').nav_link 'prev' | Go to previous link |
Lspsaga.nvim
| Mode | Key | Action | Description |
|---|---|---|---|
| Ⓝ | leaderlh | <cmd>Lspsaga hover_doc<CR> | [L]sp [H]over Doc |
| Ⓝ | leaderlR | <cmd>Lspsaga rename<CR> | [L]sp [R]ename |
| Ⓝ | leaderld | <cmd>Lspsaga peek_definition<CR> | [L]sp Peek [D]efinition |
| Ⓝ | leader[d | <cmd>Lspsaga diagnostic_jump_prev<CR> | [D]iagnostic next |
| Ⓝ | leader]d | <cmd>Lspsaga diagnostic_jump_next<CR> | [D]iagnostic prev |
| Ⓝ | gd | <cmd>Lspsaga goto_definition<CR> | [G]oto [D]efinition |
| Ⓝ | leaderlr | require('fzf-lua').lsp_references() | [L]sp Peek [R]eferences |
| Ⓝ | leaderle | lua vim.diagnostic.open_float() | [L]sp Diagnostic Float [E] |
Winshift.nvim and Windows
| Mode | Key | Action | Description |
|---|---|---|---|
| Ⓝ | Ctrl + Wm | <Cmd>WinShift<CR> | Toggle WinShift mode |
| Ⓝ | Ctrl + Alt + h | <cmd>WinShift left<CR> | Move window left [h] |
| Ⓝ | Ctrl + Alt + j | <cmd>WinShift down<CR> | Move window down [j] |
| Ⓝ | Ctrl + Alt + k | <cmd>WinShift up<CR> | Move window up [k] |
| Ⓝ | Ctrl + Alt + l | <cmd>WinShift right<CR> | Move window right [l] |
| Ⓝ | Alt + h | <C-w>h | Moving to the window left [h] |
| Ⓝ | Alt + j | <C-w>j | Moving to the window down [j] |
| Ⓝ | Alt + k | <C-w>k | Moving to the window up [k] |
| Ⓝ | Alt + l | <C-w>l | Moving to the window right [l] |
| Ⓝ | Alt + = | <C-w>+ | Resize window + (increase horizontal) |
| Ⓝ | Alt + - | <C-w>- | Resize window - (decrease horizontal) |
| Ⓝ | Alt + . | <C-w>< | Resize window < (increase vertical) |
| Ⓝ | Alt + , | <C-w>> | Resize window > (decrease vertical) |
Harpoon.nvim
| Mode | Key | Action | Description |
|---|---|---|---|
| Ⓝ | leadera | harpoon:list():add() | Harpoon [A]dd file |
| Ⓝ | leaderE | harpoon.ui:toggle_quick_menu(harpoon:list()) | Harpoon m[E]nu |
| Ⓝ | Ctrl + h | harpoon:list():select(1) | Harpoon select 1 |
| Ⓝ | Ctrl + j | harpoon:list():select(2) | Harpoon select 2 |
| Ⓝ | Ctrl + k | harpoon:list():select(3) | Harpoon select 3 |
| Ⓝ | Ctrl + l | harpoon:list():select(4) | Harpoon select 4 |
| Ⓝ | Alt + i | harpoon:list():prev() | Harpoon goto prev |
| Ⓝ | Alt + o | harpoon:list():next() | Harpoon goto next |
Neo-Tree.nvim
| Mode | Key | Action | Description |
|---|---|---|---|
| Ⓝ | leaderef | Neotree toggle float | Open Neo-Tree [E]xplorer [F]loating |
| Ⓝ | leaderer | Neotree toggle position=right | Open Neo-Tree [E]xplorer on the [R]ight |
LSPConfig
| Mode | Key | Action | Description |
|---|---|---|---|
| Ⓝ,Ⓥ | leaderca | require('fzf-lua').lsp_code_actions() | [C]ode [A]ctions |
| Ⓝ,Ⓥ | leaderll | <cmd>LspRestart<CR> | [L][L]sp Restart |
| Ⓝ | leaderli | require('fzf-lua').lsp_implementations() | [L]sp [I]mplimentations |
Emmet
| Mode | Key | Action | Description |
|---|---|---|---|
| Ⓝ,Ⓥ | leaderwe | require('nvim-emmet').wrap_with_abbreviation | [W]rap [E]lement |
Plugins are organized into categories under plugins/enabled/. Each category contains individual .lua files for plugin configs.
| Category | Plugin | Repo | Description |
|---|---|---|---|
| Appearance | colorizer | NvChad/nvim-colorizer.lua | High-performance color highlighter for code. |
| Appearance | dressing | stevearc/dressing.nvim | Improves default vim.ui interfaces like input and select. |
| Appearance | incline | b0o/incline.nvim | Floating statuslines for windows (winbar alternative). |
| Appearance | mini-starter | echasnovski/mini.nvim | Minimalistic start screen module. |
| Appearance | mini-statusline | echasnovski/mini.nvim | Configurable, compact or fancy statusline. |
| Appearance | render-markdown | MeanderingProgrammer/render-markdown.nvim | Improves viewing Markdown files in Neovim. |
| Appearance | rosepine | rose-pine/neovim | Soho vibes colorscheme for Neovim. |
| Cmp | blink-cmp | Saghen/blink.cmp | Performant, batteries-included completion plugin. |
| LSP | debug | mfussenegger/nvim-dap | Debug Adapter Protocol client implementation. |
| LSP | lazydev | folke/lazydev.nvim | Faster LuaLS setup for editing Neovim configs. |
| LSP | lspconfig | neovim/nvim-lspconfig | Quickstart configs for Nvim LSP. |
| LSP | lspsaga | nvimdev/lspsaga.nvim | Lightweight LSP plugin with performant UI. |
| LSP | mason | mason-org/mason.nvim | Portable package manager for installing LSP servers, linters, etc. |
| Formatting | conform | stevearc/conform.nvim | Lightweight yet powerful formatter plugin. |
| Formatting | lint | mfussenegger/nvim-lint | Asynchronous linter plugin. |
| Syntax | emmet | olrtg/nvim-emmet | Emmet abbreviation and expansion for Neovim. |
| Syntax | nvim-treesitter | nvim-treesitter/nvim-treesitter | Treesitter configurations and abstraction layer. |
| Syntax | tailwind-tools | luckasRanarison/tailwind-tools.nvim | Unofficial Tailwind CSS integration and tooling. |
| Syntax | ts-autotag | windwp/nvim-ts-autotag | Uses Treesitter to auto-close and rename tags. |
| Syntax | typescript-tools | pmizio/typescript-tools.nvim | TypeScript integration with LSP features. |
| Editing | autopairs | windwp/nvim-autopairs | Autopairs written in Lua. |
| Editing | bullets | bullets-vim/bullets.vim | Automated bullet and numbered lists for Markdown. |
| Editing | comment | numToStr/Comment.nvim | Smart and powerful commenting. |
| Editing | refactoring | ThePrimeagen/refactoring.nvim | Refactoring library based on Martin Fowler's book. |
| Editing | sleuth | tpope/vim-sleuth | Heuristically sets shiftwidth and expandtab. |
| Editing | todo-comments | folke/todo-comments.nvim | Highlights and searches TODO comments. |
| Navigation | flash | folke/flash.nvim | Enhances search with labels for quick jumps. |
| Navigation | fzf | ibhagwan/fzf-lua | Improved fzf.vim written in Lua. |
| Navigation | harpoon | ThePrimeagen/harpoon | Per-project marks for fast file navigation. |
| Navigation | neo-tree | nvim-neo-tree/neo-tree.nvim | File system and tree-like structure manager. |
| Navigation | snacks | folke/snacks.nvim | Collection of lightweight Neovim plugins. |
| Navigation | trouble | folke/trouble.nvim | Pretty diagnostics, references, and lists. |
| Navigation | which-key | folke/which-key.nvim | Displays possible keybindings in popup. |
| Navigation | winshift | sindrets/winshift.nvim | Rearranges windows with ease. |
| Git | gitsigns | lewis6991/gitsigns.nvim | Git integration with signs for changes. |
| Productivity | cord | vyfor/cord.nvim | Discord Rich Presence for Neovim. |
| Productivity | img-clip | HakonHarnes/img-clip.nvim | Effortlessly embeds images into markup. |
| Productivity | obsidian | epwalsh/obsidian.nvim | Obsidian vault integration for notes. |
| Productivity | wakatime | wakatime/vim-wakatime | Automatic time tracking for coding. |
| Mini | mini-surround | echasnovski/mini.nvim | Fast and feature-rich surround actions. |
| Mini | mini-ai | echasnovski/mini.nvim | Extends and creates a/i textobjects. |
| Mini | mini-icons | echasnovski/mini.nvim | Icon provider with caching and customization. |
| Mini | mini-pairs | echasnovski/mini.nvim | Minimal and fast autopair module. |
| Mini | mini-indentscope | echasnovski/mini.nvim | Visualizes and operates on indent scopes. |
| Mini | mini-cursorword | echasnovski/mini.nvim | Auto-highlights word under cursor. |
Feel free to fork and submit pull requests for improvements, bug fixes, or new features.
MIT License - see LICENSE for details.








