mirror of
https://github.com/neovim/neovim.git
synced 2025-11-15 23:01:24 +00:00
1. Every hyperlink-like element was replaced by `"$1"` (where $1 is the original string showed in the hyperlink); 2. Arrows `--->` were used in lines containing practice examples when no editing text is involved; 3. Context on interactivity was minimally adapted when strictly needed, not to disrupt the original tutor's intent; 4. Tests regarding the tutor file refactored to ensure the new syntax is not flagged as an error.
288 lines
9.2 KiB
Plaintext
288 lines
9.2 KiB
Plaintext
# Welcome to the Neovim Tutorial
|
|
|
|
# Chapter 2
|
|
|
|
Hic Sunt Dracones: if this is your first exposure to vim and you
|
|
intended to avail yourself of the introductory chapter, kindly type
|
|
on the command line of the Vim editor
|
|
~~~ cmd
|
|
:Tutor vim-01-beginner
|
|
~~~
|
|
Or just open the first chapter of the tutor at the link.
|
|
|
|
The approximate time required to complete this chapter is 8-10 minutes,
|
|
depending upon how much time is spent with experimentation.
|
|
|
|
|
|
# Lesson 2.1.1: MASTERING TEXT OBJECTS
|
|
|
|
** Operate on logical text blocks with precision using text objects **
|
|
|
|
1. Practice word operations:
|
|
- Place cursor on any word in the line below
|
|
- Type "diw" to delete INNER word (word without surrounding space)
|
|
- Type "daw" to delete A WORD (including trailing whitespace)
|
|
- Try with other operators: "ciw" (change), "yiw" (yank),
|
|
"gqiw" (format)
|
|
|
|
---> Practice on: "Vim's", (text_object), and 'powerful' words here.
|
|
|
|
2. Work with bracketed content:
|
|
- Put cursor inside any () {} [] <> pair below
|
|
- Type "di(" or "dib" (delete inner bracket)
|
|
- Type "da(" or "dab" (delete around brackets)
|
|
- Try same with "i""/"a"" for quotes, "it"/"at" for HTML/XML tags
|
|
|
|
---> Test cases: {curly}, [square], <angle>, and "quoted" items.
|
|
|
|
3. Paragraph and sentence manipulation:
|
|
- Use "dip" to delete inner paragraph (cursor anywhere in paragraph)
|
|
- Use "vap" to visually select entire paragraph
|
|
- Try "das" to delete a sentence (works between .!? punctuation)
|
|
|
|
4. Advanced combinations:
|
|
- "ciwnew<ESC>" - Change current word to "new"
|
|
- "yss"<ESC>" - Wrap entire line in quotes (vim-surround plugin style)
|
|
- "gUit" - Uppercase inner HTML tag content
|
|
- "va"p" - Select quoted text and paste over it
|
|
|
|
---> Final exercise: (Modify "this" text) by [applying {various} operations]<
|
|
|
|
|
|
# Lesson 2.1.2: THE NAMED REGISTERS
|
|
|
|
** Store two yanked words concurrently and then paste them **
|
|
|
|
1. Move the cursor to the line below marked "--->"
|
|
|
|
2. Navigate to any point on the word 'Edward' and type ""ayiw"
|
|
|
|
**MNEMONIC**: *into register(") named (a) (y)ank (i)nner (w)ord*
|
|
|
|
3. Navigate forward to the word 'cookie' ("fk" or "2fc"
|
|
or "$2b" or "/co <ENTER>") and type ""byiw"
|
|
|
|
4. Navigate to any point on the word 'Vince' and type "ciw<CTRL-r>a<ESC>"
|
|
|
|
**MNEMONIC**: *(c)hange (i)nner (w)ord with <contents of (r)egister> named (a)*
|
|
|
|
5. Navigate to any point on the word 'cake' and type "ciw<CTRL-r>b<ESC>"
|
|
|
|
---> a) Edward will henceforth be in charge of the cookie rations
|
|
b) In this capacity, Vince will have sole cake discretionary powers
|
|
|
|
NOTE: Delete also works into registers, i.e. ""sdiw" will delete
|
|
the word under the cursor into register s.
|
|
|
|
REFERENCE: Registers
|
|
Named Registers
|
|
Motion
|
|
CTRL-R
|
|
|
|
|
|
# Lesson 2.1.3: THE EXPRESSION REGISTER
|
|
|
|
** Insert the results of calculations on the fly **
|
|
|
|
1. Move the cursor to the line below marked ✗
|
|
|
|
2. Navigate to any point on the supplied number
|
|
|
|
3. Type "ciw<CTRL-r>="60\*60\*24 "<ENTER>"
|
|
|
|
4. On the next line, enter insert mode and add today's date with
|
|
"<CTRL-r>=""system('date') <ENTER>"
|
|
|
|
NOTE: All calls to system are OS dependent, e.g. on Windows use
|
|
"system('date /t')" or ":r!date /t"
|
|
|
|
I have forgotten the exact number of seconds in a day, is it 84600?
|
|
---> Today's date is:
|
|
|
|
NOTE: the same can be achieved with ":pu=""system('date')"
|
|
or, with fewer keystrokes ":r!date"
|
|
|
|
REFERENCE: Expression Register
|
|
|
|
|
|
# Lesson 2.1.4: THE NUMBERED REGISTERS
|
|
|
|
** Press "yy" and "dd" to witness their effect on the registers **
|
|
|
|
1. Move the cursor to the line below marked "--->"
|
|
|
|
2. yank the zeroth line, then inspect registers with ":reg <ENTER>"
|
|
|
|
3. delete line 0. with ""cdd", then inspect registers
|
|
(Where do you expect line 0 to be?)
|
|
|
|
4. continue deleting each successive line, inspecting ":reg" as you go
|
|
|
|
NOTE: You should notice that old full-line deletions move down the list
|
|
as new full-line deletions are added
|
|
|
|
5. Now (p)aste the following registers in order; c, 7, 4, 8, 2. i.e. ""7p"
|
|
|
|
---> 0. This
|
|
9. wobble
|
|
8. secret
|
|
7. is
|
|
6. on
|
|
5. axis
|
|
4. a
|
|
3. war
|
|
2. message
|
|
1. tribute
|
|
|
|
|
|
NOTE: Whole line deletions ("dd") are much longer lived in the
|
|
numbered registers than whole line yanks, or deletions involving
|
|
smaller movements
|
|
|
|
REFERENCE: Numbered Registers
|
|
|
|
|
|
# Lesson 2.1.5: SPECIAL REGISTERS
|
|
|
|
** Use system clipboard and blackhole registers for advanced editing **
|
|
|
|
Note: Clipboard use requires a working clipboard provider for the current
|
|
windowing system on Linux. Check with ":checkhealth vim.provider"
|
|
and ":echo has('clipboard_working')"
|
|
|
|
1. Clipboard registers "+" and "*" :
|
|
- ""+y" - Yank to system clipboard (e.g. ""+yy" for current line)
|
|
- ""+p" - Paste from system clipboard
|
|
- ""*" is primary selection on X11 (middle-click), ""+" is clipboard
|
|
|
|
---> Try: "+yy then paste into another application with Ctrl-V or Cmd+V
|
|
|
|
2. Blackhole register "_" discards text:
|
|
- ""_daw" - Delete word without saving to any register
|
|
- Useful when you don't want to overwrite your default `"` register
|
|
- Note this is using the "a Word" text object, introduced in a previous
|
|
lession
|
|
- ""_dd" - Delete line without saving
|
|
- ""_dap" - Delete paragraph without saving
|
|
- Combine with counts: "3"_dw"
|
|
|
|
---> Practice: "_diw on any word to delete it without affecting yank history
|
|
|
|
3. Combine with visual selections:
|
|
- Select text with V then ""+y"
|
|
- To paste from clipboard in insert mode: "<CTRL-R>+"
|
|
- Try opening another application and paste from clipboard
|
|
|
|
4. Remember:
|
|
- Clipboard registers work across different Vim instances
|
|
- Clipboard register is not always working
|
|
- Blackhole prevents accidental register overwrites
|
|
- Default `"` register is still available for normal yank/paste
|
|
- Named registers (a-z) remain private to each Vim session
|
|
|
|
5. Clipboard troubleshooting:
|
|
- Check support with ":echo has('clipboard_working')"
|
|
- 1 means available, 0 means not
|
|
- On Linux, may need xsel, xclip or wl-clipboard
|
|
(check ":checkhealth vim.provider" result)
|
|
|
|
|
|
# Lesson 2.1.6: THE BEAUTY OF MARKS
|
|
|
|
** Code monkey arithmetic avoidance **
|
|
|
|
NOTE: a common conundrum when coding is moving around large chunks of code.
|
|
The following technique helps avoid number line calculations associated
|
|
with operations like ""a147d" or ":945,1091d a" or even worse
|
|
using "i<CTRL-r>="1091-945 "<ENTER>" first
|
|
|
|
1. Move the cursor to the line below marked "--->"
|
|
|
|
2. Go to the first line of the function and mark it with "ma"
|
|
|
|
NOTE: exact position on line is NOT important!
|
|
|
|
3. Navigate to the end of the line and then the end of the code block
|
|
with "$%"
|
|
|
|
4. Delete the block into register a with ""ad'a"
|
|
|
|
**MNEMONIC**: *into register(") named (a) put the (d)eletion from the cursor to
|
|
the LINE containing mark(') (a)*
|
|
|
|
5. Paste the block between BBB and CCC ""ap"
|
|
|
|
NOTE: practice this operation multiple times to become fluent "ma$%"ad'a"
|
|
|
|
~~~ cmd
|
|
---> AAA
|
|
function itGotRealBigRealFast() {
|
|
if ( somethingIsTrue ) {
|
|
doIt()
|
|
}
|
|
// the taxonomy of our function has changed and it
|
|
// no longer makes alphabetical sense in its current position
|
|
|
|
// imagine hundreds of lines of code
|
|
|
|
// naively you could navigate to the start and end and record or
|
|
// remember each line number
|
|
}
|
|
BBB
|
|
CCC
|
|
~~~
|
|
|
|
NOTE: marks and registers do not share a namespace, therefore register a is
|
|
completely independent of mark a. This is not true of registers and
|
|
macros.
|
|
|
|
REFERENCE: Marks
|
|
Mark Motions (difference between ' and \`)
|
|
|
|
|
|
# Lesson 2.1 SUMMARY
|
|
|
|
1. Text objects provide precision editing:
|
|
- "iw"/"aw" - inner/around word
|
|
- "i["/"a[" - inner/around bracket
|
|
- "i""/"a"" - inner/around quotes
|
|
- "it"/"at" - inner/around tag
|
|
- "ip"/"ap" - inner/around paragraph
|
|
- "is"/"as" - inner/around sentence
|
|
|
|
2. To store (yank, delete) text into, and retrieve (paste) from, a total of
|
|
26 registers (a-z)
|
|
3. Yank a whole word from anywhere within a word: "yiw"
|
|
4. Change a whole word from anywhere within a word: "ciw"
|
|
5. Insert text directly from registers in insert mode: "<CTRL-R>a"
|
|
|
|
6. Insert the results of simple arithmetic operations:
|
|
"<CTRL-r>="60\*60"<ENTER>" in insert mode
|
|
7. Insert the results of system calls:
|
|
"<CTRL-r>=""system('ls -1')""<ENTER>" in insert mode
|
|
|
|
8. Inspect registers with ":reg"
|
|
9. Learn the final destination of whole line deletions: "dd" in
|
|
the numbered registers, i.e. descending from register 1 - 9. Appreciate
|
|
that whole line deletions are preserved in the numbered registers longer
|
|
than any other operation
|
|
10. Learn the final destination of all yanks in the numbered registers and
|
|
how ephemeral they are
|
|
|
|
11. Place marks from command mode "m[a-zA-Z0-9]"
|
|
12. Move line-wise to a mark with "'"
|
|
|
|
13. Special registers:
|
|
- ""+"/""*" - System clipboard (OS dependent)
|
|
- ""_" - Blackhole (discard deleted/yanked text)
|
|
- ""=" - Expression register
|
|
|
|
|
|
# CONCLUSION
|
|
|
|
This concludes chapter two of the Vim Tutor. It is a work in progress.
|
|
|
|
This chapter was written by Paul D. Parker and Christian Brabandt.
|
|
|
|
Modified for vim-tutor-mode by Restorer.
|