Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vim: insert the same characters across multiple lines

Tags:

vim

Sometimes I want to edit a certain visual block of text across multiple lines.

For example, I would take a text that looks like this:

name comment phone email 

And make it look like this

vendor_name vendor_comment vendor_phone vendor_email 

Currently the way I would do it now is...

  1. Select all 4 row lines of a block by pressing V and then j four times.
  2. Indent with >.
  3. Go back one letter with h.
  4. Go to block visual mode with Ctrlv.
  5. Select down four rows by pressing j four times. At this point you have selected a 4x1 visual blocks of whitespace (four rows and one column).
  6. Press C. Notice this pretty much indented to the left by one column.
  7. Type out a " vendor_" without the quote. Notice the extra space we had to put back.
  8. Press Esc. This is one of the very few times I use Esc to get out of insert mode. Ctrlc would only edit the first line.
  9. Repeat step 1.
  10. Indent the other way with <.

I don't need to indent if there is at least one column of whitespace before the words. I wouldn't need the whitespace if I didn't have to clear the visual block with c.

But if I have to clear, then is there a way to do what I performed above without creating the needed whitespace with indentation?

Also why does editing multiple lines at once only work by exiting out of insert mode with Esc over Ctrlc?


Here is a more complicated example:

name    = models.CharField( max_length = 135 ) comment = models.TextField( blank = True ) phone   = models.CharField( max_length = 135, blank = True ) email   = models.EmailField( blank = True ) 

to

name    = models.whatever.CharField( max_length = 135 ) comment = models.whatever.TextField( blank = True ) phone   = models.whatever.CharField( max_length = 135, blank = True ) email   = models.whatever.EmailField( blank = True ) 

In this example I would perform the vertical visual block over the ., and then reinsert it back during insert mode, i.e., type .whatever.. Hopefully now you can see the drawback to this method. I am limited to only selecting a column of text that are all the same in a vertical position.

like image 868
hobbes3 Avatar asked Mar 03 '12 20:03

hobbes3


People also ask

How do you repeat a character in Vim?

To insert some text repeatedly in Vim, say you want to insert '-' for 30 times. Thats it, you can use this to repeat any text in simple steps.

How do I change multiple lines in Vim?

You can edit multiple lines simultaneously by inserting text inside a multi-line selection in Vim : Use Ctrl+V to enter visual block mode Move down with jj to select the columns of text in the lines you want to comment. Then hit Shift+I and type the text you want to insert.


1 Answers

  1. Move the cursor to the n in name.
  2. Enter visual block mode (Ctrlv).
  3. Press j three times (or 3j) to jump down by 3 lines; G (capital g) to jump to the last line
  4. Press I (capital i).
  5. Type in vendor_. Note: It will only update the screen in the first line - until Esc is pressed (6.), at which point all lines will be updated.
  6. Press Esc.

mini-screencast demonstrating the method

An uppercase I must be used rather than a lowercase i, because the lowercase i is interpreted as the start of a text object, which is rather useful on its own, e.g. for selecting inside a tag block (it):

mini-screencast showing the usefulness of the 'it' text object

like image 95
icktoofay Avatar answered Oct 02 '22 15:10

icktoofay