adibhanna/nvim

github github
stars 665
issues 1
subscribers 14
forks 57
CREATED

UPDATED


Neovim Configuration

A minimal, fast Neovim configuration for Neovim 0.11+ with lazy-loading, LSP support, and intuitive keybindings.


Installation

1. System Dependencies (Required)

# Core requirements
brew install neovim    # v0.11+ required
brew install git
brew install ripgrep   # Fast grep (used by picker)
brew install fd        # Fast find (used by picker)
brew install lazygit   # Git TUI
brew install node      # Required for some LSPs and tools
brew install npm       # Required for markdown-preview

2. Fonts (Required)

Install a Nerd Font for icons:

brew install --cask font-jetbrains-mono-nerd-font
# or
brew install --cask font-fira-code-nerd-font

Then set your terminal to use the installed font.

3. Language Toolchains (Install what you need)

# Go
brew install go
# After install, run :GoInstallBinaries in nvim

# Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# After install, run :CargoInstallTools in nvim

# Zig
brew install zig

# Python
brew install python
pip install pynvim  # Optional: for some plugins

# PHP
brew install php composer

# Lua (for luarocks, optional)
brew install lua luarocks

4. Optional Dependencies

# Markdown preview (browser-based)
# markdown-preview.nvim will auto-install, but needs npm

# Image rendering (optional)
brew install imagemagick ghostscript

# Mermaid diagrams (optional)
npm install -g @mermaid-js/mermaid-cli

# LaTeX rendering (optional)
brew install tectonic

5. Clone and Start

# Backup existing config
mv ~/.config/nvim ~/.config/nvim.bak
mv ~/.local/share/nvim ~/.local/share/nvim.bak
mv ~/.local/state/nvim ~/.local/state/nvim.bak
mv ~/.cache/nvim ~/.cache/nvim.bak

# Clone this config
git clone <your-repo> ~/.config/nvim

# Start Neovim - plugins will auto-install on first launch
nvim

6. Post-Install Steps

Run these commands in Neovim after first launch:

" Wait for lazy.nvim to finish installing plugins, then:

" Generate help tags
:helptags ALL

" Install treesitter parsers (auto-installs, but can force)
:TSUpdate

" Check health
:checkhealth

" For Go development
:GoInstallBinaries

" For Rust development  
:CargoInstallTools

" Build markdown-preview (if not auto-built)
:Lazy build markdown-preview.nvim

Verify Installation

:checkhealth

All checks should pass. Common fixes:

  • Missing CLI tools: brew install <tool>
  • Treesitter errors: :TSUpdate
  • LSP not working: :LspInfo and :Mason

What Gets Auto-Installed

Via Mason (LSP/Linters/Formatters)

Category Tools
LSP Servers lua_ls, gopls, zls, ts_ls, rust-analyzer, intelephense, bashls, pyright, cssls, html, jsonls, yamlls
Linters eslint_d, luacheck, golangci-lint, shellcheck, markdownlint, yamllint, jsonlint, htmlhint, stylelint, phpstan, ruff, mypy
Formatters stylua, goimports, prettier, black, isort, shfmt, pint

Via Treesitter

Parsers for: bash, c, css, go, html, javascript, json, latex, lua, markdown, php, python, rust, scss, svelte, terraform, tsx, typescript, vim, vue, yaml, zig


Structure

~/.config/nvim/
├── init.lua                 # Entry point
├── lua/
│   ├── core/
│   │   ├── init.lua         # Loads all core modules
│   │   ├── options.lua      # Neovim options
│   │   ├── keymaps.lua      # Core keybindings
│   │   ├── autocmds.lua     # Auto commands
│   │   ├── lazy.lua         # Plugin manager bootstrap
│   │   └── utils.lua        # Utility functions
│   └── plugins/
│       ├── coding.lua       # Completion, treesitter
│       ├── colorschemes.lua # Themes
│       ├── editor.lua       # Flash, mini.nvim, persistence
│       ├── formatting.lua   # Conform.nvim (format on save)
│       ├── git.lua          # Gitsigns, fugitive, diffview
│       ├── linting.lua      # nvim-lint
│       ├── lsp.lua          # LSP + Mason
│       ├── snacks.lua       # Picker, explorer, notifications
│       ├── tools.lua        # Notes, file creation
│       └── ui.lua           # Which-key, trouble, markdown
├── ftplugin/
│   ├── go.lua               # Go commands (:GoTest, :GoBuild, etc.)
│   ├── rust.lua             # Rust commands (:CargoRun, :CargoTest, etc.)
│   └── zig.lua              # Zig commands (:ZigBuild, :ZigTest, etc.)
└── doc/
    ├── go.txt               # :help go.txt
    ├── rust.txt             # :help rust.txt
    └── zig.txt              # :help zig.txt

Keybindings

Leader key: <Space>

Essential (No Prefix)

Key Action
<C-s> Save file
<C-h/j/k/l> Navigate windows
<C-Up/Down/Left/Right> Resize windows
<Esc> Clear search highlight
jj / jk Exit insert mode
H / L Start/End of line
<S-h> / <S-l> Prev/Next buffer
Q Delete buffer
K Hover documentation
s Flash jump
S Flash treesitter

Quick Access (Leader)

Key Action
<leader><space> Find files
<leader>/ Grep
<leader>, Switch buffer
<leader>. Scratch buffer
<leader>e File explorer
<leader>q Quit
<leader>Q Quit all
<leader>? Buffer keymaps
<leader>K All keymaps
<C-/> Terminal

Buffers (<leader>b)

Key Action
<leader>bb Switch buffer
<leader>bd Delete buffer
<leader>bo Delete other buffers

Code (<leader>c)

Key Action
<leader>ca Code action
<leader>cr Rename symbol
<leader>cd Line diagnostic
<leader>cf Format
<leader>cv Definition in vsplit

Diagnostics (<leader>d)

Key Action
<leader>dd Workspace diagnostics
<leader>db Buffer diagnostics
<leader>dt Trouble (workspace)
<leader>dT Trouble (buffer)
<leader>dq Quickfix list
<leader>dl Location list

Files (<leader>f)

Key Action
<leader>ff Find files
<leader>fr Recent files
<leader>fc Config files
<leader>fg Git files
<leader>fp Projects
<leader>fR Rename file

Git (<leader>g)

Key Action
<leader>gg Lazygit
<leader>gs Status
<leader>gl Log
<leader>gL Log (line)
<leader>gf Log (file)
<leader>gd Diff (picker)
<leader>gD Diff HEAD
<leader>gc Checkout branch
<leader>go Open in browser
<leader>gb Blame line
<leader>gB Blame buffer
<leader>gR Reset buffer
<leader>gS Stage buffer
<leader>gi GitHub issues
<leader>gp GitHub PRs

Git Hunks (<leader>gh)

Key Action
<leader>ghp Preview hunk
<leader>ghP Preview hunk inline
<leader>ghs Stage hunk
<leader>ghu Undo stage hunk
<leader>ghr Reset hunk
]h / [h Next/Prev hunk

LSP (<leader>l)

Key Action
<leader>ls Document symbols
<leader>lS Workspace symbols
<leader>li LSP info
<leader>lr LSP restart
<leader>lh Toggle inlay hints
<leader>lt References (Trouble)
<leader>lT Symbols (Trouble)

Markdown (<leader>m)

Key Action
<leader>mp Preview in browser
<leader>mr Toggle render in buffer

Notifications (<leader>n)

Key Action
<leader>nn Notification history
<leader>nd Dismiss all

Search (<leader>s)

Key Action
<leader>sg Grep
<leader>sw Word under cursor
<leader>sb Buffer lines
<leader>sB Grep buffers
<leader>sh Help
<leader>sm Marks
<leader>sj Jumps
<leader>sk Keymaps
<leader>sc Commands
<leader>s: Command history
<leader>s/ Search history
<leader>sr Registers
<leader>sR Resume last
<leader>su Undo history

UI/Toggles (<leader>u)

Key Action
<leader>us Toggle spelling
<leader>uw Toggle wrap
<leader>ur Toggle relative numbers
<leader>ul Toggle line numbers
<leader>uD Toggle diagnostics
<leader>uc Toggle conceal
<leader>uT Toggle treesitter
<leader>ub Toggle background
<leader>uh Toggle inlay hints
<leader>ui Toggle indent guides
<leader>ud Toggle dim
<leader>uC Colorschemes
<leader>uz Zen mode
<leader>uZ Zoom

Windows (<leader>w)

Key Action
<leader>wd Close window
<leader>ws Split horizontal
<leader>wv Split vertical
<leader>ww Other window
<leader>w= Equal size
<leader>wm Maximize

Goto (g)

Key Action
gd Definition
gD Declaration
gr References
gi Implementation
gy Type definition

Navigation ([ / ])

Key Action
[d / ]d Prev/Next diagnostic
[h / ]h Prev/Next hunk
[b / ]b Prev/Next buffer
[[ / ]] Prev/Next reference

Editing

Key Mode Action
J / K Visual Move lines down/up
< / > Visual Indent (stay selected)
p Visual Paste (no yank)
X Normal Split line
YY Normal Yank block {}
n / N Normal Next/Prev match (centered)

Surround (mini.surround)

Key Action
gsa Add surrounding
gsd Delete surrounding
gsr Replace surrounding
gsf Find surrounding (right)
gsF Find surrounding (left)

Language-Specific Commands

Go (:help go.txt)

Command Action
:GoBuild go build
:GoRun go run
:GoTest go test
:GoTestFunc Test function under cursor
:GoTestFile Test current package
:GoCoverage Test with coverage
:GoModTidy go mod tidy
:GoGet <pkg> go get
:GoVet go vet
:GoLint golangci-lint
:GoDoc <sym> go doc
:GoImpl Generate interface stubs
:GoIfErr Insert if err != nil
:GoAddTags Add struct tags
:GoAlt Switch test/source
:GoInstallBinaries Install all Go tools

Rust (:help rust.txt)

Command Action
:CargoBuild cargo build
:CargoBuildRelease cargo build --release
:CargoRun cargo run
:CargoTest cargo test
:CargoTestFunc Test function under cursor
:CargoCheck cargo check
:CargoClippy cargo clippy
:CargoFmt cargo fmt
:CargoAdd <crate> cargo add
:CargoDoc cargo doc
:RustDoc <crate> Open docs.rs
:CargoInstallTools Install cargo subcommands

Zig (:help zig.txt)

Command Action
:ZigBuild zig build
:ZigBuildRelease zig build -Doptimize=ReleaseFast
:ZigRun zig build run
:ZigRunFile zig run
:ZigTest zig build test
:ZigTestFile zig test
:ZigFmt zig fmt
:ZigDoc Open Zig docs
:ZigAlt Switch test/source

Language Servers (Mason)

Auto-installed:

  • Go: gopls
  • Rust: rust-analyzer
  • Zig: zls
  • Lua: lua_ls
  • TypeScript: ts_ls
  • Python: pyright
  • PHP: intelephense
  • Bash: bashls
  • CSS/HTML/JSON/YAML: vscode servers

Formatters (Conform)

Language Formatter
Go goimports, gofmt
Rust rustfmt
Zig zigfmt
Lua stylua
JS/TS/JSON/YAML/HTML/CSS prettier
Python isort, black
PHP pint
Shell shfmt

Format on save is enabled by default.

Linters (nvim-lint)

Language Linter
Go golangci-lint
JS/TS eslint_d
Lua luacheck
Python ruff, mypy
PHP phpstan
Shell shellcheck

Health Check

:checkhealth

Common fixes:

  • Missing tools: brew install <tool>
  • Treesitter errors: :TSUpdate
  • Go tools: :GoInstallBinaries
  • Rust tools: :CargoInstallTools

Colorscheme

Default: yukinord

Switch with <leader>uC


Always a WIP.