Notes (PVIM 04/21): Visual Mode

Chapter 4: Visual Mode

Grok Visual Mode

Visual mode in vim is analogous to text selection in other editors. There are three different types of Visual mode:

Mode Key Effect
Normal v switch to characterwise-visual mode
Normal V switch to linewise-visual mode
Normal <C-v> switch to blockwise-visual mode

The important thing to keep in mind with Visual mode is that when we select text in it, commands that would take a motion in normal mode (like d or c) will instead operate on our selection. So daw (delete a word) and vawd (visual-select a word and delete) do the same thing. The only difference between the two is if that visual mode always selects the character the cursor is on, so v can turn character exclusive motions like b or h into character inclusive motions. For example, dh deletes the character to the left of the cursor, but dvh deletes the character to the left of the cursor and also the character under the cursor).

Meet Select Mode

On second thought let’s not meet select mode, ’tis a silly place.

todo: https://i.imgur.com/sbuOHyB.png

Seriously, you don’t need to know this. I’m not even going to write down the commands; you’ll never need to use them, except maybe if you’re using a plugin (like for code snippets) that relies on Select mode. However, in that case you’ll want to learn how to use Select mode from the plugin docs, since the plugin will almost certainly modify the mode’s behavior.

Define a Visual Selection

Mode Key Effect
Normal gv reselect last visual selection
Visual v switch visual to characterwise mode
Visual V switch visual to linewise mode
Visual <C-v> switch visual to blockwise mode
Visual o go to other end of selected text

Repeat Line-Wise Visual Commands

Firstly, manually setting ‘shiftwidth’ and ‘softtabstop’ is unnecessary if you’ve already set ‘filetype indent on’, which automatically changes indentation settings based on the type of file you’re editing.

Secondly, the sequence to do double indents in the example is great. Yes, you can do 2> instead of >., but honestly I don’t like counting. When you indent one level at a time you gain a lot of optionality, because the > command gets put in the . (previous command) register. Want to indent one more? Press . again. One less? Undo with u.

On the other hand, using visual mode here at all is a little questionable, since > already takes a motion, so >j. is simpler. But often there isn’t a great way to move to the end of the selection you want to indent (without counting, which I hate). In that case I would use linewise visual mode from the start of the selection I wanted, try to jump as close as possible to the end, and make adjustments with j and k, or maybe with another motion.

Prefer Operators to Visual Commands Where Possible

Mode Key Effect
Visual u make selection lowercase
Visual U make selection uppercase
Normal gu make {motion} lowercase
Normal gU make {motion} uppercase

This section reiterates the lesson that making changes with text objects motions is usually better than using visual mode when we want the changes to be repeatable.

On the other hand, visual mode is sometimes better when we’re unsure of what change we want to make and want to try something out incrementally, like with the indents in the previous section.

Edit Tabular Data with Visual-Block Mode

Visual-block mode is very very very useful whenever you’re dealing with text that’s aligned in columns. Think about it like this, A file is a grid of characters arranged in lines and columns, so we have three different visual modes: one for characters, one for lines, and one for columns. Columns and lines have very different properties though, because a file isn’t just any grid of characters, but rather a grid that usually has a particular kind of shape: Files are usally taller than they are wide.

What I mean by that is that a file’s width usually doesn’t grow as much as its height. I personally try to limit all my text files to a width of 80 characters, because I think it’s more readable, but some people prefer width-limits of 100, or 120. Regardless of the particular width limit, there is a general convention that text should flow down the page more than across the screen, which makes a line in a file tend to be a smaller and more meaningful unit of text than a whole column from the top of a file to the bottom. The content of text is also always aligned along its lines, and only sometimes meaninfully aligned along its columns.

Because of these differences between lines and columns, Visual line mode and and Visual block mode (columns) behave differently. Visual line mode selects whole lines by default, whereas in visual block mode, you have to specify how tall the columns should be.

Change Columns of Text

Another difference between visual line and visual block mode is how they interact with different operations. Characterwise commands like r or x work basically the same in both, where they are “mapped” over each character in the selection. So selecting a line or a column and doing r* will replace each character in the line or column with *. However, something like entering insert-mode with I (capitalized so as not to conflict with the i for inner in e.g. iw) or c will only map the changes over the selected lines in Visual block mode. In Visual line mode, going into insert mode only adds text in one place at the starting point of the selection.

Append After a Ragged Visual Block

Mode Key Effect
Visual I enter insert mode at start of selection
Visual A enter insert mode at end of selection