K-nvim or kn-vim, personal attempt to config Neovim and a pun on my username knmac.
Video demo with clickable lualine:
Config structure and cheatsheet (rendered):
Editing a python file, with LSP, Tree-sitter, and outline support:
- Targeting python, bash, latex, markdown, and (some) C/C++ usage.
- Lualine is configured to be (mostly) clickable. (Toggle with the command
:ToggleClickableLualine
). - Key-bindings that (hopefully) make sense.
- Fun (for me) to use!!!
Language | Name | Category |
---|---|---|
Python | pyright | LSP |
ruff_lsp | Linter/Formatter | |
debugpy | DAP | |
Bash | bashls | LSP |
shellcheck | Linter | |
C/C++ | clangd | LSP |
cpplint | Linter | |
codelldb | DAP | |
Vimscript | vim_ls | LSP |
Lua | lua_ls | LSP |
LaTex | texlab | LSP |
Markdown | marksman | LSP |
prettier | LSP | |
YAML | yamlls | LSP |
prettier | Formatter | |
Typescript/Javascript | tsserver | LSP |
prettier | Formatter | |
HTML/CSS/Json | prettier | Formatter |
init.lua
lua/
├── core/
│ ├── auto_commands.lua
│ ├── init.lua
│ ├── keymaps.lua
│ └── settings.lua
└── plugins/
├── coding/
│ ├── cmp.lua
│ ├── dap.lua
│ ├── linter-formatter.lua
│ ├── lspconfig-mason.lua
│ ├── metals.lua
│ ├── neotest.lua
│ └── treesitter.lua
├── experimentals/
│ └── ...
├── ui/
│ ├── alpha.lua
│ ├── barbar.lua
│ ├── catppuccin.lua
│ ├── fold.lua
│ ├── illuminate.lua
│ ├── indentblankline-rainbow.lua
│ ├── lualine.lua
│ ├── navic-barbecue.lua
│ ├── noice-notify.lua
│ └── winsep.lua
├── utils/
│ ├── diffview.lua
│ ├── easy-align.lua
│ ├── gitsigns.lua
│ ├── leap.lua
│ ├── matchup.lua
│ ├── neo-tree.lua
│ ├── nvim-colorizer.lua
│ ├── obsidian.lua
│ ├── swenv.lua
│ ├── outline.lua
│ ├── remote-nvim.lua
│ ├── telescope.lua
│ ├── todo-comments.lua
│ ├── toggleterm.lua
│ ├── which-key.lua
│ ├── yazi.lua
│ └── zen-mode.lua
└── init.lua
The configs in experimentals/
directories are not activated by default. To use them, uncomment the following line in lua/plugins/init.lua
:
{ import = "plugins.experimentals", },
If you want to try individual experimental plugins instead of the all of them, uncomment a specific plugins, e.g.,
{ import = "plugins.experimentals.neorg", },
{ import = "plugins.experimentals.remote-nvim", },
The following dependencies are for manual installation.
- Neovim 0.10.0+. Follow the installation guide on Neovim's homepage. This repo is just holding the config.
- A nerdfont for the glyphs and a terminal that supports the font (the screenshots use WezTerm and its baked-in JetBrains Mono font).
- npm for mason.nvim (package manager for LSPs, DAPs, linters, and formaters).
- rg and fd for telescope.nvim (fuzzy finder).
- (Optional) Python packages
pynvim
,neovim
, andpylatexenc
(installable withpip
). - (Optional) Yazi for file browser.
- (Optional) LazyGit for quick git management from ToggleTerm.
Clone this repo to $HOME/.config
:
git clone https://github.com/knmac/knvim.git $HOME/.config/knvim
Then add this command to .bashrc
or .zshrc
.
export NVIM_APPNAME="knvim"
Simply delete the two directories $HOME/.config/knvim
and $HOME/.local/share/knvim
.
Nvim-lazyman is a configuration manager that supports popular Neovim configurations. After installing nvim-lazyman
, run the following command to install knvim:
lazyman -L Knvim
Follow instructions from nvim-lazyman for details about installation, bootstrapping, and other cool features.
Cheatsheet for knvim can be found here. You can also access cheatsheet from the start page.
This section shows you how to set up extra configuration for knvim to work as you want (completely optional).
Create the file pyproject.toml
for each Python project, where the content looks something like this:
[tool.ruff]
line-length = 110
[tool.ruff.lint]
# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.
select = ["E", "F"]
# Avoid enforcing line-length violations (`E501`)
ignore = ["E501"]
[tool.ruff.format]
# Use double quotes for strings.
quote-style = "double"
# Indent with spaces, rather than tabs.
indent-style = "space"
For more information, visit here and here.
Create the file .vscode/launch.json
for each project, where the content looks something like this:
{
"version": "0.2.0",
"configurations": [
{
"type": "python",
"request": "launch",
"name": "NAME OF THE LAUNCH",
"program": "${file}",
"console": "integratedTerminal",
"args": ["ARG1", "ARG2", ...]
}
]
}
The above config uses Python as an example, but you can setup debugger for other languages similarly. The template for Python launcher can be generated with ,g
. For more information, visit here.
Create the file ~/.gitconfig
globally, where the content looks something like this:
[merge]
tool = nvim
[mergetool]
keepBackup = false
prompt = false
[mergetool "nvim"]
cmd = "nvim -d -c \"wincmd l\" -c \"norm ]c\" \"$LOCAL\" \"$MERGED\" \"$REMOTE\" -c DiffviewOpen"
Create the file .marksman.toml
for each project, where the (default) content looks something like this:
[core]
markdown.file_extensions = ["md", "markdown"]
text_sync = "full"
incremental_references = false
paranoid = false
[code_action]
toc.enable = true
create_missing_file.enable = true
[completion]
wiki.style = "title-slug"
Q1: Why knvim is not working on Windows?
A1: knvim config targets Unix-based OS (e.g., Linux and MacOS) and is not fully tested on Windows. Some common problems include different path separator (/
on Unix vs \
on Windows) and EOL character (LF
on Unix and CR LF
on Windows). You may want to change these characters manually if you want to try knvim on Windows machines.
Q2: Why knvim does not include <this and that> by default?
A2: knvim is my personal config of Neovim, so it does not cover a wide range of different use cases. You are more than welcome (and recommended) to fork and customize knvim to your personal liking. That said, I will try to add some configs if they are commonly used. Cheers!
Q3: Why knvim does not render <this and that>?
A3: This is mostly how the terminal is configured. Here are some example use-cases (tested on Wezterm). Please inspect the code carefully before running.
- Rendering undercurl ref:
tempfile=$(mktemp) \
&& curl -o "$tempfile https://raw.githubusercontent.com/wez/wezterm/master/termwiz/data/wezterm.terminfo" \
&& tic -x -o ~/.terminfo "$tempfile" \
&& rm "$tempfile"
- Rendering strikethrough ref:
infocmp "$TERM" > myterm.info
nvim myterm.info # add smxx=\E[9m, rmxx=\E[29m,
tic -x myterm.info
-
Automaticallycopy knvim to server for remote editing. - Image rendering (may only support Kitty and WezTerm terminal). You can try the experimental config
plugins.experimental.image
. - Automatically switch path separator and EOL character, depending on the OS in use.
- Support python environment manager
poetry
.