Explaining Every Line of vim-sensible | by Rionaldi Chandraseta | Towards Data Science

There are 3 possible reasons why you clicked on this story. First, it pops up in your screen as a recommended story. You are not using Vim, but you are curious about Vim and Sensible Vim.
Alternatively, you have been obsessed with Vim for years and you thought “I already know all the lines inside it, but it’s an article about Vim so I will read it anyway.”
Finally, you are in the same stage of learning Vim as me and you have searched about an annotated version of Sensible but haven’t found one.
First, I will give a quick explanation about vimrc file. Vimrc file is a configuration file for Vim that enables you to customise Vim, install plugins, and so on. It is usually found in ~/.vimrc, but you can create it if it’s not there. For Windows, you can find more information about finding the vimrc file here.
vim.fandom.com
I was searching for a vimrc file that is filled with useful defaults to act as a base for my future vimrc. First, I want to share a recurring answer I found on multiple posts and discussions. Quoting from this post by Doug Black,
Don’t put any lines in your vimrc that you don’t understand.
I believe that is a really sound advice. A programmer wouldn’t put any extra or unnecessary lines inside their code, this should be the case too with vimrc files.
Along my search, I stumbled upon this Reddit post stating that Sensible is a good starting point for a vimrc file.
github.com
Compared to other alternatives I got, which was either quite similar with Sensible or over 300 lines, I decided to dive deeper into this as a starting point.
Here’s the full code for Sensible Vim.
Some of the hardest-to-understand lines are commented, but most of them don’t have any explanations at all. It’s understandable though, for those more familiar with Vim, it would not make sense to put comments on these lines.
Maybe it will look like this for them.
if speed > 80.0:        # checks if speed is more than 80.0    speeding = True     # set speeding flag to True    n_violation += 1    # add 1 to variable n_violation
Anyway, I’m not a Vim expert, so I wanted the over-annotated version for me to better understand what these lines actually do.
Here’s what I found out, feel free to skip through some of the trivial explanations.
if exists(‘g:loaded_sensible’) || &compatible  finishelse  let g:loaded_sensible = ‘yes’endif
The very first bit is to set a vim variable of loaded_sensibleto ‘yes’, presumably for compatibility with other plugins that check if vim-sensible is used.
if has(‘autocmd’)  filetype plugin indent onendif
The line will check if autocmd is enabled. Most Vim will come with it, but some distributions such as vim-small and vim-tiny will come without autocmd by default.
In this case, checking for autocmd is needed because the filetype detection system needs it to work properly.
filetype plugin indent on is a short form of these commands.
filetype onfiletype plugin onfiletype indent on
The first command turns on filetype detection for Vim to help set syntax highlighting and other options. The plugin part will load plugins for specific filetype if they exist. The last bit will load indent file for specific filetype if they exist too.
For example, if you want to activate certain plugins for only Python language, then you can create a file ~/.vim/ftplugin/python.vim. Put all the plugins and commands you want specifically for Python inside that file.
A good practice is to separate the indent configuration inside another file (~/.vim/indent/python.vim). However, I usually just put the indents inside the plugin file.
if has(‘syntax’) && !exists(‘g:syntax_on’)  syntax enableendif
Similar with previous if command, this one checks if Vim is compiled with syntax and if the global variable syntax_on already exists. The goal is to avoid turning on syntax multiple times if it was already enabled.
set autoindent
autoindent option will use the current indentation when creating a new line in Insert mode, both through normal Return or o/O.
set backspace=indent,eol,start
If you have been using Vim for a while, you would notice that sometimes your Backspace key will not work properly in Insert mode. This would happen when you try to backspace over automatically inserted indents, line breaks, and start of insert.
Setting these backspace options will enable you to perform backspace normally over them in that particular order.
set complete-=i
The -= operator in Vim means it will remove the options if it’s already set. In this case, it will remove the i option from autocomplete.
The i option states that it will “scan current and included files”, which might pollute the autocomplete results if your current file includes a lot of other files. As such, it makes sense to disable this option.
set smarttab
smarttab will insert n blanks according to either shiftwidth, tabstop, or softtabstop if they are configured and will also delete a shiftwidth blanks at the start of the line instead of one blank by default.
set nrformats-=octal
nrformats is short for number formats, which helps define what kind of format will be considered as number for Vim. If you type 13 and then hover over it in Normal mode and press Ctrl+A, then it will increment it to 14. Or you can use Ctrl+X to decrement it to 12.
The octal option will cause 007 to be incremented to 010 due to using base 8. In normal usage, this is not the expected behaviour since not a lot of people are using base 8 in their daily work. By disabling it, 007 will be incremented to 008.
if !has(‘nvim’) && &ttimeoutlen == -1  set ttimeout  set ttimeoutlen=100endif
The nvim variable is used to check if you are running NeoVim or normal Vim. ttimeoutlen sets the timeout for key codes, such as Escape, Ctrl, Shift, etc. By default, the value of ttimeoutlen is -1, which will be changed to 100, but this line sets it explicitly instead.
What’s the use of ttimeoutlen? Let’s say you set a mapping for Cmd+Shift+Up. The key code for that command is ^[[1;6A. On the other hand, the key code for Esc is ^[. If you set ttimeoutlen to 5000, every time you hit the Esc key, it will wait 5 seconds before registering the Esc command. This is due to Vim thinking there is a chance that you will press the rest of the key codes within the 5 seconds window.
There might be a case where it’s useful to set the ttimeoutlen longer, but personally I didn’t find them useful for my use case.
set incsearch
Incremental search or incsearch allows Vim to directly go to the next matching result as you type your search keywords. Without this setting, you need to press Enter to make Vim go to the search result.
“ Use <C-L> to clear the highlighting of :set hlsearch.if maparg(‘<C-L>’, ’n’) ==# ‘’ nnoremap <silent> <C-L> :nohlsearch<C-R>=has(‘diff’)?’<Bar>diffupdate’:’’<CR><CR><C-L>endif
Thankfully this code come with an explanation, because I will definitely spend quite a while before figuring out what it meant. If you have hlsearch enabled, then pressing Ctrl+L will clear the highlighting because it will not go away on its own.
set laststatus=2
Default value for laststatus is 1, which means Vim’s status bar will only show if there are 2 or more Vim windows open. By setting the value to 2, now the status bar will always be there even if you only open 1 Vim window.
set ruler
Show the line and column number of the cursor position. Sometimes it’s a bit redundant since most plugins for status bar have built-in ones.
set wildmenu
When invoking autocomplete in command-line, having wildmenu turned on will show the possible completion above the command-line. Easiest way to see the effect is to type :! in Normal mode and then press Tab to trigger the autocomplete.
if !&scrolloff  set scrolloff=1endif
The scrolloff value ensures that you have at least n lines above and/or below your cursor at all time. This line checks if you have set the scrolloff value or not, and set it to 1 if you haven’t.
Default value for scrolloff is 5, so this setting actually reduces that to 1.Some people set the value to a very large number (999) to keep the cursor in the middle of the screen, but I find it a bit disorienting to have the screen refreshes and move by one line every time I created a new line. That said, I also set mine to 1.
if !&sidescrolloff  set sidescrolloff=5endif
If scrolloff is for the lines above and below, sidescrolloff is for the number of characters on the left and right side of the cursor. The default value is 0. You can also set this to 999 to keep the cursor in the middle of the line.
set display+=lastline
If you open a file with a really long line and it doesn’t fit the screen, Vim will usually replace it with a bunch of “@”. By setting it to lastline, Vim will show as much characters as possible and then put “@@@” on the last columns.
The line uses += to avoid overriding the setting if you have set it to truncate, which will show the “@@@” in the first columns instead.
if &encoding ==# ‘latin1’ && has(‘gui_running’)  set encoding=utf-8endif
The ==# operator means case-sensitive comparison, which is different than == since it depends on :set ignorecase. This line will change the encoding from latin1 to utf-8 if Vim has GUI running.
if &listchars ==# ‘eol:$’ set listchars=tab:>\ ,trail:-,extends:>,precedes:<,nbsp:+endif
listchars is used to specify how specific characters are displayed when using the command :list. The default is 'eol:$', so this line will not overwrite your setting if you have configured your own listchars.
Tabs will be replaced with > followed by a number of \ until the end of the tab. Trailing spaces will be replaced with -. Extend character > will be displayed in the last column and precede character < will be displayed in the first column if the current line does not fit on-screen. Finally, nbsp stands for non-breakable space character, which will be replaced with +.
if v:version > 703 || v:version == 703 && has(“patch541”)  set formatoptions+=j “ Delete comment character when joining commented linesendif
Fortunately, this is also a commented line. Add the j option for formatoptions if Vim version is newer than 7.3 or version 7.3 with patch 541.
This line will delete comment character (e.g. “#”, “//”) when you are joining commented lines. The default value for formatoptions in Vim is tcq, but this is a bit misleading since it could change based on the opened file type.
if has(‘path_extra’)  setglobal tags-=./tags tags-=./tags; tags^=./tags;endif
The setglobal command is a bit different from the usual set command. By using set, we set both the local and global value of an option, while the setglobal only set the global value.
Global value is the default value that is applied to all of Vim. Local value only applies to the current window or buffer.
tags command defines the file names for the tag command. What the line does is to remove ./tags and ./tags; from the current tags. The ^= command prepends the value ./tags; into the current tags.
For example, if the current value for tags is ./a, ./b and we execute setglobal tags ^= ./tags;, it will be changed into ./tags;, ./a, ./b. The ;means that Vim will stop looking for the tag file if it is already found in ./tags.
if &shell =~# ‘fish$’ && (v:version < 704 || v:version == 704 && !has(‘patch276’))  set shell=/usr/bin/env\ bashendif
=~# operator means match with regular expression, so in this case it checks if you are using fish shell. There are some known issues with Vim when it’s running on fish, mainly because fish is not fully POSIX compatible.
stackoverflow.com
This line will set your shell to bash if you are using older version of Vim (older than 7.4) or using version 7.4 without patch 276 to avoid errors in running some commands that could not be executed with fish shell.
set autoread
This will make Vim automatically read a file when it detects that the file has been changed outside of Vim. However, if the file is deleted, it will not be re-read to keep the content from before it was deleted.
if &history < 1000  set history=1000endif
Set the number of history that is kept to minimum 1000. By default, Vim will only remember 50 for each type of history. There are five types of history in Vim.
: commands
search strings
expressions
input lines (input() function)
debug mode commands
if &tabpagemax < 50  set tabpagemax=50endif
Set the maximum tab pages to be opened using the -p command line argument or the :tab all command to at least 50 from the default value 10.
if !empty(&viminfo)  set viminfo^=!endif
Viminfo is a file that is written automatically by Vim as sort of a “cache” to remember information such as command line history, search string hitory, last search pattern, global variables, etc.
This line will prepend the ! value, which will save and restore global variables that start with uppercase letter and don’t have any lowercase letter in them.
Alternatively, if you want to run Vim in a kind of private mode, you can disable the viminfo functionality by using the command set viminfo=.
set sessionoptions-=options
Removing the options value from sessionoptions will disable saving of options, mappings, and global values when you use :mksession to make a session.
Tim Pope himself explains that he disable it because remembering global options will override changes made to the vimrc, which he doesn’t want.
github.com
set viewoptions-=options
Similar with the previous line, this line will disable the same things when using :mkview to make views.
I am not too familiar with views, but this page explains how not using this line could cause Vim to jump to a different working directory when loading a saved view.
vim.fandom.com
“ Allow color schemes to do bright colors without forcing bold.if &t_Co == 8 && $TERM !~# ‘^Eterm’  set t_Co=16endif
t_Co is the number of colours used by the terminal. This will increase the colours to 16 when the current number of colours is set to 8 and current terminal is not Eterm.
Most modern terminal doesn’t need this though, since usually it will be set to 256 by default. You can check this by typing :echo &t_Co.
“ Load matchit.vim, but only if the user hasn’t installed a newer version.if !exists(‘g:loaded_matchit’) && findfile(‘plugin/matchit.vim’, &rtp) ==# ‘’ runtime! macros/matchit.vimendif
matchit is a Vim feature that enables us to jump between opening and closing parentheses, HTML tags, and more. You can try this by pressing % in Normal mode on top of an opening bracket and it will move your cursor to the matching closing bracket.
This line will enable matchit if it is not yet enabled or the existing one is still the older version.
if empty(mapcheck(‘<C-U>’, ‘i’))  inoremap <C-U> <C-G>u<C-U>endifif empty(mapcheck(‘<C-W>’, ‘i’)) inoremap <C-W> <C-G>u<C-W>endif
The mapcheck command checks if you have set a custom mapping for specific key in certain mode. In this case, it checks if you have mapped Ctrl+U and Ctrl+W in Insert mode before creating a new mapping for them.
These two lines will prevent accidental deletion without the possibility of doing undo with both Ctrl+U and Ctrl+W. By doing Ctrl+G u before the actual Ctrl+U or Ctrl+W, we can recover our deleted text with the undo operation (u in Normal mode), which is not possible without these remaps.
vim.fandom.com
After understanding, or at least trying to understand, all of these lines, decided to not install Sensible as a plugin, but instead steal some of the useful lines.
One of my favourites is the set incsearch paired with set hlsearch to enable incremental search and highlight the search result incrementally too.
There are some I omitted, such as setting the shell to bash if using fish shell since I’m using zsh shell myself.
towardsdatascience.com
At first, I started my search for the best vimrc file to built on top of. Along the search, I found out that a lot of other people also searched the same thing. However, after searching more about Vim configuration and gaining basic understanding of it, I decided to build one from scratch since I use Vim not only for coding but also for writing.
If any of the explanation is wrong or not clear enough, please feel free to post a comment to give correction or ask for clarification on any lines.
One last tip, if you are ever unsure of what a line does, you can search Vim’s manual by typing :h 'commandname' to show the help for a specific command. It’s a good practice to know what the commands do and its effect in your vimrc file.
Learning Machine is a series of stories about things happening in the world of Machine Learning that I found interesting enough to share. Oh, and sometimes it will be about the fundamentals of Machine Learning too. Follow me to get regular updates on new stories.