Skip to content

knmac/knvim

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

KNVIM

Neovim Lua

K-nvim or kn-vim, personal attempt to config Neovim and a pun on my username knmac.

1. Demo

Video demo with clickable lualine:

demo3

Config structure and cheat sheet (rendered):

demo1

Editing a python file, with LSP, Tree-sitter, and outline support:

demo2

2. Feature highlights

  • 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!!!

3. Content

3.1. Configured servers

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

3.2. Config structure

init.lua
lua/
├── core/
│  ├── auto_commands.lua
│  ├── init.lua
│  ├── keymaps.lua
│  └── settings.lua
└── plugins/
   ├── coding/
   │  ├── blink.lua
   │  ├── cmp.lua
   │  ├── dap.lua
   │  ├── linter-formatter.lua
   │  ├── lspconfig-mason.lua
   │  ├── neogen.lua
   │  ├── neotest.lua
   │  └── treesitter.lua
   ├── experimentals/
   │  └── ...
   ├── ui/
   │  ├── barbar.lua
   │  ├── catppuccin.lua
   │  ├── dropbar.lua
   │  ├── illuminate.lua
   │  ├── lualine.lua
   │  ├── noice.lua
   │  └── winsep.lua
   ├── utils/
   │  ├── diffview.lua
   │  ├── easy-align.lua
   │  ├── gitsigns.lua
   │  ├── leap.lua
   │  ├── matchup.lua
   │  ├── neo-tree.lua
   │  ├── nvim-colorizer.lua
   │  ├── oil.lua
   │  ├── outline.lua
   │  ├── persisted.lua
   │  ├── remote-nvim.lua
   │  ├── renderer-markdown-obsidian.lua
   │  ├── snacks.lua
   │  ├── swenv.lua
   │  ├── telescope.lua
   │  ├── todo-comments.lua
   │  └── which-key.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", },

4. Manual installation

4.1. Dependencies

The following dependencies are for manual installation.

Optional dependencies:

  • Python packages pynvim and neovim (installable with pip install pynvim neovim).
  • LazyGit for quick git management from Snacks.nvim.
  • A virtual environment (conda or pyenv) with the name knvim.

4.2. Installation

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"

Notes: Knvim will try to find the default python interpreter. But it is recommended to create a virtual environment using conda or pyenv with the name knvim to sandbox your package installation. For more information, see the variable vim.g.python3_host_prog in knvim/init.lua and knvim/core/setting.lua.

4.3. Removing knvim

Simply delete the two directories $HOME/.config/knvim and $HOME/.local/share/knvim. You can also remove your virtual environment if you set up one.

5. Installation using nvim-lazyman

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.

6. Knvim Cheatsheet

Cheat sheet for knvim can be found here. You can also access cheat sheet from the start page.

7. Extra configs (optional)

This section shows you how to set up extra configuration for knvim to work as you want (completely optional).

7.1. Ruff (Python linter and formatter)

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.

7.2. DAP (Debugging tool)

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",
      "cwd": "${workspaceFolder}",
      "repl_lang": "javascript",
      "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. If you want to specify a file for a launch instead of the current file, you can also set cwd as ${workspaceFolder}/path/to/the/file. For more information, visit here.

7.3. Diffview (Intergate Diffview to git mergetool automatically)

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"

7.4. Marksman (LSP server for markdown)

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"

8. FAQs

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 markdown correctly (using markdown preview)?

A3: This is mostly how the terminal is configured. I find Ghostty supports most of the features out-of-the box. For WezTerm, some features need additional setup. 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

Q4: Image rendering in Knvim?

A4: Image rendering is partially tested with Ghostty and WezTerm terminals. You can try the experimental config plugins.experimental.image. I do not turn this feature on by default as I find it substantially slows down my workflow.

9. TODO

  • Automatically copy knvim to server for remote editing.
  • Image rendering (partially tested).
  • Automatically switch path separator and EOL character, depending on the OS (Linux/MacOS/Windows). This will not be considered in the short run because I do not have a Windows machine to test :)

About

Config for Neovim

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages