Rafael Bodill's Neo/vim Config
Lean mean Neo/vim machine, 30-45ms startup time.
Best with Neovim or Vim8 and python3 enabled.
I encourage you to fork this repo and create your own experience.
Learn how to tweak and change Neo/vim to the way YOU like it.
This is my cultivation of years of tweaking, use it as a git remote
and stay in-touch with upstream for reference or cherry-picking.
Table of Contents
(π Click to expand/collapse)
Features
- Fast startup time
- Robust, yet light-weight
- Lazy-load 95% of plugins with Shougo/dein.vim
- Custom side-menu (try it out! Space+l)
- Custom context-menu (try it! ;+c)
- Modular configuration (see structure)
- Auto-complete prabirshrestha/asyncomplete.vim extensive setup
- Shougo/denite.nvim centric work-flow (lists)
- Structure view with liuchengxu/vista.vim
- Open SCM detailed URL in OS browser
- Light-weight but informative status/tabline
- Easy customizable theme
- Premium color-schemes
- Central location for tags and sessions
Screenshot

Prerequisites
- Python 3 (
brew install python)
- Neovim or Vim (
brew install neovim and/or brew install vim)
Install
1. Let's clone this repo! Clone to ~/.config/nvim,
we'll also symlink it for regular Vim:
mkdir ~/.config
git clone git://github.com/rafi/vim-config.git ~/.config/nvim
cd ~/.config/nvim
ln -s ~/.config/nvim ~/.vim # For "regular" Vim
- Note: If you set a custom
$XDG_CONFIG_HOME,
use that instead of ~/.config in the commands above.
Neovim follows the XDG base-directories convention, Vim doesn't.
2. Install the Python 3 pynvim library. This is also needed for Vim 8
if you want to use Denite and Defx.
Neovim: ./venvs.sh or pip3 install --user pynvim
Vim: pip3 install --user pynvim
3. Run make test to test your nvim/vim version and capabilities.
4. Run make to install all plugins.
5. If you are experiencing problems, run and read nvim -c checkhealth
Test Python 3 availability with :py3 print(sys.version_info)
Enjoy! π
Language-Server Protocol (LSP)
To leverage LSP auto-completions and other functionalities, once you open a
file in Neo/vim, run :LspInstallServer to use mattn/vim-lsp-settings
installation feature.
Upgrade
cd ~/.config/nvim
make update
This will run git pull --ff --ff-only and update all plugins using
Shougo/dein.vim package-manager (:call dein#update()).
Recommended Fonts
On macOS with Homebrew, choose one of the Nerd Fonts,
for example, to install the Hack font:
brew tap homebrew/cask-fonts
brew search nerd-font
brew cask install font-hack-nerd-font
brew cask install font-iosevka-nerd-font-mono
brew cask install font-jetbrains-mono
brew cask install font-fira-code
Recommended Linters
brew install shellcheck jsonlint yamllint tflint ansible-lint
brew install tidy-html5 proselint write-good
yarn global add eslint jshint jsxhint stylelint sass-lint
yarn global add markdownlint-cli raml-cop
pip3 install --user vim-vint pycodestyle pyflakes flake8
Recommended Tools
- ag ggreer/the_silver_searcher
(macOS:
brew install the_silver_searcher)
- Jump around with z: rupa/z
(macOS:
brew install z)
- Universal ctags for syntax tokenization
(macOS:
brew install universal-ctags/universal-ctags/universal-ctags)
- Fuzzy file finders:
fzf,
fzy, or
peco
(macOS:
brew install fzf)
User Custom Config
If you want to add your own configuration, create the config/local.vim file
and add your personal vimscript there. If you'd like to install plugins by
yourself, create a config/local.plugins.yaml file and manage your own plugin
collection.
If you want to disable some of the plugins I use, you can overwrite them, e.g.:
- { repo: dense-analysis/ale, if: 0 }
Structure
Plugin Highlights
- Plugin management with cache and lazy loading for speed
- Auto-completion with Language-Server Protocol (LSP)
- Project-aware tabs and labels
- Defx as file-manager + Git status icons
- Extensive language extensions library
Note that 95% of the plugins are lazy-loaded.
Plugins Included
List (π Click to expand/collapse)
Non Lazy-Loaded Plugins
Lazy-Loaded Plugins
Language
Commands
Interface
Completion & Code-Analysis
Denite
Operators & Text Objects
Custom Key-mappings
Note that,
- Leader key set as Space
- Local-leader set as ; and used for navigation and search
(Denite and Defx)
Key-mappings
(π Click to expand/collapse)
General
| Key |
Mode |
Action |
| Space |
All |
Leader key |
| ; |
All |
Local Leader key |
| β β β β |
Normal |
Resize splits (* Enable g:elite_mode in .vault.vim) |
| ;+c |
Normal |
Open context-menu |
| Space+l |
Normal |
Open side-menu helper |
| Backspace |
Normal |
Match bracket (%) |
| gK |
Normal |
Open Zeal or Dash on some file-types |
| Y |
Normal |
Yank to the end of line (y$) |
| Return |
Normal |
Toggle fold (za) |
| Shift+Return |
Normal |
Focus the current fold by closing all others (zMzvzt) |
| Shift+Return |
Insert |
Start new line from any cursor position (<C-o>o) |
| j / k |
Normal/Visual |
Cursor moves through display-lines (g/jk) |
| Ctrl+f |
Normal |
Smart page forward (C-f/C-d) |
| Ctrl+b |
Normal |
Smart page backwards (C-b/C-u) |
| Ctrl+e |
Normal |
Smart scroll down (3C-e/j) |
| Ctrl+y |
Normal |
Smart scroll up (3C-y/k) |
| Ctrl+q |
Normal |
Remap to Ctrl+w |
| Ctrl+x |
Normal |
Rotate window placement |
| ! |
Normal |
Shortcut for :! |
| << |
Visual |
Indent to left and re-select |
| >> |
Visual |
Indent to right and re-select |
| Tab |
Visual |
Indent to right and re-select |
| Shift+Tab |
Visual |
Indent to left and re-select |
| gh |
Normal |
Show highlight groups for word |
| gp |
Normal |
Select last paste |
| Q |
Normal |
Start/stop macro recording |
| gQ |
Normal |
Play macro 'q' |
| Space+j or k |
Normal/Visual |
Move lines down/up |
| Space+cp |
Normal |
Duplicate paragraph |
| Space+cn / cN |
Normal/Visual |
Change current word in a repeatable manner |
| sg |
Visual |
Replace within selected area |
| Ctrl+a |
Command |
Navigation in command line |
| Ctrl+b |
Command |
Move cursor backward in command line |
| Ctrl+f |
Command |
Move cursor forward in command line |
| Ctrl+r |
Visual |
Replace selection with step-by-step confirmation |
| Ctrl+Shift+q |
Normal |
Exit Vim, confirm unsaved changes |
| Space+cw |
Normal |
Remove all spaces at EOL |
| Space+Space |
Normal |
Enter visual line-mode |
| Space+sl |
Normal |
Load workspace session |
| Space+se |
Normal |
Save current workspace session |
| Space+d |
Normal/Visual |
Duplicate line or selection |
| Space+S |
Normal/Visual |
Source selection |
| Space+ml |
Normal |
Append modeline |
File Operations
| Key |
Mode |
Action |
| Space+cd |
Normal |
Switch to the directory of opened buffer (:lcd %:p:h) |
| Space+w |
Normal/Visual |
Write (:w) |
| Space+y |
Normal |
Copy relative file-path to clipboard |
| Space+Y |
Normal |
Copy absolute file-path to clipboard |
| Ctrl+s |
All |
Write (:w) |
Editor UI
| Key |
Mode |
Action |
| Space+ti |
Normal |
Toggle indentation lines |
| Space+ts |
Normal |
Toggle spell-checker (:setlocal spell!) |
| Space+tn |
Normal |
Toggle line numbers (:setlocal nonumber!) |
| Space+tl |
Normal |
Toggle hidden characters (:setlocal nolist!) |
| Space+th |
Normal |
Toggle highlighted search (:set hlsearch!) |
| Space+tw |
Normal |
Toggle wrap (:setlocal wrap! breakindent!) |
| g1 |
Normal |
Go to first tab (:tabfirst) |
| g9 |
Normal |
Go to last tab (:tablast) |
| g5 |
Normal |
Go to previous tab (:tabprevious) |
| Ctrl+j |
Normal |
Move to split below |
| Ctrl+k |
Normal |
Move to upper split |
| Ctrl+h |
Normal |
Move to left split |
| Ctrl+l |
Normal |
Move to right split |
| * |
Visual |
Search selection forwards |
| # |
Visual |
Search selection backwards |
| ]+c or q |
Normal |
Next on location/quickfix list |
| ]+c or q |
Normal |
Previous on location/quickfix list |
| s+h |
Normal |
Toggle colorscheme background dark/light |
| s+- |
Normal |
Lower colorscheme contrast (Support solarized8) |
| s+= |
Normal |
Raise colorscheme contrast (Support solarized8) |
Window Management
| Key |
Mode |
Action |
| q |
Normal |
Quit window (and Vim, if last window) |
| Ctrl+Tab |
Normal |
Next tab |
| Ctrl+Shift+Tab |
Normal |
Previous tab |
| s+v |
Normal |
Horizontal split (:split) |
| s+g |
Normal |
Vertical split (:vsplit) |
| s+t |
Normal |
Open new tab (:tabnew) |
| s+o |
Normal |
Close other windows (:only) |
| s+b |
Normal |
Previous buffer (:b#) |
| s+c |
Normal |
Closes current buffer (:close) |
| s+x |
Normal |
Remove buffer, leave blank window |
| Space+sv |
Normal |
Split with previous buffer |
| Space+sg |
Normal |
Vertical split with previous buffer |
Plugin: Denite
| Key |
Mode |
Action |
| ;+r |
Normal |
Resumes last Denite window |
| ;+f |
Normal |
File search |
| ;+b |
Normal |
Buffers and MRU |
| ;+d |
Normal |
Directories |
| ;+v |
Normal/Visual |
Yank history |
| ;+l |
Normal |
Location list |
| ;+q |
Normal |
Quick fix |
| ;+n |
Normal |
Dein plugin list |
| ;+g |
Normal |
Grep search |
| ;+j |
Normal |
Jump points |
| ;+u |
Normal |
Junk files |
| ;+o |
Normal |
Outline tags |
| ;+s |
Normal |
Sessions |
| ;+t |
Normal |
Tag list |
| ;+p |
Normal |
Jump to previous position |
| ;+h |
Normal |
Help |
| ;+m |
Normal |
Memo list |
| ;+z |
Normal |
Z (jump around) |
| ;+/ |
Normal |
Buffer lines |
| ;+* |
Normal |
Match word under cursor with lines |
| ;+; |
Normal |
Command history |
| Space+gl |
Normal |
Git log (all) |
| Space+gs |
Normal |
Git status |
| Space+gc |
Normal |
Git branches |
| Space+gt |
Normal |
Find tags matching word under cursor |
| Space+gf |
Normal |
Find file matching word under cursor |
| Space+gg |
Normal/Visual |
Grep word under cursor |
| Within Denite window |
|
|
| jj or kk |
Insert |
Leave Insert mode |
| q or Escape |
Normal |
Exit denite window |
| Space |
Normal |
Select entry |
| Tab |
Normal |
List and choose action |
| i |
Normal |
Open filter input |
| dd |
Normal |
Delete entry |
| p |
Normal |
Preview entry |
| st |
Normal |
Open in a new tab |
| sg |
Normal |
Open in a vertical split |
| sv |
Normal |
Open in a split |
| r |
Normal |
Redraw |
| yy |
Normal |
Yank |
| ' |
Normal |
Quick move |
Plugin: Defx
| Key |
Mode |
Action |
| ;+e |
Normal |
Open file explorer (toggle) |
| ;+a |
Normal |
Open file explorer and select current file |
| Within Defx window |
|
|
| h |
Normal |
Collapse directory tree |
| j or k |
Normal |
Move up and down the tree |
| Return or l |
Normal |
Toggle collapse/expand directory or open file |
| Space |
Normal |
Select current file or directory |
| * |
Normal |
Invert selection (select all) |
| Backspace |
Normal |
Move into the parent directory |
| & or </kbd> |
Normal |
Move to project root |
| ~ |
Normal |
Move to user home directory |
| st |
Normal |
Open file in new tab |
| sv |
Normal |
Open file in a horizontal split |
| sg |
Normal |
Open file in a vertical split |
| N |
Normal |
Create new directories and/or files |
| K |
Normal |
Create new directory |
| c / m / p |
Normal |
Copy, move, and paste |
| r |
Normal |
Rename file or directory |
| dd |
Normal |
Delete selected files and directories |
| y |
Normal |
Yank selected item to clipboard |
| w |
Normal |
Toggle window size |
| ]+g |
Normal |
Next dirty git item |
| [+g |
Normal |
Previous dirty git item |
| x / gx |
Normal |
Execute associated system application |
| gd |
Normal |
Open git diff on selected file |
| gl |
Normal |
Open terminal file explorer |
| gr |
Normal |
Grep in selected directory |
| gf |
Normal |
Find files in selected directory |
Plugin: Asyncomplete and Emmet
| Key |
Mode |
Action |
| Tab / Shift-Tab |
Insert |
Navigate completion-menu |
| Enter |
Insert |
Select completion or expand snippet |
| Ctrl+j k d u |
Insert |
Movement in completion pop-up |
| Ctrl+Return |
Insert |
Expand Emmet sequence |
| Ctrl+Space |
Insert |
Refresh and show candidates |
| Ctrl+y |
Insert |
Close pop-up |
| Ctrl+e |
Insert |
Cancel selection and close pop-up |
| Ctrl+l |
Insert |
Expand snippet at cursor |
| Ctrl+f |
Insert/select |
Jump to next snippet placeholder |
| Ctrl+b |
Insert/select |
Jump to previous snippet placeholder |
Plugin: Caw (comments)
| Key |
Mode |
Action |
| gc |
Normal/visual |
Prefix |
| gcc |
Normal/visual |
Toggle comments |
| Space+v |
Normal/visual |
Toggle single-line comments |
| Space+V |
Normal/visual |
Toggle comment block |
Plugin: Edge Motion
| Key |
Mode |
Action |
| g+j |
Normal/Visual |
Jump to edge downwards |
| g+k |
Normal/Visual |
Jump to edge upwards |
Plugin: Signature
| Key |
Mode |
Action |
| m + / or ? |
Normal |
Show list of buffer marks/markers |
| m + m |
Normal |
Toggle mark on current line |
| m + , |
Normal |
Place next mark |
| m + a-z |
Normal |
Place specific mark (Won't work for: m, n, p) |
| d + m + a-z |
Normal |
Remove specific mark (Won't work for: m, n, p) |
| m + n |
Normal |
Jump to next mark |
| m + p |
Normal |
Jump to previous mark |
| ] + = |
Normal |
Jump to next marker |
| [ + = |
Normal |
Jump to previous marker |
| m + - |
Normal |
Purge all on current line |
| m + Space |
Normal |
Purge marks |
| m + Backspace |
Normal |
Purge markers |
Plugin: Easygit
| Key |
Mode |
Action |
| Space+ga |
Normal |
Git add current file |
| Space+gS |
Normal |
Git status |
| Space+gd |
Normal |
Git diff |
| Space+gD |
Normal |
Close diff |
| Space+gc |
Normal |
Git commit |
| Space+gb |
Normal |
Git blame |
| Space+gB |
Normal |
Open in browser |
| Space+gp |
Normal |
Git push |
Plugin: GitGutter
| Key |
Mode |
Action |
| [+g |
Normal |
Jump to next hunk |
| ]+g |
Normal |
Jump to previous hunk |
| g+S |
Normal |
Stage hunk |
| Space+gr |
Normal |
Revert hunk |
| g+s |
Normal |
Preview hunk |
Plugin: Linediff
| Key |
Mode |
Action |
| Space+mda |
Visual |
Sequentially mark region for diff |
| Space+mdf |
Visual |
Mark region for diff and compare if more than one |
| Space+mds |
Normal |
Shows the comparison for all marked regions |
| Space+mdr |
Normal |
Removes the signs denoting the diff regions |
Misc Plugins
| Key |
Mode |
Action |
| v / V |
Visual/select |
Expand/reduce selection (expand-region) |
| - |
Normal |
Choose a window to edit (choosewin) |
| Space+mg |
Normal |
Open Magit |
| Space+mt |
Normal/Visual |
Toggle highlighted word (quickhl) |
| Space+- |
Normal |
Switch editing window with selected (choosewin) |
| Space+o |
Normal/Visual |
Open SCM detailed URL in browser (:OpenSCM) |
| Space+t |
Normal |
Open structure window (:Vista) |
| Space+a |
Normal |
Show nearby tag in structure window (:Vista show) |
| Space+G |
Normal |
Toggle distraction-free writing (goyo) |
| Space+gu |
Normal |
Open undo-tree |
| Space+W |
Normal |
VimWiki |
| Space+K |
Normal |
Thesaurus |
Credits & Contribution
Big thanks to the dark knight Shougo.