I find the conceit in using the word essential off-putting. Essential implies that it is absolutely necessary. Plugins are not absolutely necessary in order to derive substantial value from Vim. For this reason, this article is humbly titled Vim Plugins That I Use and not Essential Vim Plugins. Like psilocybin (or any recreational drug for that matter), Vim plugins are used to enhance your experience. However, as a firm grounding in reality is prerequisite before entering pharmacologically induced states of altered consciousness, a strong grasp of pure Vim is necessary before experimenting with the vast bevy of plugins.
The following is a catalog of the Vim plugins that I use and how to use them. They are trifurcated between productivity, code formatting, and appearance.
Productivity
- YouCompleteMe
- ack.vim
- auto-pairs
- nerdtree
- syntastic
- vim-anyfold
- vim-fugitive
- vim-surround
- vitality.vim
Code Formatting
Appearance
While reading this article, you may also find my .vimrc
helpful. Before we dive into Vim packages, its prudent to discuss how to manage them. I preferred to use Vundle.
Note: This article goes into great detail about each plugin. If you simply want to install these plugins and get to work, copy my .vimrc
and run:
vim +PluginInstall +qall
It should be noted, that you will still need to compile YouCompleteMe.
Vundle
Overview
Vundle is a Vim plugin manager. It allows you to install, update, and configure Vim plugins all from within your .vimrc
.
Installation
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
Configuration
Add the following to the top of your .vimrc
:
.vimrc
set nocompatible " be iMproved, required
filetype off " required
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')
" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'
" The following are examples of different formats supported.
" Keep Plugin commands between vundle#begin/end.
" plugin on GitHub repo
Plugin 'tpope/vim-fugitive'
" plugin from http://vim-scripts.org/vim/scripts.html
" Plugin 'L9'
" Git plugin not hosted on GitHub
Plugin 'git://git.wincent.com/command-t.git'
" git repos on your local machine (i.e. when working on your own plugin)
Plugin 'file:///home/gmarik/path/to/plugin'
" The sparkup vim script is in a subdirectory of this repo called vim.
" Pass the path to set the runtimepath properly.
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
" Install L9 and avoid a Naming conflict if you've already installed a
" different version somewhere else.
" Plugin 'ascenator/L9', {'name': 'newL9'}
" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList - lists configured plugins
" :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line
Usage
Plugins are installed to ~/.vim/bundle/
.
To install plugins:
:PluginInstall
To install plugins from the command-line:
vim +PluginInstall +qall
Productivity
YouCompleteMe
Overview
YouCompleteMe is a code completion engine for Vim. It provides a completion engine for many of the most common languages (C/C++, Python, C#, Go, etc.) in addition to a general identifier-based engine that works with every programming language. YouCompleteMe also leverages Vim’s omnicomplete system to provide semantic completions for many other languages for which a completion engine does not exist.
Installation
It should be noted that YouCompleteMe is a Vim Plugin with a compiled component. Simply installing the YouCompleteMe plugin is not enough to get it to work.
Add the following to your .vimrc
:
.vimrc
Plugin 'Valloric/YouCompleteMe'
Install Xcode Command Line Tools:
xcode-select --install
Install CMake:
brew install cmake
Compile YouCompleteMe with semantic support for C-family languages:
cd ~/.vim/bundle/YouCompleteMe
./install.py --clang-completer
Note: If using pyenv, you need to run the command:
export PYTHON_CONFIGURE_OPTS="--enable-framework"
before installing a Python version.
Configuration
YouCompleteMe comes with sane defaults for its options, however here is my configuration:
.vimrc
" close preview window after completion
let g:ycm_autoclose_preview_window_after_completion=1
" map GoToDeclaration subcommand to <leader> + g
map <leader>g :YcmCompleter GoToDeclaration<CR>
" disable YouCompleteMe for file types: ['gitcommit']
let g:ycm_filetype_specific_completion_to_disable = {
\ 'gitcommit': 1
\}
Usage
YouCompleteMe requires no keyboard shortcuts to generate the list of completion candidates. Simply type and use TAB
to cycle through the offered completions.
ack.vim
Overview
ack.vim allows you to search with ack
(or any other search tool) from within Vim and shows the results in a split window.
Installation
Add the following to your .vimrc
:
.vimrc
Plugin 'mileszs/ack.vim'
Configuration
I prefer to use Ag with ack.vim:
.vimrc
" use Ag with ack.vim
let g:ackprg = 'ag --nogroup --nocolor --column'
Usage
Search recursively in {directories}
(defaults to the current directory) for {pattern}
:
:Ack [options] {pattern} [{directories}]
Files containing the search term will be listed in the quickfix window, along with the line number of the occurrence, once for each occurrence. Pressing <Enter>
on a line in this window will open the file and place the cursor on the matching line.
auto-pairs
Overview
Auto-pairs allows you to insert or delete brackets, parentheses, or quotes in pair.
Installation
Add the following to your .vimrc
:
.vimrc
Plugin 'jiangmiao/auto-pairs'
Configuration
This plugin requires no further configuration.
Usage
This plugin has no further usage.
nerdtree
Overview
The NERDTree is a file system explorer for the Vim editor.
Installation
Add the following to your .vimrc
:
.vimrc
Plugin 'scrooloose/nerdtree'
Configuration
.vimrc
" map toggle NERDTree to ^Ctrl + n
map <C-N> :NERDTreeToggle<CR>
" show hidden files by default
let NERDTreeShowHidden=1
" ignore specifc files
let NERDTreeIgnore=['\.pyc$', '\~$', '\.swp$']
Usage
Open NERDTree with a directory:
cd <directory>
vim .
Toggle NERDTree:
<Ctrl-n>
There is a plethora of helpful mappings for opening files and navigating directories. For a full list, see the documentation.
syntastic
Overview
If you use an IDE, you are accustom to having syntax errors displayed out of the box. This obfuscation removes the need for understanding how language checkers work. Syntastic disambiguates this process. It runs files through external syntax checkers and displays any resulting errors to the user. Syntastic does not presume what syntax checks you will want, therefore, in order to get meaningful results you need to install external checkers corresponding to the types of files you use.
Installation
Add the following to your .vimrc
:
.vimrc
Plugin 'vim-syntastic/syntastic'
Configuration
Syntastic has numerous options that can be configured and the defaults are not particularly well suitable for new users. It is recommended that you start by adding the following lines to your .vimrc
file and return to them after reading the manual.
.vimrc
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0
Usage
Add the following to your .vimrc
to enable syntax checkers:
.vimrc
let g:syntastic_<filetype>_checkers = ['<checker_1>', '<checker_2>', ...]
vim-anyfold
Overview
vim-anyfold is an enhancement of Vim’s native folding logic (foldmethod=indent
).
Installation
Add the following to your .vimrc
:
.vimrc
Plugin 'pseewald/vim-anyfold'
Configuration
Add the following to your .vimrc
:
.vimrc
autocmd Filetype * AnyFoldActivate
set foldlevel=99
Usage
Use Vim’s fold commands (zo
, zO
, zc
, za
) to fold/unfold folds.
Use key combinations [[
and ]]
to navigate to the beginning and end of the current open fold.
Use ]k
and [j
to navigate to the end of the previous block and to the beginning of the next block.
vim-fugitive
Overview
vim-fugitive is a Git wrapper which enables Git commands to be executed from within Vim.
Installation
Add the following to your .vimrc
:
.vimrc
Plugin 'tpope/vim-fugitive'
Configuration
This plugin requires no further configuration.
Usage
View a blob, tree, commit, or tag:
:Gedit (or :Gsplit, :Gvsplit, :Gtabedit)
Open the staged version of a file side by side with the working tree version:
:Gdiff
Open the output of git status
:
:Gstatus
Press -
to add/reset a file or p
to add/reset with the —patch
option.
Commit the current file and edit the commit message inside Vim:
:Gcommit %
Open an interactive vertical split with the output of git blame
:
:Gblame
Execute git mv
on a file and simultaneously rename the buffer:
:Gmove
Execute git rm
on a file and simultaneously delete the buffer:
:Gdelete
Search the working tree with git grep
:
:Ggrep
Load all previous revisions of a file into a quickfix list:
:Glog
Checkout a file to the buffer. This is synonymous with git checkout -- filename
, however the operation is carried out on the buffer and not the file, so changes can be undone with u
:
:Gread
Open the current file in the browser using a hosting provider (GitHub, GitLab, and Bitbucket):
:Gbrowse
Note: :Gbrowse
requires an additional plugin.
Finally, run any Git command by simply using:
!Git <subcommand>
Note: Obviously, you need to be in a Git repository for vim-fugitive to work.
vim-surround
Overview
vim-surround is all about surroundings: parentheses, brackets, quotes, XML tags, and more. The plugin provides mappings to easily delete, change, and add such surroundings in pairs.
Installation
Add the following to your .vimrc
:
.vimrc
Plugin 'tpope/vim-surround'
Configuration
This plugin requires no further configuration.
Usage
Change surroundings:
cs<current><new>
Remove surroundings:
ds<current>
Insert surroundings:
ysiw<new>
Wrap line with surroundings:
yss<new>
Note: For parentheses and brackets, an open character ((
,[
,{
) will add spaces, a closed character ()
,]
,}
) will not.
Caveat: Ensure that if you set a timeoutlen
that it is not too short. The following does not allow a secondary key stoke to register before entering INSERT
mode.
Bad
augroup FastEscape
autocmd!
au InsertEnter * set timeoutlen=0
au InsertLeave * set timeoutlen=0
augroup END
Good
augroup FastEscape
autocmd!
au InsertEnter * set timeoutlen=100
au InsertLeave * set timeoutlen=1000
augroup END
This is problematic when a motion includes change (c
).
vitality
Overview
Vitality is a plugin that makes Vim play nicely with iTerm2 and tmux. Specifically, Vitality restores the FocusLost
and FocusGained
autocommand functionality.
Installation
Add the following to your .vimrc
:
.vimrc
Plugin 'sjl/vitality.vim'
Configuration
This plugin requires no further configuration.
Usage
With Vitality, saving the current buffer (or all buffers) when focus is lost is possible within tmux:
" auto save all files when focus is lost or when switching buffers
autocmd FocusLost,BufLeave * :wa
Code Formatting
vim-autoformat
Overview
vim-autoformat makes use of external formatting programs to automatically format code. It is similar to syntastic in that it will try each formatter in a list of applicable formatters until one succeeds. If a formatting program for the specific language is not available, vim-autoformat falls back by default to indenting, re-tabbing, and removing trailing whitespace.
Installation
Add the following to your .vimrc
:
.vimrc
Plugin 'Chiel92/vim-autoformat'
Next, install an external program that can format code of the programming language you are using. For example, when working with Python, one could install the autopep8
or yapf
formatters.
Configuration
The :Autoformat
command can be mapped to a specific key by adding the following to your .vimrc
:
.vimrc
" set :Autoformat command to <F3>
noremap <F3> :Autoformat<CR>
Usage
Use the following command to format the entire buffer:
:Autoformat
To change the formatter with the highest priority, use the commands :NextFormatter
and :PreviousFormatter
. To print the currently selected formatter use :CurrentFormatter
.
For debugging purposes, it may be beneficial to set vim-autoformat to verbose mode:
.vimrc
let g:autoformat_verbosemode=1
" or use the following:
let verbose=1
vim-python-pep8-indent
Overview
vim-python-pep8-indent modifies Vim’s indentation behavior to comply with PEP8.
Installation
Add the following to your .vimrc
:
.vimrc
Plugin 'Vimjas/vim-python-pep8-indent'
Configuration
This plugin requires no further configuration.
Usage
This plugin has no further usage.
Appearance
lightline.vim
Overview
lightline.vim is a light and configurable statusline plugin for Vim.
Installation
Add the following to your .vimrc
:
.vimrc
Plugin 'itchyny/lightline.vim'
Configuration
Add the following to your .vimrc
:
.vimrc
" always display status line
set laststatus=2
" hide mode
set noshowmode
Usage
If you would like to display the Git branch, use the following configuration:
.vimrc
let g:lightline = {
\ 'colorscheme': 'default',
\ 'active': {
\ 'left': [ [ 'mode', 'paste' ],
\ [ 'gitbranch', 'readonly', 'filename', 'modified' ] ]
\ },
\ 'component_function': {
\ 'gitbranch': 'fugitive#head'
\ },
\ }
nerdtree-git-plugin
Overview
nerdtree-git-plugin works in concert with NERDTree to show Git status flags beside files.
Installation
Add the following to your .vimrc
:
.vimrc
Plugin 'Xuyuanp/nerdtree-git-plugin'
Configuration
Symbols can be changed using the NERDTreeIndicatorMapCustom
variable, however, the defaults are quite acceptable.
Usage
This plugin has no further usage.
vim-colors-solarized
altercation/vim-colors-solarized
Overview
Solarized is a highly engineered color palette boasting both precise CIELAB lightness relationships and a refined set of hues based on fixed color wheel relationships. Solarized reduces brightness contrast but, unlike many low contrast colorschemes, retains contrasting hues (based on color wheel relations) for syntax highlighting readability. A lot of thought, planning, and testing has gone into making this colorscheme technically and aesthetically superior. I personally use the degraded 256 colorscheme, which offers grey monotones as oppose to blue to accommodate the limited 256 terminal palette.
Installation
Add the following to your .vimrc
:
.vimrc
Plugin 'altercation/vim-colors-solarized'
Configuration
To use the degraded 256 colorscheme, add the following to your .vimrc
:
.vimrc
let g:solarized_termcolors=256
set background=dark
colorscheme solarized
Usage
If you are using a terminal emulator that supports 256 colors and do not want to use the custom Solarized terminal colors, you will need to use the degraded 256 colorscheme. To do so, simply add the following line before colorscheme solarized
:
.vimrc
let g:solarized_termcolors=256
I use a custom terminal palette with iTerm2 which emulates the degraded 256 colorscheme. It can be found here.
vim-gitgutter
Overview
vim-gitgutter shows a git diff
in the gutter, also known as the sign column, of lines that have been added, modified, or removed using signs (+
, ~
, -
, respectively). In addition, you can preview, stage, and undo individual hunks using simple motions.
Installation
Add the following to your .vimrc
:
.vimrc
Plugin 'airblade/vim-gitgutter'
Configuration
After making a change to a file tracked by Git, diff markers should appear automatically after 4000 ms (Vim’s default updatetime). It is recommended that you reduce this time to 100 ms by adding the following to your .vimrc
:
.vimrc
" set updatetime to 100 ms
set updatetime=100
Usage
Jump to next hunk:
]c
Jump to previous hunk:
[c
Preview a hunk:
<leader>hp
Stage a hunk:
<leader>hs
Undo a hunk:
<leader>hu
If you made it through this article, congratulations! Personally, I think a slow, piecemeal approach to extending Vim with plugins is the best way to go. There is a lot of nuance and a significant learning curve with each new plugin and it is best to read the documentation before blithely adding plugins to your .vimrc
. If you would like more information on the Vim plugin ecosystem, Vim Awesome maintains a comprehensive, ranked list of all Vim plugins.