How to insert a block of white spaces starting at the cursor position in vi?

61,709

Solution 1

I'd use :%s/^/ /

You could also specify a range of lines :10,15s/^/ /

Or a relative range :.,+5s/^/ /

Or use regular expressions for the locations :/A/,/D/>.

For copying code to paste on SO, I usually use sed from the terminal sed 's/^/ /' filename


Shortcut

I just learned a new trick for this. You enter visual mode v, select the region (with regular movement commands), then hit : which gives you this:

:'<,'>

ready for you to type just the command part of the above commands, the marks '< and '> being automatically set to the bounds of the visual selection.

To select and indent the current paragraph:

vip>

or

vip:>

followed by enter.

Edit:

As requested in the comments, you can also add spaces to the middle of a line using a regex quantifier \{n} on the any meta-character ..

:%s/^.\{14}/& /

This adds a space 14 chars from the left on each line. Of course % could be replaced by any of the above options for specifying the range of an ex command.

Solution 2

When on the first A, I'd go in block visual mode ctrl-v, select the lines you want to modify, press I (insert mode with capital i), and apply any changes I want for the first line. Leaving visual mode esc will apply all changes on the first line to all lines.

Probably not the most efficient on number of key-strokes, but gives you all the freedom you want before leaving visual mode. I don't like it when I have to specify by hand the line and column range in a regex command.

Solution 3

I'd use >}.

Where...

  • >: Shifts right and
  • }: means until the end of the paragraph

Hope this helps.

Solution 4

  1. Ctrl + v (to enter in visual mode)
  2. Use the arrow keys to select the lines
  3. Shift + i (takes you to insert mode)
  4. Hit space keys or whatever you want to type in front of the selected lines.
  5. Save the changes (Use :w) and now you will see the changes in all the selected lines.

Solution 5

I would do like Nigu. Another solution is to use :normal:

  1. <S-v> to enter VISUAL-LINE mode
  2. 3j or jjj or /D<CR> to select the lines
  3. :norm I<Space><Space>, the correct range ('<,'>) being inserted automatically

:normal is probably a bit overkill for this specific case but sometimes you may want to perform a bunch of complex operations on a range of lines.

Share:
61,709
nye17
Author by

nye17

coding is boring.

Updated on March 16, 2021

Comments

  • nye17
    nye17 almost 3 years

    Suppose I have the piece of text below with the cursor staying at the first A currently,

    AAAA
    BBB
    CC
    D
    

    How can I add spaces in front of each line to make it like, and it would be great if the number of columns of spaces can be specified on-the-fly, e.g., two here.

      AAAA
      BBB
      CC
      D
    

    I would imagine there is a way to do it quickly in visual mode, but any ideas?

    Currently I'm copying the first column of text in visual mode twice, and replace the entire two column to spaces, which involves > 5 keystrokes, too cumbersome.

    Constraint:

    Sorry that I didn't state the question clearly and might create some confusions.

    The target is only part of a larger file, so it would be great if the number of rows and columns starting from the first A can be specified.

    Edit:

    Thank both @DeepYellow and @Johnsyweb, apparently >} and >ap are all great tips that I was not aware of, and they both could be valid answers before I clarified on the specific requirement for the answer to my question, but in any case, @luser droog 's answer stands out as the only viable answer. Thank you everyone!

  • nye17
    nye17 over 12 years
    you mean in visual mode right? I only use this when the number of spaces is the same as what I specified in vimrc for the indentation....
  • johnsyweb
    johnsyweb over 12 years
    This is in normal mode. You didn't specify the shift-width (or at least you hadn't when I answered).
  • luser droog
    luser droog over 12 years
    @nye17: you don't set shiftwidth=4 softtabstop=4 expandtab ?
  • nye17
    nye17 over 12 years
    @luserdroog yep, I did have them set.
  • luser droog
    luser droog over 12 years
    @nye17: cool. just checking. I didn't learn about expandtab until very recently.
  • nye17
    nye17 over 12 years
    Oh! This is actually very great trick! Whatever change for the first line will end up being applied to the rest of the selected block! Thanks for sharing!
  • Codie CodeMonkey
    Codie CodeMonkey over 12 years
    That's what's fun about VIM, there's always something to discover. This was new to me.
  • luser droog
    luser droog almost 11 years
    Wow, you already told us about this! I +1-ed it, but I must not have read it very closely. :normal is my new friend.
  • romainl
    romainl almost 11 years
    :normal will be your friend forever.
  • HenioJR
    HenioJR over 6 years
    And to add blankspace after 14 characters in all lines of file?
  • luser droog
    luser droog over 6 years
    This should do it: :%s/^.\{14}/& /
  • Eliethesaiyan
    Eliethesaiyan over 5 years
    This actully does ident from the most left of the file,not the original position if it was already indented
  • D. Ben Knoble
    D. Ben Knoble over 4 years
    Er, why vip>? Just >ip
  • Nijat Aliyev
    Nijat Aliyev about 2 years
    This is the best and shortest solution