Cross-platform C++ IDE in Neovim. CMake-first. Targets Android, iOS, Linux, Windows, macOS.
brew install neovim git cmake ninja fzf fd ripgrep lazygit
git clone https://github.com/e-gleba/nvim-config.git ~/.config/nvim
nvimsudo apt update && sudo apt install -y neovim git cmake ninja-build fzf fd-find ripgrep
# lazygit: https://github.com/jesseduffield/lazygit#ubuntu
git clone https://github.com/e-gleba/nvim-config.git ~/.config/nvim
nvim# tools
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
scoop install neovim git cmake ninja llvm fzf fd ripgrep lazygit
# env (run once)
[Environment]::SetEnvironmentVariable(\"LLDB_USE_NATIVE_PDB_READER\", \"1\", \"User\")
git config --global core.autocrlf false
git config --global core.eol lf
# config
git clone https://github.com/e-gleba/nvim-config.git $env:LOCALAPPDATA\\\\nvim
nvimDo not install Neovim nightly on macOS — it causes file-reload freezes. See LazyVim #1581.
docker run -it --rm \\
-v $(pwd):/workspace \\
-v ~/.config/nvim:/root/.config/nvim \\
ghcr.io/e-gleba/nvim-config/nvim-ci:latestnvim --headless -V1 -c 'checkhealth' -c 'qa' # verify
nvim --headless \"+Lazy! sync\" +qa # force sync| Workflow | Trigger | Result |
|---|---|---|
| Lint | Push / PR on lua/**, init.lua, lockfiles |
Pulls ghcr.io/.../nvim-ci:latest and runs stylua --check. Falls back to local build if image is absent. |
| Publish Docker | Manual dispatch, or push to main with Dockerfile changes |
Builds and pushes ghcr.io/.../nvim-ci:latest. |
| Release | Manual dispatch with version tag | Creates GitHub Release with auto-generated notes, then builds and pushes a tagged Docker image (v1.2.3). |
Work on your laptop, build on a remote Mac or WSL box:
- Remote Development Master Guide — SSH setup, cross-platform matrix, tmux + Neovim persistent sessions, Tailscale fallback, and troubleshooting
~/.config/nvim
├── init.lua
├── lazy-lock.json
├── lazyvim.json
├── stylua.toml
├── .luarc.json
├── .gitattributes
├── license.md
├── readme.md
└── lua/
├── config/
│ ├── autocmds.lua
│ ├── keymaps.lua
│ ├── lazy.lua
│ └── options.lua
└── plugins/
├── android.lua
├── clangd.lua
├── cmake.lua
├── colortheme.lua
├── dap_ui.lua
├── format.lua
├── godbolt.lua
├── jira.lua
├── mason_tools.lua
├── neogen.lua
├── neotest.lua
├── overseer.lua
├── snacks.lua
├── treesj.lua
└── web_search.lua
| Action | Key |
|---|---|
| Build (CMake) | <leader>cb |
| Run | <leader>cr |
| Debug breakpoint | <leader>db |
| Debug continue | <leader>dc |
| Format | <leader>cf |
| Hover | K |
| Rename | <leader>cr |
| Test nearest | <leader>tt |
| AI search (Scira) | <leader>ss |
| GitHub search | <leader>sH |
| StackOverflow | <leader>sO |
| cppreference | <leader>sR |
| Web search picker | <leader>sW |
| Jira board (if configured) | <leader>jj |
| Jira issue info (if configured) | <leader>ji |
On git commit, if your branch name contains a Jira-style key (e.g. feature/PROJ-123-fix), the commit buffer is auto-prepended with PROJ-123: . Cursor lands right after the colon — no auth, no API, works offline.
Supported branch patterns:
feature/PROJ-123-description
bugfix/PROJ-456-fix
PROJ-789-quick-patch
Set env vars before launching Neovim:
export JIRA_DOMAIN=yourcompany.atlassian.net
export JIRA_USER=your-email@company.com
export JIRA_API_TOKEN=your-api-tokenGet your API token: id.atlassian.com → Security → API tokens.
Then inside Neovim:
:Jira auth login -- authenticate
:Jira <PROJECT_KEY> -- open sprint board
:Jira info <ISSUE_KEY> -- view issue details
:Jira create <PROJECT_KEY> -- create new issue| Keymap | Action |
|---|---|
<leader>jj |
Open Jira board for project |
<leader>ji |
View current issue info |
Plugin only loads when JIRA_DOMAIN is present; otherwise it stays invisible and costs zero startup time.
clangd needs compile_commands.json at project root:
ln -s build/compile_commands.json compile_commands.jsonOr in CMakeLists.txt:
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)This config uses cmake-tools.nvim with native CMake Presets support.