back to listing index

How do I insert text at beginning of a multi-line selection in vi/Vim?

[web search]
Original source (stackoverflow.com)
Tags: vim multi-line
Clipped on: 2018-07-14

In Vim, how would I go about inserting characters at the beginning of each line in a selection?

For instance, let's say I want to comment out a block of code by prepending // at the beginning of each line (assuming my language's comment system doesn't allow block commenting like /* */). How would I do this?

asked Oct 31 '08 at 12:55
Jordan Parmer
19.5k2083110
up vote 563 down vote accepted
  • Press Esc to enter 'command mode'
  • Use Ctrl+V to enter visual block mode
  • Move Up/Downto select the columns of text in the lines you want to comment.
  • Then hit Shift+i and type the text you want to insert.
  • Then hit Esc, wait 1 second and the inserted text will appear on every line.
answered Oct 31 '08 at 13:02
pixelbeat
22.1k84249

This replaces the beginning of each line with "//":

:%s!^!//!

This replaces the beginning of each selected line (use visual mode to select) with "//":

:'<,'>s!^!//!

Note that gv (in normal mode) restores the last visual selection, this comes in handy from time to time.

answered Oct 31 '08 at 12:59
Tomalak
247k51409528

The general pattern for search and replace is:

:s/search/replace/

Replaces the first occurrence of 'search' with 'replace' for current line

:s/search/replace/g

Replaces all occurrences of 'search' with 'replace' for current line, 'g' is short for 'global'

This command will replace each occurrence of 'search' with 'replace' for the current line only. The % is used to search over the whole file. To confirm each replacement interactively append a 'c' for confirm:

:%s/search/replace/c

Interactive confirm replacing 'search' with 'replace' for the entire file

Instead of the % character you can use a line number range (note that the '^' character is a special search character for the start of line):

:14,20s/^/#/

Inserts a '#' character at the start of lines 14-20

If you want to use another comment character (like //) then change your command delimiter:

:14,20s!^!//!

Inserts a '//' character sequence at the start of lines 14-20

Or you can always just escape the // characters like:

:14,20s/^/\/\//

Inserts a '//' character sequence at the start of lines 14-20

If you are not seeing line numbers in your editor, simply type the following

:set nu
answered Oct 6 '10 at 18:05
cyber-monk
4,33052338

Another way that might be easier for newcomers:

 some█
 code
 here

Place the cursor on the first line, e.g. by

: 1 Enter

and type the following to get into insert mode and add your text:

I / / Space

 // █some
 code
 here

Press Esc to get back to command mode and use the digraph:

j . j .

 // some
 // code
 //█here

j is a motion command to go down one line and . repeats the last editing command you made.

answered Apr 8 '09 at 20:15
ninegrid
1,3081017
  • Thats really simple :). If you are having trouble with it may be because you are typing a bar (the other symbol with your \ ) | instead of a capital I. I thought it was a | at first. – cokedude Feb 28 '14 at 17:30
  • If I do "5." it deletes 5 character from same line. How do I make it delete 5 character at once from each line ? – Rahul Prasad Jun 24 '15 at 6:58
  • @RahulPrasad Let's say you have 25 lines, then beginning at the front of the first line just record 5xj into a register and play that register 24 times, for example: qa5xjq25@a But it would be better if you posted this as an actual question if it doesnt exist already... – ninegrid Mar 1 '16 at 7:03

And yet another way:

  • Move to the beginning of a line
  • enter Visual Block mode (CTRL-v)
  • select the lines you want (moving up/down with j/k, or jumping to a line with [line]G)
  • press I (that's capital i)
  • type the comment character(s)
  • press ESC
answered Nov 20 '08 at 19:51
Steve K
8691715

This adds # at the beginning of every line:

:%s/^/#/

And people will stop complaining about your lack of properly commenting scripts.

answered Jan 8 '10 at 21:00
Jar-jarhead
16112

If you want to get super fancy about it, put this in your .vimrc:

vmap \c :s!^!//!<CR>
vmap \u :s!^//!!<CR>

Then, whenever in visual mode, you can hit \c to comment the block and \u to uncomment it. Of course, you can change those shortcut keystrokes to whatever.

answered Oct 31 '08 at 13:31
Lucas Oman
12.8k13945

Yet another way:

:'<,'>g/^/norm I//

/^/ is just a dummy pattern to match every line. norm lets you run the normal-mode commands that follow. I// says to enter insert-mode while jumping the cursor to the beginning of the line, then insert the following text (two slashes).

:g is often handy for doing something complex on multiple lines, where you may want to jump between multiple modes, delete or add lines, move the cursor around, run a bunch of macros, etc. And you can tell it to operate only on lines that match a pattern.

answered Nov 2 '08 at 0:00
Brian Carper
56.8k24140162

For commenting blocks of code, I like the NERD Commenter plugin.

Select some text:

Shift-V
...select the lines of text you want to comment....

Comment:

,cc

Uncomment:

,cu

Or just toggle the comment state of a line or block:

,c<space>
answered Aug 29 '09 at 18:27
Kevin
4801410

I can recommend the EnhCommentify plugin.

eg. put this to your vimrc:

let maplocalleader=','
vmap <silent> <LocalLeader>c <Plug>VisualTraditional
nmap <silent> <LocalLeader>c <Plug>Traditional
let g:EnhCommentifyBindInInsert = 'No'
let g:EnhCommentifyMultiPartBlocks = 'Yes'
let g:EnhCommentifyPretty = 'Yes'
let g:EnhCommentifyRespectIndent = 'Yes'
let g:EnhCommentifyUseBlockIndent = 'Yes'

you can then comment/uncomment the (selected) lines with ',c'

answered Nov 2 '08 at 0:12
Benedikt Waldvogel
7,62373649

Mark the area to be comment as a visual block (<C-V)

and do c#<ESC>p

  1. change it to "#"
  2. put it back

If you do it often, define a short cut (example \q) in your .vimrc

:vmap \q c#<ESC>p
answered Sep 29 '15 at 11:39
JJoao
2,563917

Your Answer

 
community wiki

Not the answer you're looking for? Browse other questions tagged or ask your own question.

asked

9 years, 8 months ago

viewed

261,987 times

active

24 days ago

Get the weekly newsletter! In it, you'll get:

  • The week's top questions and answers
  • Important community announcements
  • Questions that need answers

see an example newsletter