How to insert text at beginning of a multi-line selection in vi/Vim

VimEditingViemu

Vim Problem Overview


In Vim, how do I insert characters at the beginning of each line in a selection?

For instance, 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?

Vim Solutions


Solution 1 - Vim

  • 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.

For further information and reading, check out "Inserting text in multiple lines" in the Vim Tips Wiki.

Solution 2 - Vim

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.

Solution 3 - Vim

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

Solution 4 - Vim

Another way that might be easier for newcomers:

 some█
 code
 here

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

gg

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.

Solution 5 - Vim

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

Solution 6 - Vim

This adds # at the beginning of every line:

:%s/^/#/

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

Solution 7 - Vim

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.

Solution 8 - Vim

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.

Solution 9 - Vim

To insert "ABC" at the begining of each line:

  1. Go to command mode

  2. % norm I ABC

Solution 10 - Vim

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>

Solution 11 - Vim

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'

Solution 12 - Vim

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

Solution 13 - Vim

In case someone's multi-line-selection is actually a paragraph, there is no need to manually select the lines. vim can do that for you:

  1. vip: select and mark the whole paragraph
  2. shift-i: insert text at line beginning
  3. escape: leave insert mode/enter normal mode [line beginnings still selected]
  4. escape: unselect line beginnings

Solution 14 - Vim

Mapping of most voted answer:

1st visual select the desired lines, then execute <leader>zzz, which values:

vnoremap <leader>zzz <C-V>^I-<Space><Esc>
  • <C-V> to enter visual mode
  • ^ goes to start of line ( or use '0' to 1st non blank)
  • I to insert in block mode
  • -<Space> to insert '- ' (for example, edit as you need)
  • <Esc> to apply same insert to all visual block lines

Or of last visual selection from normal mode:

nnoremap <leader>zzz gv<C-V>^I-<Space><Esc>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJordan ParmerView Question on Stackoverflow
Solution 1 - VimpixelbeatView Answer on Stackoverflow
Solution 2 - VimTomalakView Answer on Stackoverflow
Solution 3 - Vimcyber-monkView Answer on Stackoverflow
Solution 4 - VimninegridView Answer on Stackoverflow
Solution 5 - VimYewgeView Answer on Stackoverflow
Solution 6 - VimJar-jarheadView Answer on Stackoverflow
Solution 7 - VimLucas OmanView Answer on Stackoverflow
Solution 8 - VimBrian CarperView Answer on Stackoverflow
Solution 9 - VimMacView Answer on Stackoverflow
Solution 10 - VimKevinView Answer on Stackoverflow
Solution 11 - VimBenedikt WaldvogelView Answer on Stackoverflow
Solution 12 - VimJJoaoView Answer on Stackoverflow
Solution 13 - VimTheUnseenView Answer on Stackoverflow
Solution 14 - VimXopi GarcíaView Answer on Stackoverflow