100 Vim commands every programmer should know

by Jean. 132 Comments -

Since the 70′s, Vi is one of the programmer’s best friend. Nevermind you’re new to Vi or not, here’s a big list of 100 useful commands, organized by topic, which will make your coder life better.

This article has been updated! Click here to read the updated version.

Basics

:e filename Open filename for edition
:w Save file
:q Exit Vim
:w! Write file and quit

Search

/word Search word from top to bottom
?word Search word from bottom to top
/jo[ha]n Search john or joan
/\< the Search the, theatre or then
/the\> Search the or breathe
/\< the\> Search the
/\< ¦.\> Search all words of 4 letters
/\/ Search fred but not alfred or frederick
/fred\|joe Search fred or joe
/\<\d\d\d\d\> Search exactly 4 digits
/^\n\{3} Find 3 empty lines
:bufdo /searchstr/ Search in all open files

Replace

:%s/old/new/g Replace all occurences of old by new in file
:%s/old/new/gw Replace all occurences with confirmation
:2,35s/old/new/g Replace all occurences between lines 2 and 35
:5,$s/old/new/g Replace all occurences from line 5 to EOF
:%s/^/hello/g Replace the begining of each line by hello
:%s/$/Harry/g Replace the end of each line by Harry
:%s/onward/forward/gi Replace onward by forward, case unsensitive
:%s/ *$//g Delete all white spaces
:g/string/d Delete all lines containing string
:v/string/d Delete 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/g Replace Bill by Steve in current line
:%s/Bill/Steve/g Replace Bill by Steve in all the file
:%s/\r//g Delete DOS carriage returns (^M)
:%s/\r/\r/g Transform DOS carriage returns in returns
:%s#<[^>]\+>##g Delete HTML tags but keeps text
:%s/^\(.*\)\n\1$/\1/ Delete lines which appears twice
Ctrl+a Increment number under the cursor
Ctrl+x Decrement number under cursor
ggVGg? Change text to Rot13

Case

Vu Lowercase line
VU Uppercase line
g~~ Invert case
vEU Switch word to uppercase
vE~ Modify word case
ggguG Set all text to lowercase
:set ignorecase Ignore case in searches
:set smartcase Ignore case in searches excepted if an uppercase letter is used
:%s/\<./\u&/g Sets first letter of each word to uppercase
:%s/\<./\l&/g Sets 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 outfile Saves lines 1 to 10 in outfile
:1,10 w >> outfile Appends lines 1 to 10 to outfile
:r infile Insert the content of infile
:23r infile Insert the content of infile under line 23

File explorer

:e . Open integrated file explorer
:Sex Split window and open integrated file explorer
:browse e Graphical file explorer
:ls List buffers
:cd .. Move to parent directory
:args List files
:args *.php Open file list
:grep expression *.php Returns a list of .php files contening expression
gf Open file name under cursor

Interact with Unix

:!pwd Execute the pwd unix command, then returns to Vi
!!pwd Execute the pwd unix command and insert output in file
:sh Temporary returns to Unix
$exit Retourns to Vi

Alignment

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

Tabs

:tabnew Creates a new tab
gt Show next tab
:tabfirst Show first tab
:tablast Show last tab
:tabm n(position) Rearrange tabs
:tabdo %s/foo/bar/g Execute a command in all tabs
:tab ball Puts all open files in tabs

Window spliting

:e filename Edit filename in current window
:split filename Split the window and open filename
ctrl-w up arrow Puts cursor in top window
ctrl-w ctrl-w Puts cursor in next window
ctrl-w_ Maximise current window
ctrl-w= Gives the same size to all windows
10 ctrl-w+ Add 10 lines to current window
:vsplit file Split window vertically
:sview file Same as :split in readonly mode
:hide Close current window
:­nly Close all windows, excepted current
:b 2 Open #2 in this window

Auto-completion

Ctrl+n Ctrl+p (in insert mode) Complete word
Ctrl+x Ctrl+l Complete line
:set dictionary=dict Define dict as a dictionnary
Ctrl+x Ctrl+k Complete with dictionnary

Marks

mk Marks current position as k
˜k Moves cursor to mark k
d™k Delete all until mark k

Abbreviations

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

Text indent

:set autoindent Turn on auto-indent
:set smartindent Turn on intelligent auto-indent
:set shiftwidth=4 Defines 4 spaces as indent size
ctrl-t, ctrl-d Indent/un-indent in insert mode
>> Indent
<< Un-indent

Syntax highlighting

:syntax on Turn on syntax highlighting
:syntax off Turn off syntax highlighting
:set syntax=perl Force syntax highlighting
  • YRU2L8

    /\/ Search “fred” but not “alfred” or “frederick” — huh?

    Search exactly 4 numbers — digits

  • http://www.lyxia.org jbj

    Thanks for correcting my mistakes!

  • Sander

    Excellent! A very useful list. Thanks a lot.

  • MarkL

    I see a typo: Alignement >> Alignment

  • http://www.lyxia.org jbj

    Corrected. Thanks, Mark!

  • Pingback: Información de Tecnologías»Archivo del blog » 100 comandos de VIM que todo programador debe conocer

  • http://www.thejon.org Jon Keating

    In search…

    /\/ Search “fred” but not “alfred” or “frederick”

    There is no text here to indiciate a search for fred.

    In replace…

    :%s/old/new/gw Replace all occurences with confirmation

    There is no w flag, I believe you mean c. See help :s_flags

    In interact with unix…

    I think CTRL-Z and the fg command work better than :sh and exit. At least they are much easier to type.

    In text indenting…

    << Desindent … I believe “Un-indent” would be a better word. Or in fact, it is not indenting, it is shifting.

    Didn’t check all, but those are what stood out.

    Jon

  • http://billsmind.com Billco

    Most important command ever:

    :q!
    cd /usr/ports/editors/nano
    make install

    I really don’t understand why people still use VI. At least Emacs has its own operating system :P

  • Russia

    Stupid american

    • http://twitter.com/designeronduty Sergei Tatarinov

      This person is either a scam, pretending to write on behalf of a Russian so others continue to think all Russians are like this, or a typical representative of Proud-to-be-a-jerk Community of Russia. I’m sorry for this off-topic rant – I only want people to know that there is a black sheep in every family. ;)

  • http://www.lyxia.org jbj

    @Jon Keating: Thanks :)
    @Russia: I may be stupid, but a sure thing is that I’m not American: I live in Belgium and come from France ;)

  • Pingback: Modifier les couleurs du thème OpenBook

  • Naveed

    Great list. Here is one of my favorite tricks:

    map j
    map k
    map gt
    map gT

    This will let you switch between tabs and windows by using a combination of the control key and h,j,k, and l. For example, to move to the top window, you can press ctrl-k. To move to the tab on the right, you can press ctrl-l.

    • kapu

      I like this idea. Can you elaborate on what was mangled? I could google it but why not ask here because the mapping sounds very intuitive and I would like to try it out. Thanks.

  • Naveed

    Ignore my previous comment, since it seems like the comment system mangled up my text because it had less-than and greater-than characters in it.

  • http://www.lyxia.org jbj

    @Naveed: Yeah, sadly WordPress comments system always break code and/or commands. I didn’t knew the tips you submitted, so I’m going to check it out.

  • Anon

    Interesting list but how can you not mention the awesome * or some of the tips on http://www.vim.org/tips/tip.php?tip_id=305 ? : )

  • http://www.lyxia.org jbj

    @Anon: The vim.org tips are indeed very helpful, but for this list, I didn’t wanted to re-use 75% of these tips. Though, I should have gave the link just as you did. Thanks!

  • http://www.pixelbeat.org/ Pádraig Brady

    Here’s the list I created when learning vim:

    http://www.pixelbeat.org/vim.tips.html

  • http://www.lyxia.org jbj

    Nice list Pádraig, thanks for sharing!

  • Pingback: » 100个vim用户应该知道的命令 » WEB实用技术文摘

  • Aaron

    @Bill – Nano over VIM?

    I love VIM, mostly because of the syntax highlighting on the myriad of different file types as they are being edited, I can quickly spot any syntax typos I may have fat-fingered in.

    Thanks for sharing this. =]

  • dummy

    I liked the :Sex part. You’ll want if you’re trying to peek at some other files.

  • http://juljas.net/ Jan Slupski

    s/Delete \zsall\ze white spaces/trailing/

    ;-)

  • carl

    what no mention of dot? (repeats the last edit you made)
    It’s actually one of my favourite commands.

  • http://www.lyxia.org jbj

    @carl: I didn’t know that one! thanks for sharing.

  • stephen

    Really love the t + char pattern

    For instance
    “hi I am foo line” with the cursor on the first “, c+t+” gives you
    “” and leaves you in insert mode between the “”

  • http://juljas.net/ Jan Slupski

    I would probably add next dozen of my favorites, but at least some esp. useful for programmers:
    % – jump to matching parenthesis
    =% – indent the code between parenthesis
    [[ – jump to function start
    [{ – jump to block start
    * – search the word under cursor
    :new abc.txt – edit abc.txt in new window

    • steve

      a new vim command ‘=%’, thank you. :)

  • http://www.lyxia.org jbj

    @Jan: Great ones! I should think about creating a second list with all commands submitted by readers :)

  • http://raffy.ch/blog Raffy

    I have some more things that you might find useful on my VIM site.

  • http://wpkg.org sileNT

    And what does:

    :emacs

    do? ;)

  • http://www.lyxia.org jbj

    @Raffy: Excellent website! I haven’t the time to check it all, but I really liked what I saw.

  • Reid

    ggguG is wrong, that makes the file lowercase. gggUG makes the file uppercase. However, why you should know this command combo over the separate commands gg, gu/U, and G, I don’t know.

  • http://krzysztofglaz.eu.org Erewhon

    Great list. Thanks. [:wq]

  • http://www.lyxia.org jbj

    @Reid: You’re right. Sorry for the mistake! I just corrected it, thanks for telling me.

  • Alex

    gg=G — indent all lines in the file
    shift-v curlybracket control-v shift i # escape — adds #’s in front of all of the lines in that chunk of code
    let @a=@* — copies the contents of register a to the systemwide paste bin
    bufdo %s/something/somethingelse/g — changes “something” to “somethingelse” in all the open buffers
    :tabnew — opens a new tab

    – Vim rocks.

  • Pingback: ProjectX Blog » Blog Archive » Xlinks - 2 / 7 / 2008

  • Pingback: Skitzot’s Blog » 100 Vim commands every programmer should know

  • bobbydigital

    I find :Hex more useful than :Sex, even though I like sex :p

  • fiedor

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

    doesn’t miss anything here? It simply replaces all x0d with x0d …

  • Pingback: links for 2008-07-03 « My Weblog

  • Pingback: Wordpress How to: Customize OpenBook theme color scheme

  • http://www.crankup.net shoban

    Excellent list.. I have used vi.. but never realised it had so many commands. :)

  • http://www.lyxia.org jbj

    Thanks, shoban. Vi have much more commands than only theses ones :)

  • Bernhard

    The pattern to get rid of d part of DOS line-feeds in an entire document is
    :%s/^M//g
    Where you must input the “^M” pattern by holding down Ctrl while typing “vm”

    If you often exchange text files with Macs then this replacement comes in handy
    :%s/^M/\r/g

  • http://www.lyxia.org jbj

    @Bernhard: Thank you for theses useful contributions!

  • Pingback: links for 2008-07-03 « that dismal science

  • Pingback: it’s about time» Blog Archive » links for 2008-07-04

  • http://minanov.com Kiril Minanov

    Very nice

    I would add “set wrap” and “set nowrap” commands. With those commands you can enable and disable text wrapping on vi editor

    Great work man

    • Jack

      I know this is several year later. I mapped this to the F12 key. It isn’t original with me. I don’t remember where I got it.

      :se wrap!

      Now you can toggle between wrap and nowrap with the press of a key.

  • http://none barf

    and what about copy/paste?

  • http://www.lyxia.org jbj

    Kiril, I’m glad you liked the list! And thanks for submiting more commands!

  • http://www.lyxia.org jbj

    @barf: You’re right, I should have inclued at least basic copy/paste functions (y and p)

  • http://www.artologics.com/ shopping cart

    Hi,

    That is really a very useful list.
    Thanks for the list.

  • L’ineptocide

    Thanks, that’s pretty usefull.

    But actually:

    ctrl-w_ maximize vertically and
    ctrl-w| maximize horizontally.

  • Pingback: blog.masuran.org » Blog Archive » 100 Vim commands every programmer should know

  • Pingback: Adolfsson’s blog » Blog Archive » Bookmarks for July 30, 2008

  • Pingback: 100 Vim commands every programmer should know : HowtoMatrix

  • Pingback: The best VIM command reference ever « Markus Feilner’s Blog

  • Apurv

    Wonderful list I must say specially the Explorer commands.
    I have been using vi for a long time but didn’t know.
    Thanks a lot.

  • http://spf13.com Steve

    I have posted a customize vim guide which can be found here Customizing Vim . It goes the next step beyond usage, which is customizing VIM for a better experience.

  • http://www.kremlin.ru/ aXine~D

    vim is the best editor I’ve ever used. Thanks for this really usefull list.

  • http://jamielesouef.com Jamie Souef

    i can’t stand vi.. but one of the servers i manage doesn’t have anything else on it so it’s all i can use. Thanks for the list, would you mind if i re-blogged this over at my blog? (linking to the source natural)

  • http://www.lyxia.org jbj

    @Jamie: No problem!

  • sudha

    Great BLog. I am taking a print of this. Thanks 4 sharing it on web.

  • http://sugahere.blogspot.com Suganthi

    Very useful. It will come handy when searching for Commands

  • http://www.cts-media.eu CTS

    Thanks for my new bookmark!

    One of the best commands is certainly ggVGg? ;)

  • debil

    Good list. BTW, you can rot13 whole buffer also with “ggg?G”. No need for V, one step less :)

  • debil

    Digraphs are a great feature in Vim. To type a special character, hit ctrl-k in insert mode and type two-character code. Check out the list of availale characters with :digraphs.

  • Pingback: /*служебное */ vim tips « У пошуках свайго выраю

  • Pingback: proft.com.ua » Blog Archive » Vim - наше все!

  • Pingback: <will-bloggs-too> » Blog Archive » useful vim commands

  • http://www.redips.net/ www.redips.net

    This was very useful. I searched for command to convert text to lower case and I found it here. You can also set all text to the upper case with gggUG.
    Cheers!

  • Pingback: S A P O R R A ! ! ! » Blog Archive » Linux > Nerd > VIM, vi e venci

  • Pingback: [OT] 100 przydatnych komend vim-a | hilpers

  • Pingback: TuxZ » 100 comandos do VIM que todo programador deveria saber

  • Pingback: » [Dica] VI - 100 Comandos

  • http://gurka.se/ Tim

    Very helpful. Thanks!

  • http://superobscure.com Jake Achée

    Let me be the next to say: this is a very nice list. I love vi (and vim, too) and there were several tricks that I didn’t know about on the list.

    Thanks for posting.

    (I came in via Hacker News)

  • alexandru

    every once in a while I see a cheat sheet of vi(m) commands. unfortunately most of them forget to teach the basics: motion.

    for example:
    ggguG is not a random key combination (as begginers tend to believe), its gg (goes to begin of file), gu changes to lowercase, G goes to end of file.

    so long,
    alexandru

    • kapu

      Thanks for that. Makes sense now.

  • Basque

    I’m almost newbie in the church of Vim and I’m enjoining it by learning new things every day.

    Nice post. Thanks.

  • http://www.it-blog.net Pascal

    Thank you so much for this command list. It’s very helpful!

    Regards,
    Pascal

  • Pingback: links for 2009-02-02 « jasonmcdermott.net

  • Pingback: Azone’s Blog » 100 Vim commands every programmer should know

  • Kedar Mhaswade

    Since the 70’s, Vi is one of the programmer’s best friends, not friend.

  • grgfg

    Vim is sh it.
    How many command u MUST know for ONLY editing?
    Commands like: “%$#%$#% 4354 543543543543 54rt5^%$^%$^$ ^%$” for change some words?!
    BULLSHIT!

    • kapu

      lmao! As if a gui is any clearer at first look. Like looking at an aircraft control panel at first on some editors. I prefer clean lines and more room for editing than having fifteen lines of toolbars with pictures of who knows what meaning god knows what.
      There are no more vi commands than there are conceptual needs. And, at least, when you learn concepts, they can have a logical flow, and they can be built upon with a logical continuity. Not really so for clickable blocks with pictures on them.
      If you gave vi a chance, you would find a real beauty in its design. And would come to appreciate it for what it can do for you. But, sadly it is not for those too impatient to pay the dues to get there.

  • http://www.fofo-vb.com/vb منتديات لحظة

    I’m almost newbie in the church of Vim and I’m enjoining it by learning new things every day.

  • http://web.bizbangladesh.com/website_design_development.html We programmers

    Great list. i print it. Really useful for programmers.
    Thanks for sharing this information

  • Danilo De Martin

    :%s/old/new/gw Replace all occurences with confirmation

    I think the right way is :%s/old/new/gc

    Great list. Thanks Jean-Baptiste.

    Danilo De Martin

  • Pingback: 10 code snippets to interact with Twitter « Doeasyway

  • Pingback: vim or not vim? that’s the question. » all-IT

  • Pingback: 10 code snippets to interact with Twitter | Cosmos Blog -- Internet News,Life,Culture,Polices,Resource,Make Money

  • Pingback: 10+ WordPress plugins for developers | eBookTM | Download eBook, Wordpress Tips

  • Pingback: 10 code snippets to interact with Twitter | meshdairy

  • Pingback: Sean (endersyrinx) 's status on Friday, 30-Oct-09 19:04:08 UTC - Identi.ca

  • Maryam

    Hi. your blog was very useful to me. I’ve just started to learn linux and Vi. I found it much enjoyable and interesting. Your list can help me so much.

    truly yours,
    Thank you.

  • Pingback: Read This Link » 100 Vim commands every programmer should know

  • valtert

    /\cstring -> find SRING or string (case insensitive)

  • Josay

    “:w! Exit Vim without saving”

    Isn’t the ‘!’ used to force the saving?
    Mixed up with “:q!”

  • Nick

    There would be nice if your website had a PRINT button.
    nice list

    Thank you

  • santosh mishra

    It is really good collection ….

    but i want to know that where i can open a new tab in a file with diffrent file location ?

  • http://rickydoesit.com ricky

    You need to add the shortcuts for how to move to the next file once you have the file browser open in the CLI using ‘:e .’ command. It’s impossible for us to know

  • ChrisR

    I didn’t see my all-time favorite command–the one that keeps me from moving to any other editor, the period “.” command. It redoes the last command. I use it all the time.

  • Arun

    Hi..is there any command for “searching a string in between two line numbers”.
    Say, I want to search a string “develop” in between line numbers 10 and 100..Please help..

    • steve

      @Arun,

      put these lines in your .vimrc

      set incsearch ” find as you type search
      set hlsearch ” highlight search terms
      set ignorecase ” case insensitive search
      set number ” turns on line numbering

      then I’d simply10G (Goto line 10) hit /string and it will jump to the next occurrence of string (with all others highlighted) you can use n to jump to the (n)ext occurrence until the line numbers show you’re at or past line 100.

      Then :noh removes the highlighting.

  • http://webbaverse.com/ Guillermo Amaral

    I think you have “:w!” as exit without saving, but I’m sure that is force save.
    “:q!” should close without saving and “:qa!” exit without saving (if more than one buffer is open)

    Cheers

    • pDale Campbell

      @GAmaral is right. Close w/o save is “:q!” “:w!” will overwrite a write-protected file without asking! Please fix this before some newbie has a HORRIBLE experience! :)

      • Paul

        Note that it will only overwrite a write-protected file if it has the ability to change the file permissions. eg, a normal user won’t be able to force-write over /etc/passwd since they can’t change the permissions on the file.

  • Paul

    How do I do this command in your list:

    d™k Delete all until mark k

    ? wheres the TM button?

    • pDale Campbell

      The keystroke sequence is
      1. lowercase d
      2. either the apostrophe (if you want to delete whole lines)
      or the backwards apostrophe (to delete chars)
      3. the letter of the mark

  • Dan

    Great List! Thank you.
    Using gg=G to indent the whole file is very nice, but afterwords the cursor is allways in the first line.

    Is there any way I can indent the whole file and still stay in the line I am currently in?

    If anyone knows a nmap or something to solve this, I’d be very interested!

    Thanks

    • steve

      Hmm, A quick response that may or may not be quite what you’re looking for:

      gi will take you back to point of last editing and leave you in insert mode which, assuming your had just completed an edit prior to whole of file indenting, would bring you back to the line you were currently in.

    • steve

      marks will also do what you want (sorry it took me a while to remember)

      In normal mode type ‘mx’ (where x is any letter you want – e.g. ma).
      Later either `a or ‘a will return you to the line (`a backtick+a takes you to the exact position, ‘+a takes you to the beginning of line).

  • Daniel

    Not sure if it was mentioned, but hitting J will move the next line to the end of the current line. I find it useful sometimes when coding.

  • http://www.markandey.com Markandey Singh

    AWESOME Thanks man!

  • http://www.leandrouti.net Leandro

    Nice article.

    Started to use VIM very long ago, but just to edit some basic files. Just open, press i and modify some text and then press ESC and wq =)
    Recently can see the power of the vim!

    Your list is very useful for me.

    Thanks

  • 2husher

    You made a mistake in one of the most important command.
    To exit Vi without saving you must type – :q!
    If you type – :w! – as in your post, you simply save changes to the file.
    Correct it please.

  • trong.tran

    How can :w! quit vim without saving file? The command should be `:q!`

  • http://www.donesmart.com/ David

    Awesome list. After years of ignoring it, I’m finally coming round to using VIM – the initial learning curve is off-putting, but it’s worth it in productivity boost once get past that.

  • Ghani

    Nice note for DBAs.Thanks

  • http://www.mahbubblog.com Mahbubur Rahman

    My Fav Command not in the list 1GVG= which indents the whole file :)

    But anyways, nice collection. Bookmarked!!

  • http://sites.google.com/site/sandybiotek sandeep singh

    :w! Exit Vim without saving

    Correct one is
    :q! Exit Vim without saving

  • sourjya

    :w! does not quit without saving but saves without quitting. To quit without saving and without producing a warning type :q!

  • http://nicolas.steinmetz.fr/ Nicolas Steinmetz

    In the basics, you should have “:x” which is the same and shorter than “:wq” for save and quit.

    Thanks for the other ones, I did’nt know a lot of them !

  • Thomas

    :%s/onward/forward/gi Replace onward by forward, case unsensitive

    unsensitive isn’t a word. (Hint: the i in the command stands for insensitive) ;P

  • Nicolai

    Got four commands down and BAM! right there! An insanely obvious error! Every programmer should know that :w! does NOT quit without saving. Rather, it does the opposite!

  • j0n3

    Commenting all lines on matching pattern TEXT:

    :%s/\(.*TEXT.*)/\/\/\1/g

    Example:

    this line do not match the pattern
    //this line matches TEXT

  • j0n3

    *does*

  • http://majorursa.net Bart

    Very good command list! I think you want `k or ‘k as “return to k mark” though.