From 624b4fcd58940cc4740a5d25cc96f4251dd2f6cf Mon Sep 17 00:00:00 2001 From: Igor Irianto Date: Thu, 21 Jan 2021 12:14:47 -0600 Subject: [PATCH] Fix wording on vis mode --- ch11_visual_mode.md | 112 ++++++++++++++++++++++++-------------------- 1 file changed, 62 insertions(+), 50 deletions(-) diff --git a/ch11_visual_mode.md b/ch11_visual_mode.md index 4850b97..f058088 100644 --- a/ch11_visual_mode.md +++ b/ch11_visual_mode.md @@ -1,9 +1,10 @@ # Ch11. Visual Mode -With visual editors (like LibreOffice Writer, Microsoft Word) you probably know that you can highlight a block of text and apply changes to it. Vim can too, with visual mode. Vim has three different visual modes to use. In this chapter, you will learn how to use each visual mode to manipulate blocks of texts efficiently. +Highlighting and applying changes to a body of text is a common feature in many text editors and word processors. Vim can do this using visual mode. In this chapter, you will learn how to use the visual mode to manipulate texts efficiently. ## The Three Types Of Visual Modes -The three modes are: + +Vim has three different visual modes. They are: ``` v Character-wise visual mode @@ -12,27 +13,27 @@ Ctrl-v Block-wise visual mode ``` If you have the text: + ``` one two three ``` -Character-wise visual mode is used to select individual characters. Press `v` on the first character on the first line. Then go down to the next line with `j`. It highlights all texts from "one" up to your cursor location. Now if you press `gU`, Vim uppercases the highlighted characters. +Character-wise visual mode works with individual characters. Press `v` on the first character. Then go down to the next line with `j`. It highlights all texts from "one" up to your cursor location. If you press `gU`, Vim uppercases the highlighted characters. -Line-wise visual mode works with line units. Press `V` and watch Vim selects the entire line your cursor is on. Just like character-wise visual mode, if you run `gU`, Vim uppercases the highlighted characters. +Line-wise visual mode works with lines. Press `V` and watch Vim selects the entire line your cursor is on. Just like character-wise visual mode, if you run `gU`, Vim uppercases the highlighted characters. -Block-wise visual mode works with rows and columns. It gives you more freedom to move around than the other two modes. Press `Ctrl-v`. Vim highlights the character under the cursor just like character-wise visual mode, except instead of highlighting each character until the end of the line before going to the next line, it can go to the next line without highlighting the entire character on the current line. Try moving around with `h/j/k/l` and watch the cursor movements. +Block-wise visual mode works with rows and columns. It gives you more freedom of movement than the other two modes. If you press `Ctrl-v`, Vim highlights the character under the cursor just like character-wise visual mode, except instead of highlighting each character until the end of the line before going down to the next line, it goes to the next line with minimal highlighting. Try moving around with `h/j/k/l` and watch the cursor moves. On the bottom left of your Vim window, you will see either `-- VISUAL --`, `-- VISUAL LINE --`, or `-- VISUAL BLOCK --` displayed to indicate which visual mode you are in. While you are inside a visual mode, you can switch to another visual mode by pressing either `v`, `V`, or `Ctrl-v`. For example, if you are in line-wise visual mode and you want to switch to block-wise visual mode, run `Ctrl-v`. Try it! -There are three ways to exit the visual mode: `esc`, `Ctrl-c`, and the same key as your current visual mode. - -What the latter one means is if you are currently in the line-wise visual mode (`V`), you can exit it by pressing `V` again. If you are in the character-wise visual mode, you can exit it by pressing `v`. If you are in the block-wise visual mode, press `Ctrl-v`. +There are three ways to exit the visual mode: ``, `Ctrl-C`, and the same key as your current visual mode. What the latter means is if you are currently in the line-wise visual mode (`V`), you can exit it by pressing `V` again. If you are in the character-wise visual mode, you can exit it by pressing `v`. There is actually one more way to enter the visual mode: + ``` gv Go to the previous visual mode ``` @@ -51,7 +52,7 @@ two three ``` -This time let's start from the line "two". Press `v` to go to the character-wise visual mode: +This time let's start from the line "two". Press `v` to go to the character-wise visual mode (here the square brackets `[]` represents the character highlights): ``` one @@ -67,7 +68,7 @@ one t]hree ``` -Suppose you just realized that you also need to highlight the line "one" too, so you press `k`. To your dismay, it now excludes "three". Pressing `k` actually reduces the highlight, not expands it. +Assume from this position, you want to add the line "one" too. If you press `k`, to your dismay, the highlight moves away from the line "three". ``` one @@ -75,9 +76,7 @@ one three ``` -Is there a way to freely expand visual selection to go to any direction you want? - -The answer is yes. Let's back up a little bit to where you have the line "two" and "three" highlighted. +Is there a way to freely expand visual selection to go to any direction you want? Definitely. Let's back up a little bit to where you have the line "two" and "three" highlighted. ``` one @@ -85,7 +84,7 @@ one t]hree <-- cursor ``` -Visual highlight follows the cursor movement. If you want to expand it upward to line "one", you need to move the cursor up when the cursor is on the letter "two", not "three". Right now your cursor is on the line "three". To move it, toggle the cursor location with either `o` or `O`. +Visual highlight follows the cursor movement. If you want to expand it upward to line "one", you need to move the cursor up to the line "two". Right now the cursor is on the line "three". You can toggle the cursor location with either `o` or `O`. ``` one @@ -101,13 +100,13 @@ two t]hree ``` -With `o` or `O` in visual mode, the cursor jumps from the beginning to the end of the highlighted block, keeping the block highlighted while letting you expand the highlighted block. +With `o` or `O` in visual mode, the cursor jumps from the beginning to the end of the highlighted block, allowing you to expand the highlight area. ## Visual Mode Grammar -Visual mode is one of Vim's modes. Being a mode means that the same key may work differently than in another mode. Luckily, visual mode shares many common keys with normal mode. +The visual mode shares many operations with normal mode. -For example, if you have the text: +For example, if you have the following text and you want to delete the first two lines from visual mode: ``` one @@ -116,15 +115,17 @@ three ``` Highlight the lines "one" and "two" with the line-wise visual mode (`V`): + ``` [one two] three ``` -Pressing `d` will delete the selection, similar to normal mode. Notice the grammar rule from normal mode, verb + noun, does not apply. The same verb is still there (`d`), but there is no noun in visual mode. The grammar rule in visual mode is noun + verb, where noun is the highlighted text. Select the text block first, then operate. +Pressing `d` will delete the selection, similar to normal mode. Notice the grammar rule from normal mode, verb + noun, does not apply. The same verb is still there (`d`), but there is no noun in visual mode. The grammar rule in visual mode is noun + verb, where noun is the highlighted text. Select the text block first, then the command follows. + +In normal mode, there are some commands that do not require a motion, like `x` to delete a single character under the cursor and `r` to replace the character under the cursor (`rx` replaces the character under the cursor with "x"). In visual mode, these commands are now being applied to the entire highlighted text instead of a single character. Back at the highlighted text: -In normal mode, there are some commands that do not require a motion, like `x` to delete a single character under the cursor and `rx` to replace the character under the cursor with "x". In visual mode, these commands are now being applied to the entire highlighted text instead of a single character. Back at the highlighted text: ``` [one two] @@ -133,24 +134,27 @@ three Running `x` deletes all highlighted texts. -You can use this behavior to quickly create a header in markdown text. Suppose you have a text in a markdown file: +You can use this behavior to quickly create a header in markdown text. Suppose you need to quickly turn the following text into a first-level markdown header ("==="): + ``` Chapter One ``` -You need to quickly turn this header into a header. First you copy the text with `yy`, then paste it with `p`: +First, copy the text with `yy`, then paste it with `p`: + ``` Chapter One Chapter One ``` Now go to the second line, select it with line-wise visual mode: + ``` Chapter One [Chapter One] ``` -In markdown you can create a header by adding a series of `=` below a text, so you will replace the entire highlighted text by running `r=`: +A first-level header is a series of "=" below a text. Run `r=`, voila! This saves you from typing "=" manually. ``` Chapter One @@ -159,10 +163,9 @@ Chapter One To learn more about operators in visual mode, check out `:h visual-operators`. +## Visual Mode And Command-line Commands -## Visual Mode And Ex Commands - -You can selectively apply Ex commands on a highlighted text block. If you have these expressions: +You can selectively apply command-line commands on a highlighted text block. If you have these statements and you want to substitute "const" with "let" only on the first two lines: ``` const one = "one"; @@ -170,17 +173,19 @@ const two = "two"; const three = "three"; ``` -You need to substitute only the first two lines of "const" with "let". Highlight the first two lines with *any* visual mode and run the substitute command `:s/const/let/g`: +Highlight the first two lines with *any* visual mode and run the substitute command `:s/const/let/g`: + ``` let one = "one"; let two = "two"; const three = "three"; ``` -Notice I said you can do this with *any* visual mode. You do not have to highlight the entire line to run Ex command on that line. As long as you select at least a character on each line, the Ex command will be applied. -## Editing Across Multiple Lines +Notice I said you can do this with *any* visual mode. You do not have to highlight the entire line to run the command on that line. As long as you select at least a character on each line, the command is applied. -You can edit text across multiple lines in Vim using the block-wise visual mode. If you need to add a semicolon at the end of each line: +## Adding Text On Multiple Lines + +You can add text on multiple lines in Vim using the block-wise visual mode. If you need to add a semicolon at the end of each line: ``` const one = "one" @@ -192,12 +197,11 @@ With your cursor on the first line: - Run block-wise visual mode and go down two lines (`Ctrl-v jj`). - Highlight to the end of the line (`$`). - Append (`A`) then type ";". -- Exit visual mode (`esc`). +- Exit visual mode (``). -You should see the appended ";" on each line. By the way, while in block-wise visual mode, to enter the insert mode, you can use either `A` to enter the text after the cursor or `I` to enter the text before the cursor. Do not confuse them with `A` and `I` from normal mode. - -Alternatively, you can also use the `:normal` command: +You should see the appended ";" on each line now. Pretty cool! There are two ways to enter the insert mode from block-wise visual mode: `A` to enter the text after the cursor or `I` to enter the text before the cursor. Do not confuse them with `A` (append text at the end of the line) and `I` (insert text before the first non-blank line) from normal mode. +Alternatively, you can also use the `:normal` command to add text on multiple lines: - Highlight all 3 lines (`vjj`). - Type `:normal! A;`. @@ -205,9 +209,10 @@ Remember, `:normal` command executes normal mode commands. You can instruct it t ## Incrementing Numbers -Vim has `Ctrl-x` and `Ctrl-a` commands to decrement and increment numbers. When used with visual mode, you can increment numbers across multiple lines. +Vim has `Ctrl-X` and `Ctrl-A` commands to decrement and increment numbers. When used with visual mode, you can increment numbers across multiple lines. If you have these HTML elements: + ```
@@ -217,11 +222,12 @@ If you have these HTML elements: ``` It is a bad practice to have several ids having the same name, so let's increment them to make them unique: -- Move your cursor to the *second* "1". -- Start block-wise visual mode and go down 3 lines (`Ctrl-v 3j`). This highlights the remaining "1"s. +- Move your cursor to the "1" on the second line. +- Start block-wise visual mode and go down 3 lines (`Ctrl-v 3j`). This highlights the remaining "1"s. Now all "1" should be highlighted. - Run `g Ctrl-a`. You should see this result: + ```
@@ -230,13 +236,14 @@ You should see this result:
``` -`g Ctrl-a` increments numbers on multiple lines. `Ctrl-x/Ctrl-a` can increment letters too. If you run: +`g Ctrl-a` increments numbers on multiple lines. `Ctrl-X/Ctrl-A` can increment letters too, with the number formats option: ``` -:set nrformats+=alpha +set nrformats+=alpha ``` -The `nrformats` option instructs Vim which bases are considered as "numbers" for `Ctrl-a` and `Ctrl-x` to increment and decrement. By adding `alpha`, an alphabetical character is now considered as a number. If you have the following HTML elements: +The `nrformats` option instructs Vim which bases are considered as "numbers" for `Ctrl-A` and `Ctrl-X` to increment and decrement. By adding `alpha`, an alphabetical character is now considered as a number. If you have the following HTML elements: + ```
@@ -246,6 +253,7 @@ The `nrformats` option instructs Vim which bases are considered as "numbers" for ``` Put your cursor on the second "app-a". Use the same technique as above (`Ctrl-v 3j` then `g Ctrl-a`) to increment the ids. + ```
@@ -253,21 +261,26 @@ Put your cursor on the second "app-a". Use the same technique as above (`Ctrl-v
``` + ## Selecting The Last Visual Mode Area -You learned that `gv` can quickly highlight the last visual mode highlight. You can also go to the location of the start and the end of the last visual mode with these two special marks: +Earlier in this chapter I mentioned that `gv` can quickly highlight the last visual mode highlight. You can also go to the location of the start and the end of the last visual mode with these two special marks: ``` `< Go to the last place of the previous visual mode highlight `> Go to the first place of the previous visual mode highlight ``` -I want you to observe something. Earlier, I mentioned that you can selectively execute Ex commands on a highlighted text, like `:s/const/let/g`. When you did that, you should see this: +Earlier, I also mentioned that you can selectively execute command-line commands on a highlighted text, like `:s/const/let/g`. When you did that, you'd see this below: + ``` :`<,`>s/const/let/g ``` -You were actually executing `s/const/let/g` command using marks as range. You can always edit these marks anytime you wish. If instead you needed to substitute from the start of the highlighted text to the end of the file, you just change the command line to: +You were actually executing a *ranged* `s/const/let/g` command (with the two marks as the addresses). Interesting! + +You can always edit these marks anytime you wish. If instead you needed to substitute from the start of the highlighted text to the end of the file, you just change the command to: + ``` :`<,$s/const/let/g ``` @@ -277,14 +290,15 @@ You were actually executing `s/const/let/g` command using marks as range. You ca You can also enter visual mode from the insert mode. To go to character-wise visual mode while you are in insert mode: ``` -Ctrl-o v +Ctrl-O v ``` -Recall that running `Ctrl-o` while in the insert mode lets you to execute a normal mode command. While in this normal-mode-command-pending mode, run `v` to enter character-wise visual mode. Notice that on the bottom left of the screen, it says `--(insert) VISUAL--`. This trick works with any visual mode operator: `v`, `V`, and `Ctrl-v`. +Recall that running `Ctrl-O` while in the insert mode lets you to execute a normal mode command. While in this normal-mode-command-pending mode, run `v` to enter character-wise visual mode. Notice that on the bottom left of the screen, it says `--(insert) VISUAL--`. This trick works with any visual mode operator: `v`, `V`, and `Ctrl-v`. ## Select Mode -Vim has a mode similar to visual mode called the *select mode*. Like visual mode, it also has three different modes: +Vim has a mode similar to visual mode called the select mode. Like the visual mode, it also has three different modes: + ``` gh Character-wise select mode gH Line-wise select mode @@ -293,11 +307,9 @@ gCtrl-h Block-wise select mode Select mode emulates a regular editor's text highlighting behavior closer than Vim's visual mode does. -In a regular editor, after you highlight a text block and type a letter, say the letter "y", it will delete the highlighted text and insert the letter "y". +In a regular editor, after you highlight a text block and type a letter, say the letter "y", it will delete the highlighted text and insert the letter "y". If you highlight a line with line-wise select mode (`gH`) and type "y", it will delete the highlighted text and insert the letter "y". -If you highlight a line of text with line-wise select mode (`gH`) and type "y", it will delete the highlighted text and insert the letter "y", much like the regular text editor. - -Contrast this behavior with visual mode: if you highlight a line of text with line-wise visual mode (`V`) and type "y", the highlighted text will not be deleted and replaced by the literal letter "y". It will only be yanked and stored in the yanked register "0. +Contrast this select mode with visual mode: if you highlight a line of text with line-wise visual mode (`V`) and type "y", the highlighted text will not be deleted and replaced by the literal letter "y", it will be yanked. You can't execute normal mode commands on highlighted text in select mode. I personally never used select mode, but it's good to know that it exists. @@ -305,4 +317,4 @@ I personally never used select mode, but it's good to know that it exists. The visual mode is Vim's representation of the text highlighting procedure. -If you find yourself using visual mode operation far more often than normal mode operations, be careful. I think this is an anti-pattern. It takes more keystrokes to run a visual mode operation than its normal mode counterpart. If you need to delete an inner word, why use four keystrokes, `viwd` (visually highlight an inner word then delete), if you can accomplish it with just three keystrokes (`diw`)? The latter is more direct and concise. Of course, there will be times when visual modes are appropriate, but in general, favor a more direct approach. +If you find yourself using visual mode operation far more often than normal mode operations, be careful. This is an anti-pattern. It takes more keystrokes to run a visual mode operation than its normal mode counterpart. For example, if you need to delete an inner word, why use four keystrokes, `viwd` (visually highlight an inner word then delete), if you can accomplish it with just three keystrokes (`diw`)? The latter is more direct and concise. Of course, there will be times when visual modes are appropriate, but in general, favor a more direct approach.