runtime(vimtutor): Add a second chapter
fixes: #5719
closes: #5729
Signed-off-by: Paul Desmond Parker <pauldesmondparker@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/runtime/tutor/tutor b/runtime/tutor/tutor
index 3df15f1..3ddcda1 100644
--- a/runtime/tutor/tutor
+++ b/runtime/tutor/tutor
@@ -945,10 +945,13 @@
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- This concludes the Vim Tutor. It was intended to give a brief overview of
- the Vim editor, just enough to allow you to use the editor fairly easily.
- It is far from complete as Vim has many many more commands. Read the user
- manual next: ":help user-manual".
+ This concludes Chapter 1 of the Vim Tutor. Consider continuing with Chapter 2.
+
+ It was intended to give a brief overview of the Vim editor, just enough to
+ allow you to use the editor fairly easily. It is far from complete as Vim
+ has many many more commands.
+
+ Read the user manual next: ":help user-manual".
For further reading and studying, this book is recommended:
Vim - Vi Improved - by Steve Oualline
diff --git a/runtime/tutor/tutor.vim b/runtime/tutor/tutor.vim
index 809fd1d..551231a 100644
--- a/runtime/tutor/tutor.vim
+++ b/runtime/tutor/tutor.vim
@@ -180,8 +180,13 @@
let s:ext .= '.utf-8'
endif
-" 2. Build the name of the file:
-let s:tutorfile = "/tutor/tutor"
+" 2. Build the name of the file and chapter
+let s:chapter = exists("$CHAPTER") ? $CHAPTER : ''
+if s:chapter == "1"
+ let s:chapter = ''
+endif
+
+let s:tutorfile = "/tutor/tutor" . s:chapter
let s:tutorxx = $VIMRUNTIME . s:tutorfile . s:ext
" 3. Finding the file:
diff --git a/runtime/tutor/tutor2 b/runtime/tutor/tutor2
new file mode 100644
index 0000000..eaeef40
--- /dev/null
+++ b/runtime/tutor/tutor2
@@ -0,0 +1,199 @@
+===============================================================================
+= W e l c o m e t o t h e V I M T u t o r - Version 1.7 =
+===============================================================================
+= =
+= C h a p t e r - T w o =
+= =
+===============================================================================
+
+ Hic Sunt Dracones: if this is your first exposure to vim and you
+ intended to avail yourself of the introductory chapter, kindly type
+ :q<enter> and try again.
+
+ 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: 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<C-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<C-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 :h registers
+ Named Registers :h quotea
+ Motion :h motion.txt<enter> /inner<enter>
+ CTRL-R :h insert<enter> /CTRL-R<enter>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Lesson 2.1.2: 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<C-r>=60*60*24<enter>
+
+ 4. On the next line, enter insert mode and add today's date with
+ <C-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 :h quote=
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Lesson 2.1.3: 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 :h quote0
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Lesson 2.1.4: 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 operatins like "a147d or :945,1091d a or even worse using
+ i<C-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
+
+---> AAA
+ function itGotRealBigRealFast() {
+ if ( somethingIsTrue ) {
+ doIt()
+ }
+ // the taxonomy of our function has changed and it
+ // no longer makes alphabetical sense in it's 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 :h marks
+ Mark Motions :h mark-motions (difference between ' and `)
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Lesson 2.1 SUMMARY
+
+
+ 1. To store (yank, delete) text into, and retrieve (paste) from, a total of
+ 26 registers (a-z)
+ 2. Yank a whole word from anywhere within a word: yiw
+ 3. Change a whole word from anywhere within a word: ciw
+ 4. Insert text directly from registers in insert mode: (C-r)a
+
+ 5. Insert the results of simple arithmetic operations: (C-r)=60*60<enter>
+ in insert mode
+ 6. Insert the results of system calls: (C-r)=system('ls -1')
+ in insert mode
+
+ 7. Inspect registers with :reg
+ 8. 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
+ 9. Learn the final destination of all yanks in the numbered registers and
+ how ephemeral they are
+
+ 10. Place marks from command mode m[a-zA-Z0-9]
+ 11. Move line-wise to a mark with '
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ This concludes chapter two of the Vim Tutor. It is a work in progress.
+
+ This chapter was written by Paul D. Parker.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor2.utf-8 b/runtime/tutor/tutor2.utf-8
new file mode 100644
index 0000000..eaeef40
--- /dev/null
+++ b/runtime/tutor/tutor2.utf-8
@@ -0,0 +1,199 @@
+===============================================================================
+= W e l c o m e t o t h e V I M T u t o r - Version 1.7 =
+===============================================================================
+= =
+= C h a p t e r - T w o =
+= =
+===============================================================================
+
+ Hic Sunt Dracones: if this is your first exposure to vim and you
+ intended to avail yourself of the introductory chapter, kindly type
+ :q<enter> and try again.
+
+ 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: 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<C-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<C-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 :h registers
+ Named Registers :h quotea
+ Motion :h motion.txt<enter> /inner<enter>
+ CTRL-R :h insert<enter> /CTRL-R<enter>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Lesson 2.1.2: 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<C-r>=60*60*24<enter>
+
+ 4. On the next line, enter insert mode and add today's date with
+ <C-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 :h quote=
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Lesson 2.1.3: 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 :h quote0
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Lesson 2.1.4: 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 operatins like "a147d or :945,1091d a or even worse using
+ i<C-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
+
+---> AAA
+ function itGotRealBigRealFast() {
+ if ( somethingIsTrue ) {
+ doIt()
+ }
+ // the taxonomy of our function has changed and it
+ // no longer makes alphabetical sense in it's 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 :h marks
+ Mark Motions :h mark-motions (difference between ' and `)
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Lesson 2.1 SUMMARY
+
+
+ 1. To store (yank, delete) text into, and retrieve (paste) from, a total of
+ 26 registers (a-z)
+ 2. Yank a whole word from anywhere within a word: yiw
+ 3. Change a whole word from anywhere within a word: ciw
+ 4. Insert text directly from registers in insert mode: (C-r)a
+
+ 5. Insert the results of simple arithmetic operations: (C-r)=60*60<enter>
+ in insert mode
+ 6. Insert the results of system calls: (C-r)=system('ls -1')
+ in insert mode
+
+ 7. Inspect registers with :reg
+ 8. 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
+ 9. Learn the final destination of all yanks in the numbered registers and
+ how ephemeral they are
+
+ 10. Place marks from command mode m[a-zA-Z0-9]
+ 11. Move line-wise to a mark with '
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ This concludes chapter two of the Vim Tutor. It is a work in progress.
+
+ This chapter was written by Paul D. Parker.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~