130+ essential vim commands

by Jean.

Since the 70’s, vi and vim are very popular text editors among programmers. 5 years ago, I wrote an article named “100 vim commands every programmer should know” and here is a reworked, updated version. Enjoy!

This post is over 3 years old, please check the updated version.

Basics

:e filenameOpen filename for edition
:wSave file
:qExit Vim
:q!Quit without saving
:xWrite file (if changes has been made) and exit
:sav filenameSaves file as filename
.Repeats the last change made in normal mode

Moving in the file

k or Up Arrowmove the cursor up one line
j or Down Arrowmove the cursor down one line
emove the cursor to the end of the word
bmove the cursor to the begining of the word
0move the cursor to the begining of the line
Gmove the cursor to the end of the file
ggmove the cursor to the begining of the file
Lmove the cursor to the bottom of the screen
:59move cursor to line 59. Replace 59 by the desired line number.
20|move cursor to column 20.
%Move cursor to matching parenthesis
[[Jump to function start
[{Jump to block start

Cut, copy & paste

yCopy the selected text to clipboard
pPaste clipboard contents
ddCut current line
yyCopy current line
y$Copy to end of line
DCut to end of line

Search

/wordSearch word from top to bottom
?wordSearch word from bottom to top
*Search the word under cursor
/\cstringSearch STRING or string, case insensitive
/jo[ha]nSearch john or joan
/\< theSearch the, theatre or then
/the\>Search the or breathe
/fred\|joeSearch fred or joe
/\<\d\d\d\d\>Search exactly 4 digits
/^\n\{3}Find 3 empty lines
:bufdo /searchstr/Search in all open files
bufdo %s/something/somethingelse/gSearch something in all the open buffers and replace it with somethingelse

Replace

:%s/old/new/gReplace all occurences of old by new in file
:%s/onward/forward/giReplace onward by forward, case unsensitive
:%s/old/new/gcReplace all occurences with confirmation
:%s/^/hello/gReplace the begining of each line by hello
:%s/$/Harry/gReplace the end of each line by Harry
:%s/onward/forward/giReplace onward by forward, case unsensitive
:%s/ *$//gDelete all white spaces
:g/string/dDelete all lines containing string
:v/string/dDelete all lines containing which didn’t contain string
:s/Bill/Steve/Replace the first occurence of Bill by Steve in current line
:s/Bill/Steve/gReplace Bill by Steve in current line
:%s/Bill/Steve/gReplace Bill by Steve in all the file
:%s/^M//gDelete DOS carriage returns (^M)
:%s/\r/\r/gTransform DOS carriage returns in returns
:%s#<[^>]\+>##gDelete HTML tags but keeps text
:%s/^\(.*\)\n\1$/\1/Delete lines which appears twice
Ctrl+aIncrement number under the cursor
Ctrl+xDecrement number under cursor
ggVGg?Change text to Rot13

Case

VuLowercase line
VUUppercase line
g~~Invert case
vEUSwitch word to uppercase
vE~Modify word case
ggguGSet all text to lowercase
gggUGSet all text to uppercase
:set ignorecaseIgnore case in searches
:set smartcaseIgnore case in searches excepted if an uppercase letter is used
:%s/\<./\u&/gSets first letter of each word to uppercase
:%s/\<./\l&/gSets first letter of each word to lowercase
:%s/.*/\u&Sets first letter of each line to uppercase
:%s/.*/\l&Sets first letter of each line to lowercase

Read/Write files

:1,10 w outfileSaves lines 1 to 10 in outfile
:1,10 w >> outfileAppends lines 1 to 10 to outfile
:r infileInsert the content of infile
:23r infileInsert the content of infile under line 23

File explorer

:e .Open integrated file explorer
:SexSplit window and open integrated file explorer
:Sex!Same as :Sex but split window vertically
:browse eGraphical file explorer
:lsList buffers
:cd ..Move to parent directory
:argsList files
:args *.phpOpen file list
:grep expression *.phpReturns a list of .php files contening expression
gfOpen file name under cursor

Interact with Unix

:!pwdExecute the pwd unix command, then returns to Vi
!!pwdExecute the pwd unix command and insert output in file
:shTemporary returns to Unix
$exitRetourns to Vi

Alignment

:%!fmtAlign all lines
!}fmtAlign all lines at the current position
5!!fmtAlign the next 5 lines

Tabs/Windows

:tabnewCreates a new tab
gtShow next tab
:tabfirstShow first tab
:tablastShow last tab
:tabm n(position)Rearrange tabs
:tabdo %s/foo/bar/gExecute a command in all tabs
:tab ballPuts all open files in tabs
:new abc.txtEdit abc.txt in new window

Window spliting

:e filenameEdit filename in current window
:split filenameSplit the window and open filename
ctrl-w up arrowPuts cursor in top window
ctrl-w ctrl-wPuts cursor in next window
ctrl-w_Maximize current window vertically
ctrl-w|Maximize current window horizontally
ctrl-w=Gives the same size to all windows
10 ctrl-w+Add 10 lines to current window
:vsplit fileSplit window vertically
:sview fileSame as :split in readonly mode
:hideClose current window
:­nlyClose all windows, excepted current
:b 2Open #2 in this window

Auto-completion

Ctrl+n Ctrl+p (in insert mode)Complete word
Ctrl+x Ctrl+lComplete line
:set dictionary=dictDefine dict as a dictionnary
Ctrl+x Ctrl+kComplete with dictionnary

Marks

m {a-z}Marks current position as {a-z}
' {a-z}Move to position {a-z}
''Move to previous position

Abbreviations

:ab mail mail@provider.orgDefine mail as abbreviation of mail@provider.org

Text indent

:set autoindentTurn on auto-indent
:set smartindentTurn on intelligent auto-indent
:set shiftwidth=4Defines 4 spaces as indent size
ctrl-t, ctrl-dIndent/un-indent in insert mode
>>Indent
<<Un-indent
=%Indent the code between parenthesis
1GVG=Indent the whole file

CWC Special Deal!

Get one year of quality hosting + domain from A Small Orange for only $40 with our exclusive deal!

Featured WordPress Theme

Videobox - Video / Magazine / WooCommerce WordPress Theme

  • Some great stuff here, I learned a few new commands… However, I think you got a couple confused…

    G actually moves to the end of the file ($ is end of line)
    L actually moves to the bottom of screen

    THANKS!!!

  • In my case G goes to end of file, not end of line, I use $ to go to end of line. Typo?

  • I would add the commands for toggling line numbers to this list.

    :set nu

    And to turn them off

    :set nu!

  • Problem solved, thanks guys!

  • Bruno

    I’d add another really useful command, which I use every single day, several times:

    gx opens the url under the cursor in a new default browser windows\tab

    Thanks for the nice collection!

  • Chadsten

    It’s probably worth mentioning that you can use :wq to write the file and quit, with the same command. I find myself using that more often on server tasks, like editing conf files.

  • Are you sure about G and L? According to :help from my vim $ moves to end of line, G moves to last line of file (count)L moves to count screenlines from bottom

  • Dan

    gg=G is one keystroke shorter to indent the whole file 🙂

  • Oh great, now i learn some new commands!
    Excuse for my bad english 🙂

    Thank you for all

    Ale

  • romainl

    You may want to fix all those errors: http://www.reddit.com/r/vim/comments/1kfbvk/130_essential_vim_commands/cbofr3z

  • Colin

    Great post – there’s some real gems in here. However – lots of errors, too.

    In section “Search” –
    “Search the, theatre or then” – “the” and “theatre” should be italicized.
    For “Search all words of 4 letters” it should be “/\”, but you have “/\”.
    For “Search the” you have a space in the middle – “/\”, but it should be “/\”.
    “Search fred but not alfred or fredrick” should read “/\”, but you have “/\/”. Also, this is equivalent to the “Search the” example you give (which also has a typo – an extra space)
    “bufdo %s/something/somethingelse/g” is missing a leading colon.

    In section “Replace” –
    “:%s/onward/forward/gi Replace onward by forward, case unsensitive” should read “case insensitive” and this line is repeated a few lines later.
    “Delete all lines containing which didn’t contain string” should read “Delete all lines which don’t contain string”
    “:%s/ *$//g Delete all white spaces” should read “Deletes all trailing spaces”. To delete all trailing whitespace you need “:%s/\w*$//g”. To delete all whitespace you need “:%s/\s//g”.
    “ggVGg? Change text to Rot13” is slightly misleading. I would change it to “g? Rot13 selected text”

    There may be more, but I don’t have time to test the rest tonight. Will try to get through them all and give you feedback. Thanks.

    • Colin

      apparently posting to the blog strips angle braces – I’m reposting and trying to pre-escape them. The above should have read:

      Great post – there’s some real gems in here. However – lots of errors, too.

      In section “Search” –
      “Search the, theatre or then” – “the” and “theatre” should be italicized.
      For “Search all words of 4 letters” it should be “/\<\w\{4}\&gt”, but you have “/\< ¦.\>”.
      For “Search the” you have a space in the middle – “/\< the\>”, but it should be “/\<the\>”.
      “Search fred but not alfred or fredrick” should read “/\<fred\>”, but you have “/\/”. Also, this is equivalent to the “Search the” example you give (which also has a typo – an extra space)
      “bufdo %s/something/somethingelse/g” is missing a leading colon.

      In section “Replace” –
      “:%s/onward/forward/gi Replace onward by forward, case unsensitive” should read “case insensitive” and this line is repeated a few lines later.
      “Delete all lines containing which didn’t contain string” should read “Delete all lines which don’t contain string”
      “:%s/ *$//g Delete all white spaces” should read “Deletes all trailing spaces”. To delete all trailing whitespace you need “:%s/\w*$//g”. To delete all whitespace you need “:%s/\s//g”.
      “ggVGg? Change text to Rot13” is slightly misleading. I would change it to “g? Rot13 selected text”

      There may be more, but I don’t have time to test the rest tonight. Will try to get through them all and give you feedback. Thanks.

  • It is really great for you to comple all these vim commands. I salute you, and thank you!

  • Geee

    there is a mistake in the “Replace” Section:

    %s/\r/\r/g Transform DOS carriage returns in returns

    shouldn’t it be %s/\^M/\r/g ?

  • 130plus?! Wow! This is awesome!

  • Am new to Vim.. but its worth trying… thanks a lot for sharing

  • Wow! You are awesome for compiling these essential vim commands!

  • Good list you got here. These are essential vim commands indeed!

  • Jason Huebel

    The most useful vim command of all:

    alias vim=”nano”

    😉

  • Vim commands! Wow! you got it all here!

  • Jacques

    Great ! Thanks for this reminder.

    Let me add CTRL-a to increase a number (+1) and CTRL-x to decrease (-1)

    Very usefull when editing a bind zone file 🙂

  • FreeBird

    I tried the “1GVG=” in the normal mode to indent a C file, but it didn’t seem to work. Em…do I misunderstand this tip?

  • caimaoy

    cool

  • This is wicked. You should turn this into PDF format so we can download it and print it and stick it on our walls!

  • Mikhail GEYER

    Great list, but it lacks yw (yank word) command.