Vertical Columns in Vim (“visual blocks”)

(Note that this was written after I spent a few months learning Vim. If you’re just stuck in Vim and want to get out, see What to do when you get stuck in a Vim editor).

I’m publishing my notes on the things that are useful in Vim but that I keep forgetting. My notes are split into four sections, so I’ll publish four posts:

This is the second post, and it’s about vertical columns of text (“visual blocks”). It’s the same functionality that you get using alt + click in a lot of other text editors.

  • Ctrl + v takes you into “visual block” mode, then use the up and down arrows.
  • Commands like x will work instantly
  • But if you want to do something like substitute (s) or append (A only, a won’t work) or change (c), you need to execute the full command first – at which point it will look like it’s only worked on one line – and then press Esc twice – and finally your change will appear on multiple lines.
  • If you want to type replacement text, you use insert mode but it has to be I instead of i (upper case instead of lower case). As with s, a and c you won’t see the full effect until you exit Insert mode AND visual mode (press Esc twice).
  • To insert one vertical column of text in front of another one:
    • Go to the place you’re copying from
    • Use ctrl+v to go into visual block mode
    • Use y to copy the highlighted text
    • Go to your destination
    • Use ctrl+v to select a column of text consisting of the first character of the place you want your new column to go in front of
    • Use I to go into insert mode, and type one space
    • Press Esc, and you’ll see you have inserted a column of single spaces
    • Now use ctrl+v again to highlight the column of spaces
    • Use p to paste your original column selection
    • There is an explanation here for why you can’t do it without typing the extra space: https://stackoverflow.com/questions/31893732/vim-how-do-i-paste-a-column-of-text-from-clipboard-after-a-different-column-o

 

Leave a Reply

Your email address will not be published. Required fields are marked *