The .vimrc
file (pronounced Vim-wreck) is a Vim configuration file. It holds commands that will be executed by Vim every time it starts.
By default the file is empty or non-existent; you can use it to customize your Vim environment.
To find out where Vim expects the vimrc file to be stored, open Vim and run:
:echo $MYVIMRC
Unix: on a Unix system such as Mac or Linux your vimrc will be called .vimrc
and usually be located in your home directory ($HOME/.vimrc
).
Windows: on Windows it will be called _vimrc
and located in your home directory (%HOMEPATH%/_vimrc
).
On startup, Vim will search in multiple places for a vimrc file. The first that exists is used, the others are ignored. For a full reference see the :h $MYVIMRC
documentation article.
If you don't know which options you should use, you may be interested in the :options
command.
This will open a split with all Vim options listed and with their current value displayed. There are 26 sections to display all options you can try.
e.g.
4 displaying text
scroll number of lines to scroll for CTRL-U and CTRL-D
(local to window)
set scr=20
scrolloff number of screen lines to show around the cursor
set so=5
wrap long lines wrap
set nowrap wrap
...
On a value line (e.g. set nowrap
) you can press CR to toggle the value (if it's a binary value).
On an option line (e.g. wrap long line wrap
) you can press CR to access the documentation for this option.
Whatever you do to customize Vim, it should NEVER happen outside of $HOME
:
$HOME
is usually /home/username/
,$HOME
is /Users/username/
,$HOME
is usually C:\Users\username\
.The canonical location for your vimrc
and your vim
directory is at
the root of that $HOME
directory:
on Unix-like systems
$HOME/.vimrc <-- the file
$HOME/.vim/ <-- the directory
on Windows
$HOME\_vimrc <-- the file
$HOME\vimfiles\ <-- the directory
The layout above is guaranteed to work, now and in the future.
Vim 7.4 made it possible to keep your lovely vimrc
inside your vim
directory. It is really a good idea, if only because it makes it easier to
move your config around.
If you use 7.4 exclusively, the following will be enough:
on Unix-like systems
$HOME/.vim/vimrc
on Windows
$HOME\vimfiles\vimrc
If you want the benefits of a self-contained vim/
but use both 7.4 and an older version, or only an older version, the simplest, future-proof, solution is to put this
line and only this line:
runtime vimrc
in this file:
on Unix-like systems
$HOME/.vimrc
on Windows
$HOME\_vimrc
and do your configuration in $HOME/.vim/vimrc
or $HOME\vimfiles\vimrc
.
There are three kinds of options:
To check the value of an option,
:set option?
to check the value of an option,:verbose set option?
to also see where it was last set.set booloption " Set booloption.
set nobooloption " Unset booloption.
set booloption! " Toggle booloption.
set booloption& " Reset booloption to its default value.
set stroption=baz " baz
set stroption+=buzz " baz,buzz
set stroption^=fizz " fizz,baz,buzz
set stroption-=baz " fizz,buzz
set stroption= " Unset stroption.
set stroption& " Reset stroption to its default value.
set numoption=1 " 1
set numoption+=2 " 1 + 2 == 3
set numoption-=1 " 3 - 1 == 2
set numoption^=8 " 2 * 8 == 16
using concatenation:
execute "set stroption=" . my_variable
using :let
:
let &stroption = my_variable
See :help :set
and :help :let
.
:map <F6>
to see what is mapped to <F6>
and in which mode.:verbose map <F6>
to also see where it was last mapped.:map
and :map!
are too generic. Use :n[nore]map
for normal mode mappings, :i[nore]map
for insert mode, :x[nore]map
for visual mode, etc.Use recursive mappings only if you intend to use other mappings in your mappings:
nnoremap b B
nmap <key> db
In this example, b
is made to work like B
in normal mode. Since we use b
in a recursive mapping, pressing <key>
will work like dB
, not like db
.
Use non-recursive mappings only if you intend to use default commands in your mappings, which is almost always what you want:
nnoremap <key> db
In this example, we use b
in a non-recursive mapping so pressing key will always work like db
, whether we remapped b
or not.
nnoremap <key> :MyCommand<CR>
nnoremap <key> :MyCommand <bar> MyOtherCommand <bar> SomeCommand<CR>
nnoremap <key> :call SomeFunction()<CR>
<Plug>
mappingmap <key> <Plug>name_of_mapping
See :help map-commands
, :help key-notation
and :help <plug>
.
see Key Mappings in Vim for futher read
Like most scripting languages, vimscript has variables.
One can define a variable with the :let
command:
let variable = value
and delete it with :unlet
:
unlet variable
In Vim, variables can be scoped by prepending a single letter and a colon to their name. Plugin authors use that feature to mimic options:
let g:plugin_variable = 1
See :help internal-variables
.
command! MyCommand call SomeFunction()
command! MyOtherCommand command | Command | command
:help user-commands
.s:
(script local functions), or they must be prefixed with the name associated to the autoload plugin where they are defined (e.g. in {&rtp}/autoload/foo/bar.vim
we could define foo#bar#functionname()
).a:parameter_name
. Variadic functions can be defined with the ellipsis ...
, to access the parameters use a:000
(list of all parameters), or a:0
(number of parameters equal to len(a:000)
), a:1
first unnamed parameters, and so on.:call MyFunction(param1, param2)
:
, thus all the commands are colon commandsabort
function! MyFunction(foo, bar, ... ) abort
return a:foo . a:bar . (a:0 > 0 ? a:1 : '')
endfunction
If you only plan on using your function in the file where it's defined (either because you've broken a bigger function in smaller parts, or because you'll use it in a command, a mapping, ...), you can prefix it with s:
, avoiding littering your global namespace with useless internal functions:
function! s:my_private_function() " note we don't need to capitalize the first letter this time
echo "Hi!"
endfunction
If your script local function is going to be used in a mapping, you need to reference it using the special <SID>
prefix:
nnoremap <your-mapping-key> :call <SID>my_private_function()<CR>
See :help user-functions
.
Note however, that since Vim 7, it's considered a best practice to define mappings abbreviations, commands and menus in (ft)plugins, and defining functions in autoload plugins -- except the functions the plugins need to use when they're loaded. This means that nowadays the need to call scripts local functions from mappings is not as pertinent as what it used to be.
augroup MyGroup
" Clear the autocmds of the current group to prevent them from piling
" up each time you reload your vimrc.
autocmd!
" These autocmds are fired after the filetype of a buffer is defined to
" 'foo'. Don't forget to use 'setlocal' (for options) and '<buffer>'
" (for mappings) to prevent your settings to leak in other buffers with
" a different filetype.
autocmd FileType foo setlocal bar=baz
autocmd FileType foo nnoremap <buffer> <key> :command<CR>
" This autocmd calls 'MyFunction()' everytime Vim tries to create/edit
" a buffer tied to a file in /'path/to/project/**/'.
autocmd BufNew,BufEnter /path/to/project/**/* call MyFunction()
augroup END
See :help autocommand
.
if v:version >= 704
" Do something if Vim is the right version.
endif
if has('patch666')
" Do something if Vim has the right patch-level.
endif
if has('feature')
" Do something if Vim is built with 'feature'.
endif
See :help has-patch
and :help feature-list
.
Commonly you would use :set
to set options to your liking in your .vimrc
. There are many options that can be changed.
For example, in order to use spaces for indentation:
:set expandtab
:set shiftwidth=4
:set softtabstop=4
Switch syntax highlighting on, when the terminal has colors
if &t_Co > 2 || has("gui_running")
syntax on
end
Show trailing whitespace and tabs. Showing tabs can be especially useful when looking for errors in Makefiles.
set list listchars=tab:\|_,trail:.
highlight SpecialKey ctermfg=DarkGray
Vim comes with several pre-installed color schemes. In Linux, the color schemes that come with Vim are stored in /usr/share/vim/vim74/colors/
(where 74 is your version number, sans periods); MacVim stores them in /Applications/MacVim.app/Contents/Resources/vim/runtime/colors
.
The colorscheme
command switches the current color scheme.
For instance, to set the color scheme to "robokai":
:colorscheme robokai
The default color scheme is creatively named default
, so, to return to it use
:colorscheme default
To view all of the currently installed color schemes, type :colorscheme
followed by space and then either tab or ctrld.
User-installed color schemes can be placed in ~/.vim/colors/
. Once a color scheme is added to this directory, it will appear as an option to the colorscheme
command.
To find new color schemes, there are sites like vimcolors which contain a variety of color schemes. There are also tools like vim.ink and Vivify to aid you in creating your own color schemes, or you can create them by hand.
To enable - type:
:set number
or :set nu
.
To disable - type:
:set nonumber
or :set nonu
.
To enable enumerating relative to the cursor location - type:
:set relativenumber
.
To disable enumerating relative to the cursor location - type:
:set norelativenumber
.
Note: To change whether the current line shows the actual line number or 0
, use the :set number
and :set nonumber
commands while the relativenumber
attribute is active.
Vim plugins are addons that can be used to change or enhance functionality of vim.
There is a good list of plugins at vimawesome