neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

vim-02-beginner.tutor (10312B)


      1 # Welcome to the Neovim Tutorial
      2 
      3 # Chapter 2
      4 
      5   Hic Sunt Dracones: if this is your first exposure to vim and you
      6   intended to avail yourself of the introductory chapter, kindly type
      7   on the command line of the Vim editor
      8 ~~~ cmd
      9         :Tutor vim-01-beginner
     10 ~~~
     11   Or just open the [first chapter](@tutor:vim-01-beginner) of the tutor at the link.
     12 
     13   The approximate time required to complete this chapter is 8-10 minutes,
     14   depending upon how much time is spent with experimentation.
     15 
     16 
     17 # Lesson 2.1.1: MASTERING TEXT OBJECTS
     18 
     19    ** Operate on logical text blocks with precision using text objects **
     20 
     21   1. Practice word operations:
     22      - Place cursor on any word in the line below
     23      - Type `diw`{normal} to delete INNER word (word without surrounding space)
     24      - Type `daw`{normal} to delete A WORD (including trailing whitespace)
     25      - Try with other operators: `ciw`{normal} (change), `yiw`{normal} (yank),
     26         `gqiw`{normal} (format)
     27 
     28 Practice on: "Vim's", (text_object), and 'powerful' words here.
     29 
     30   2. Work with bracketed content:
     31      - Put cursor inside any () {} [] <> pair below
     32      - Type `di(`{normal} or `dib`{normal} (delete inner bracket)
     33      - Type `da(`{normal} or `dab`{normal} (delete around brackets)
     34      - Try same with `i"`{normal}/`a"`{normal} for quotes, `it`{normal}/`at`{normal}  for HTML/XML tags
     35 
     36 Test cases: {curly}, [square], <angle>, and "quoted" items.
     37 
     38   3. Paragraph and sentence manipulation:
     39      - Use `dip`{normal} to delete inner paragraph (cursor anywhere in paragraph)
     40      - Use `vap`{normal} to visually select entire paragraph
     41      - Try `das`{normal} to delete a sentence (works between .!? punctuation)
     42 
     43   4. Advanced combinations:
     44      - `ciwnew<ESC>`{normal} - Change current word to "new"
     45      - `ciw"<CTRL-R>-"<ESC>`{normal} - Wrap current word in quotes
     46      - `gUit`{normal}        - Uppercase inner HTML tag content
     47      - `va"p`{normal}        - Select quoted text and paste over it
     48 
     49 Final exercise: (Modify "this" text) by [applying {various} operations]<
     50 
     51 
     52 # Lesson 2.1.2: THE NAMED REGISTERS
     53 
     54 ** Store two yanked words concurrently and then paste them **
     55 
     56   1. Move the cursor to the line below marked ✓
     57 
     58   2. Navigate to any point on the word 'Edward' and type `"ayiw`{normal}
     59 
     60 **MNEMONIC**: *into register(") named (a) (y)ank (i)nner (w)ord*
     61 
     62   3. Navigate forward to the word 'cookie' (`fk`{normal} or `3fc`{normal}
     63      or `$2b`{normal} or `/co`{normal} `<ENTER>`{normal}) and type `"byiw`{normal}
     64 
     65   4. Navigate to any point on the word 'Vince' and type `ciw<CTRL-R>a<ESC>`{normal}
     66 
     67 **MNEMONIC**: *(c)hange (i)nner (w)ord with <contents of (r)egister> named (a)*
     68 
     69   5. Navigate to any point on the word 'cake' and type `ciw<CTRL-R>b<ESC>`{normal}
     70 
     71 a) Edward will henceforth be in charge of the cookie rations
     72 b) In this capacity, Vince will have sole cake discretionary powers
     73 
     74 NOTE: Delete also works into registers, i.e. `"sdiw`{normal} will delete
     75       the word under the cursor into register s.
     76 
     77 REFERENCE: [Registers](registers)
     78            [Named Registers](quotea)
     79            [Motion](text-objects)
     80            [CTRL-R](i_CTRL-R)
     81 
     82 
     83 # Lesson 2.1.3: THE EXPRESSION REGISTER
     84 
     85 ** Insert the results of calculations on the fly **
     86 
     87   1. Move the cursor to the line below marked ✗
     88 
     89   2. Navigate to any point on the supplied number
     90 
     91   3. Type `ciw<CTRL-R>=`{normal}60\*60\*24 `<ENTER>`{normal}
     92 
     93   4. On the next line, enter insert mode and add today's date with 
     94      `<CTRL-R>=`{normal}`system('date')`{vim} `<ENTER>`{normal}
     95 
     96 NOTE: All calls to system are OS dependent, e.g. on Windows use 
     97       `system('date /t')`{vim}   or  `:r!date /t`{vim}
     98 
     99 I have forgotten the exact number of seconds in a day, is it 84600?
    100 Today's date is: 
    101 
    102 NOTE: the same can be achieved with `:pu=`{normal}`system('date')`{vim}
    103       or, with fewer keystrokes `:r!date`{vim}
    104 
    105 REFERENCE: [Expression Register](quote=)
    106 
    107 
    108 # Lesson 2.1.4: THE NUMBERED REGISTERS
    109 
    110 ** Press `yy`{normal} and `dd`{normal} to witness their effect on the registers **
    111 
    112   1. Move the cursor to the line below marked ✓
    113 
    114   2. Yank the line starting with "0.", then inspect registers with `:reg`{vim} `<ENTER>`{normal}
    115 
    116   3. Delete line 0 with `"cdd`{normal}, then inspect registers
    117      (Where do you expect line 0 to be?)
    118 
    119   4. Continue deleting each successive line, inspecting `:reg`{vim} as you go
    120 
    121 NOTE: You should notice that old full-line deletions move down the list
    122       as new full-line deletions are added
    123 
    124   5. Now (p)aste the following registers in order; c, 7, 4, 8, 2. i.e. `"7p`{normal}
    125 
    126 0. This
    127 9. wobble
    128 8. secret
    129 7. is
    130 6. on
    131 5. axis
    132 4. a
    133 3. war
    134 2. message
    135 1. tribute
    136 
    137 
    138 NOTE: Whole line deletions (`dd`{normal}) are much longer lived in the
    139       numbered registers than whole line yanks, or deletions involving
    140       smaller movements
    141 
    142 REFERENCE: [Numbered Registers](quote0)
    143 
    144 
    145 # Lesson 2.1.5: SPECIAL REGISTERS
    146 
    147  ** Use system clipboard and blackhole registers for advanced editing **
    148 
    149  Note: Clipboard use requires a working clipboard provider for the current
    150        windowing system on Linux. Check with `:checkhealth vim.provider`{vim}
    151        and `:echo has('clipboard_working')`{vim}
    152 
    153   1. Clipboard registers `+`{normal} and `*`{normal} :
    154      - `"+y`{normal} - Yank to system clipboard (e.g. `"+yy`{normal} for current line)
    155      - `"+p`{normal} - Paste from system clipboard
    156      - `"*`{normal} is primary selection on X11 (middle-click), `"+`{normal} is clipboard
    157 
    158 Try: "+yy then paste into another application with Ctrl-V or Cmd+V
    159 
    160   2. Blackhole register `_`{normal} discards text:
    161      - `"_daw`{normal} - Delete word without saving to any register
    162      - Useful when you don't want to overwrite your default `"`{normal} register
    163      - Note this is using the "a Word" text object, introduced in a previous
    164        lession
    165      - `"_dd`{normal}  - Delete line without saving
    166      - `"_dap`{normal} - Delete paragraph without saving
    167      - Combine with counts: `3"_dw`{normal}
    168 
    169 Practice: "_diw on any word to delete it without affecting yank history
    170 
    171   3. Combine with visual selections:
    172      - Select text with V then `"+y`{normal}
    173      - To paste from clipboard in insert mode: `<CTRL-R>+`{normal}
    174      - Try opening another application and paste from clipboard
    175 
    176   4. Remember:
    177      - Clipboard registers work across different Vim instances
    178      - Clipboard register is not always working
    179      - Blackhole prevents accidental register overwrites
    180      - Default `"`{normal} register is still available for normal yank/paste
    181      - Named registers (a-z) remain private to each Vim session
    182 
    183   5. Clipboard troubleshooting:
    184      - Check support with `:echo has('clipboard_working')`{vim}
    185      - 1 means available, 0 means not
    186      - On Linux, may need xsel, xclip or wl-clipboard
    187        (check `:checkhealth vim.provider`{vim} result)
    188 
    189 
    190 # Lesson 2.1.6: THE BEAUTY OF MARKS
    191 
    192 ** Code monkey arithmetic avoidance **
    193 
    194 NOTE: a common conundrum when coding is moving around large chunks of code.
    195       The following technique helps avoid number line calculations associated
    196       with operations like `"a147d`{normal} or `:945,1091d a`{vim} or even worse
    197       using `i<CTRL-R>=`{normal}1091-945 `<ENTER>`{normal} first
    198 
    199   1. Move the cursor to the line below marked ✓
    200 
    201   2. Go to the first line of the function and mark it with `ma`{normal}
    202 
    203 NOTE: exact position on line is NOT important!
    204 
    205   3. Navigate to the end of the line and then the end of the code block 
    206      with `$%`{normal}
    207 
    208   4. Delete the block into register a with `"ad'a`{normal}
    209 
    210 **MNEMONIC**: *into register(") named (a) put the (d)eletion from the cursor to
    211           the LINE containing mark(') (a)*
    212 
    213   5. Paste the block between BBB and CCC `"ap`{normal}
    214 
    215 NOTE: practice this operation multiple times to become fluent `ma$%"ad'a`{normal}
    216 
    217 ~~~ cmd
    218 AAA
    219 function itGotRealBigRealFast() {
    220   if ( somethingIsTrue ) {
    221     doIt()
    222   }
    223   // the taxonomy of our function has changed and it
    224   // no longer makes alphabetical sense in its current position
    225 
    226   // imagine hundreds of lines of code
    227 
    228   // naively you could navigate to the start and end and record or
    229   // remember each line number
    230 }
    231 BBB
    232 CCC
    233 ~~~
    234 
    235 NOTE: marks and registers do not share a namespace, therefore register a is
    236       completely independent of mark a. This is not true of registers and
    237       macros.
    238 
    239 REFERENCE: [Marks](marks)
    240            [Mark Motions](mark-motions)  (difference between ' and \`)
    241 
    242 
    243 # Lesson 2.1 SUMMARY
    244 
    245   1. Text objects provide precision editing:
    246      - `iw`{normal}/`aw`{normal} - inner/around word
    247      - `i[`{normal}/`a[`{normal} - inner/around bracket
    248      - `i"`{normal}/`a"`{normal} - inner/around quotes
    249      - `it`{normal}/`at`{normal} - inner/around tag
    250      - `ip`{normal}/`ap`{normal} - inner/around paragraph
    251      - `is`{normal}/`as`{normal} - inner/around sentence
    252 
    253   2. To store (yank, delete) text into, and retrieve (paste) from, a total of
    254      26 registers (a-z) 
    255   3. Yank a whole word from anywhere within a word: `yiw`{normal}
    256   4. Change a whole word from anywhere within a word: `ciw`{normal}
    257   5. Insert text directly from registers in insert mode: `<CTRL-R>a`{normal}
    258 
    259   6. Insert the results of simple arithmetic operations:
    260      `<CTRL-R>=`{normal}60\*60`<ENTER>`{normal} in insert mode
    261   7. Insert the results of system calls:
    262      `<CTRL-R>=`{normal}`system('ls -1')`{vim}`<ENTER>`{normal} in insert mode
    263 
    264   8. Inspect registers with `:reg`{vim}
    265   9. Learn the final destination of whole line deletions: `dd`{normal} in
    266      the numbered registers, i.e. descending from register 1 - 9.  Appreciate
    267      that whole line deletions are preserved in the numbered registers longer
    268      than any other operation
    269  10. Learn the final destination of all yanks in the numbered registers and
    270      how ephemeral they are
    271 
    272  11. Place marks from command mode `m[a-zA-Z0-9]`{normal}
    273  12. Move line-wise to a mark with `'`{normal}
    274 
    275  13. Special registers:
    276      - `"+`{normal}/`"*`{normal} - System clipboard (OS dependent)
    277      - `"_`{normal}    - Blackhole (discard deleted/yanked text)
    278      - `"=`{normal}    - Expression register
    279      - `"-`{normal}    - Small delete register
    280 
    281 
    282 # CONCLUSION
    283 
    284   This concludes chapter two of the Vim Tutor. It is a work in progress.
    285 
    286   This chapter was written by Paul D. Parker and Christian Brabandt.
    287 
    288   Modified for vim-tutor-mode by Restorer.