Vim
Vim is an extended version of Vi, with additional features to help with editing source code. Some of Vim's enhancements include comparison of files (vimdiff), syntax highlighting, a comprehensive help system, native scripting (vimscript), and a visual mode for easy selection.
Vim focuses on keyboard use, and is not a simple text editor like nano or pico. It takes time to learn, and a lifetime to master.
Installation
To obtain the CLI version, install:
- the vim-minimal package for a lightweight version,
- the vim package for Python 2, Lua and Ruby interpreters support but without GTK/X support,
- the vim-python3 package for the same as the
vim
package above but with Python 3 interpreter support.
To obtain the GUI version, install:
- the gvim package which also provides the same as the above
vim
package, - the gvim-python3 package for the same as the
gvim
package above but with Python 3 interpreter support.
Usage
This is a basic overview on how to use Vim. Alternately, running vimtutor
/gvimtutor
will launch vim's tutorial.
Vim has four different modes:
- Command mode: keystrokes are interpreted as commands.
- Insert mode: keystrokes are entered into the file.
- Visual mode: keystrokes select, cut, or copy text
- Ex mode: input mode for additional commands (e.g. saving a file, replacing text...)
Basic editing
If you start Vim with:
$ vim somefile.txt
you will see a blank document (providing that somefile.txt does not exist. If it does, you will see what is in there). You will not be able to edit right away – you are in Command Mode. In this mode you are able to issue commands to Vim with the keyboard.
You insert text (stick it before the cursor) with the i
command. I
(uppercase i) inserts text at the beginning of the line. You append text with a
. Typing A
will place the cursor at the end of the line. And you return to command mode at any time by pressing Esc
.
Moving around
In Vim, you can move the cursor with the arrow keys, but this isn't the Vim way. You’d have to move your right hand all the way from the standard typing position all the way to the arrow keys, and then back. Not fun.
In Vim you can move down by pressing j
. You can remember this because the “j” hangs down. You move the cursor back up by pressing k
. Left is h
(it's left of the “j”), and right is l
(lowercase L).
^
will put the cursor at the beginning of the line, and $
will place it at the end.
To advance a word, press the w
key. W
will include more characters in what it thinks is a word (e.g. underscores and dashes as a part of a word). To go back a word, b
is used. Once again, B
will include more characters in what Vim considers a word. To advance to the end of a word, use e
, E
includes more characters.
To advance to the beginning of a sentence, (
will get the job done. )
will do the opposite, moving to the end of a sentence. For an even bigger jump, {
will move the the beginning a whole paragraph. }
will advance to the end of a whole paragraph.
To advance to the header (top) of the screen, H
will get the job done. M
will advance to the middle of the screen, and L
will advance to the last (bottom). gg
will go to the beginning of the file, G
will go to the end of the file.
Repeating commands
If a command is prefixed by a number, then that command will be executed that number of times over (there are exceptions, but they still make sense, like the s
command). For example, pressing 3i
then “Help! ” then Esc
will print “Help! Help! Help!“. Pressing 2}
will advance you two paragraphs. This comes in handy with the next few commands…
Deleting
The x
command will delete the character under the cursor. X
will delete the character before the cursor. This is where those number functions get fun. 6x
will delete 6 characters. Pressing .
(dot) will repeat the previous command. So, lets say you have the word "foobar" in a few places, but after thinking about it, you’d like to see just “foo”. Move the cursor under the "b", hit 3x
, move to the next "foobar" and hit .
(dot).
The d
will tell Vim that you want to delete something. After pressing d
, you need to tell Vim what to delete. Here you can use the movement commands. dW
will delete up to the next word. d^
will delete up unto the beginning of the line. Prefacing the delete command with a number works well too: 3dW
will delete the next three words. D
(uppercase) is a shortcut to delete until the end of the line (basically d$
). Pressing dd
will delete the whole line.
To delete then replace the current word, place the cursor on the word and execute the command cw
. This will delete the word and change to insert mode. Use s
to replace a single letter and go into insert mode. S
will erase the whole line and place you in insert mode. To just replace a single letter use r
, R
will put you in replace mode.
Undo and redo
Vim has a built-in clipboard (also known as a buffer). Actions can be undone with u
and redone with Ctrl+r
.
Visual mode
Pressing v
will put you in visual mode . Here you can move around to select text, when you’re done, you press y
to yank the text into the buffer (copy), or you may use c
to cut. p
pastes after the cursor, P
pastes before. V
, Visual Line mode, is the same for entire lines. Ctrl+v
is for blocks of text.
Search and replace
To search for a word or character in the file, simply use /
and then the characters your are searching for and press enter. To view the next match in the search press n
, press N
for the previous match.
To search and replace use the substitute :s/
command. The syntax is: [range]s///[arguments]
. For example:
Command Outcome :s/xxx/yyy/ Replace xxx with yyy at the first occurrence :s/xxx/yyy/g Replace xxx with yyy at every occurrence in the current line :s/xxx/yyy/gc Replace xxx with yyy global with confirm :%s/xxx/yyy/g Replace xxx with yyy global in the whole file :#,#s/xxx/yyy/g Replace xxx with yyy line number range
You can use the global :g/
command to search for patterns and then execute a command for each match. The syntax is: [range]:g//[cmd]
.
Command Outcome :g/^#/d Delete all lines that begins with # :g/^$/d Delete all lines that are empty
Saving and quitting
To save and/or quit, you will need to use Ex mode. Ex mode commands are preceded by a :
. To write a file use :w
or if the file doesn’t have a name :w filename
. Quitting is done with :q
. If you choose not to save your changes, use :q!
. To save and quit :x
.
Additional commands
-
dd
will delete the current line (ddp
for quick line switching). -
cc
will delete the current line and place you in insert mode. -
o
will create a newline below the line and put you insert mode,O
will create a newline above the line and put you in insert mode. -
yy
will yank an entire line to the buffer -
*
will highlight the current word andn
will search it
Configuration
Vim's user-specific configuration file is located in the home directory: ~/.vimrc
, and files are located inside ~/.vim/
The global configuration file is located at /etc/vimrc
. Global files are located inside /usr/share/vim/
.
The Vim global configuration in Arch Linux is very basic and differs from many other distributions' default Vim configuration file. To get some commonly expected behaviors (such as syntax highlighting, returning to the last known cursor position), consider using Vim's example configuration file:
# mv /etc/vimrc /etc/vimrc.bak # cp /usr/share/vim/vim74/vimrc_example.vim /etc/vimrc
Wrap searches
With this option the search next behaviour allows to jump to the beginning of the file, when the end of file is reached. Similarly, search previous jumps to the end of the file when the start is reached.
set wrapscan
Syntax highlighting
To enable syntax highlighting (Vim supports a huge list of programming languages):
:filetype plugin on :syntax on
Using the mouse
Vim has the ability to make use of the mouse, but it only works for certain terminals (on Linux it is xterm and Linux console with gpm).
To enable this feature, add this line into ~/.vimrc
:
set mouse=a
Traverse line breaks with arrow keys
By default, pressing ←
at the beginning of a line, or pressing →
at the end of a line, will not let the cursor traverse to the previous, or following, line.
The default behavior can be changed by adding set whichwrap=b,s,<,>,[,]
to your ~/.vimrc
file.
Example ~/.vimrc
Example Vim configurations.
Merging files
Vim includes a diff editor (a program that aids in the merging of differences between two [or more] files). vimdiff
opens a vertical, multi-paned, view that and highlights differences between files. Invocation is: vimdiff file1 file2
. Here is the list of vimdiff
specific commands. For basic vim
editing, read the tutorial.
Action | Shortcut |
---|---|
next change | ]c
|
previous change | [c
|
diff obtain | do
|
diff put | dp
|
fold open | zo
|
fold close | zc
|
rescan files | :diffupdate
|
switch windows | Ctrl+w+w
|
Vim tips
Specific user tricks to accomplish tasks.
Line numbers
- Show line numbers by
:set number
. - Show relative line numbers with
:set relativenumber
. - Jump to line number
:<line number>
.
Spell checking
Vim has the ability to do spell checking, enable by entering:
set spell
By default, only English language dictionaries are installed. More can be found in the official repositories by searching for vim-spell
. Additional dictionaries can be found in the Vim's FTP archive. They can be put in the ~/.vim/spell/
folder and set enabled with the command: :setlocal spell spelllang=LL
.
Action | Shortcut |
---|---|
next spelling | ]s
|
previous spelling | [s
|
spelling suggestions | z=
|
spelling good, add | zg
|
spelling good, session | zG
|
spelling wrong, add | zw
|
spelling wrong, session | zW
|
spelling repeat all in file | :spellr
|
Save cursor position
If you want the cursor to appear in its previous position after you open a file, add the following to your ~/.vimrc
:
augroup resCur autocmd! autocmd BufReadPost * call setpos(".", getpos("'\"")) augroup END
Replace vi command with vim
Create an alias for vi
to vim
.
DOS/Windows carriage returns
If there is a ^M
at the end of each line then this means you are editing a text file which was created in MS-DOS or Windows. In Linux these are called newline characters in Windows they are termed carriage returns.
To replace Windows line endings do (keep in mind that ^
is a control letter, press Ctrl+V,Ctrl+M
to get the right control character:
:%s/^M//g
Alternatively install the package dos2unix and run dos2unix file
.
Empty space at the bottom of gVim windows
When using a window manager configured to ignore window size hints, gVim will fill the non-functional area with the GTK theme background color.
The solution is to adjust how much space gVim reserves at the bottom of the window. Take note that if you set it to zero, you won't be able to see the bottom horizontal scrollbar, if you have one. Put the following line in ~/.vimrc
:
set guiheadroom=0
Plugins
Adding plugins to vim can increase your productivity. Plugins can alter vim's UI, add new commands, add code completion support, integrate other programs and utilities with vim, add support for additional languages and more.
Plugin managers
The cross-platform method of installing and managing Vim plugins is through a plugin manager. A plugin manager is a plugin that acts as a package manager for vim plugins.
- Vundle is currently the most popular plugin manager for Vim.
- pathogen.vim is a simple plugin for managing Vim's runtimepath.
Pacman
The group vim-plugins has many plugins to choose from(there are more in the repos though ie: vim-supertab).
pacman -Ss vim-plugins
cscope
Cscope is a tool for browsing a project. By navigating to a word/symbol/function and calling cscope(usually with shortcut keys) it can find: functions calling the function, the function definition, and more. Multiple steps are required to search a code base.
Install the cscope package.
Copy the cscope default file where it will be automatically read by vim:
mkdir -p ~/.vim/plugin wget -P ~/.vim/plugin http://cscope.sourceforge.net/cscope_maps.vim
Create a file which contains the files you wish cscope to index(Cscope can handle many languages but this example finds .c, .cpp, and .h files):
cd /path/to/projectfolder/ find . -type f -print | grep -E '\.(c(pp)?|h)$' > cscope.files
Create database files that cscope will read:
cscope -bq
Default keyboard shortcuts
Ctrl-\ and c: Find functions calling this function d: Find functions called by this function e: Find this egrep pattern f: Find this file g: Find this definition i: Find files #including this file s: Find this C symbol t: Find assignments to
Feel free to change the shortcuts.
#Maps ctrl-c to find functions calling the function nnoremap <C-c> :cs find c <C-R>=expand("<cword>")<CR><CR>
Taglist
Taglist provides an overview of the structure of source code files and allows you to efficiently browse through source code files in different programming languages.
Install the vim-taglist package.
Usefull options to be put in ~/.vimrc
:
let Tlist_Compact_Format = 1 let Tlist_GainFocus_On_ToggleOpen = 1 let Tlist_Close_On_Select = 1 nnoremap <C-l> :TlistToggle<CR>
AfterColors
The vim-plugin-aftercolors package enables the vim/after/colors
directories (both local and system-wide) which allows settings in colorschemes to be overridden.
The local default location of ~/.vim/after/colors
is the typical directory to use, the directory will likely need to be created.
Overrides for the colorscheme resemble that which are in the colorscheme file itself. (Before altering the settings, it might be useful to read the colorscheme file to get ideas of what to do — authors sometimes leave notes, and current settings can be reviewed.) To override a setting, create a file with a name that matches the colorscheme name (e.g. ~/.vim/after/colors/desert.vim
) and enter an alternate setting. For example:
~/.vim/after/colors/desert.vim
highlight CursorLine ctermbg=232
If another instance of Vim is open and following saving an override, alterations can be tested by reloading the colorscheme:
colorscheme desert
Alterations can also be tested before an override is saved directly with Vim. For example, to list all the colorscheme settings:
:highlight
To see a specific setting (tip: have wildmenu enabled to see tab-completions):
:highlight CursorLine
To temporarily change a setting:
highlight CursorLine ctermbg=234
To know what color to use, the terminal color number will need to be obtained. Here’s a couple links with scripts and descriptions: link1, link2, link3.
Resources
Official
Tutorials
- vim Tutorial and Primer
- vi Tutorial and Reference Guide
- Graphical vi-Vim Cheat Sheet and Tutorial
- Vim Introduction and Tutorial
- Open Vim - Collection of Vim learning tools
- Learn Vim Progressively
- know vim [dead link 2014-10-29]
- Learning Vim in 2014
Videos
- Vimcasts - Screencasts in .ogg format.
- Vim Tutorial Videos - Covering the basics up to advanced topics.
Games
Example configurations
- nion's
- A detailed configuration from Amir Salihefendic
- Bart Trojanowski
- Steve Francia's Vim Distribution
- W4RH4WK's Vim configuration
- Fast vimrc/colorscheme from askapache
Other
- HOWTO Vim - Gentoo wiki article which this article was based on (author unknown).
- Vivify - A ColorScheme Editor for Vim
- Usevim - Frequently updated blog highlighting plugins, tips, etc
- Vim Awesome - A website that lists and ranks Vim plugins by popularity among GitHub users.
- Basic Vim Tips - A reference chart for Vim, primarily aimed at beginners.