mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
runtime: Include vim-tutor-mode
vim-tutor-mode provides a mechanism to write and read interactive tutorials in vim. It's aim is to replace the venerable vimtutor with a more modern system. The plugin's development is maintained at https://github.com/fmoralesc /vim-tutor-mode Closes #2351.
This commit is contained in:
parent
27f0e74542
commit
4fc1ab779d
350
runtime/autoload/tutor.vim
Normal file
350
runtime/autoload/tutor.vim
Normal file
@ -0,0 +1,350 @@
|
||||
" vim: fdm=marker et ts=4 sw=4
|
||||
|
||||
" Setup: {{{1
|
||||
function! tutor#SetupVim()
|
||||
if has('syntax')
|
||||
if !exists('g:syntax_on') || g:syntax_on == 0
|
||||
syntax on
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" Mappings: {{{1
|
||||
|
||||
function! s:CheckMaps()
|
||||
nmap
|
||||
endfunction
|
||||
|
||||
function! s:MapKeyWithRedirect(key, cmd)
|
||||
if maparg(a:key) !=# ''
|
||||
redir => l:keys
|
||||
silent call s:CheckMaps()
|
||||
redir END
|
||||
let l:key_list = split(l:keys, '\n')
|
||||
|
||||
let l:raw_map = filter(copy(l:key_list), "v:val =~# '\\* ".a:key."'")
|
||||
if len(l:raw_map) == 0
|
||||
exe "nnoremap <buffer> <expr> ".a:key." ".a:cmd
|
||||
return
|
||||
endif
|
||||
let l:map_data = split(l:raw_map[0], '\s*')
|
||||
|
||||
exe "nnoremap <buffer> <expr> ".l:map_data[0]." ".a:cmd
|
||||
else
|
||||
exe "nnoremap <buffer> <expr> ".a:key." ".a:cmd
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! tutor#MouseDoubleClick()
|
||||
if foldclosed(line('.')) > -1
|
||||
normal! zo
|
||||
else
|
||||
if match(getline('.'), '^#\{1,} ') > -1
|
||||
normal! zc
|
||||
else
|
||||
call tutor#FollowLink(0)
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! tutor#InjectCommand()
|
||||
let l:cmd = substitute(getline('.'), '^\s*', '', '')
|
||||
exe l:cmd
|
||||
redraw | echohl WarningMsg | echon "tutor: ran" | echohl None | echon " " | echohl Statement | echon l:cmd
|
||||
endfunction
|
||||
|
||||
function! tutor#SetNormalMappings()
|
||||
call s:MapKeyWithRedirect('l', 'tutor#ForwardSkipConceal(v:count1)')
|
||||
call s:MapKeyWithRedirect('h', 'tutor#BackwardSkipConceal(v:count1)')
|
||||
call s:MapKeyWithRedirect('<right>', 'tutor#ForwardSkipConceal(v:count1)')
|
||||
call s:MapKeyWithRedirect('<left>', 'tutor#BackwardSkipConceal(v:count1)')
|
||||
|
||||
nnoremap <silent> <buffer> <CR> :call tutor#FollowLink(0)<cr>
|
||||
nnoremap <silent> <buffer> <2-LeftMouse> :call tutor#MouseDoubleClick()<cr>
|
||||
nnoremap <buffer> >> :call tutor#InjectCommand()<cr>
|
||||
endfunction
|
||||
|
||||
function! tutor#SetSampleTextMappings()
|
||||
noremap <silent> <buffer> A :if match(getline('.'), '^--->') > -1 \| call search('\s{\@=', 'Wc') \| startinsert \| else \| startinsert! \| endif<cr>
|
||||
noremap <silent> <buffer> $ :if match(getline('.'), '^--->') > -1 \| call search('.\s{\@=', 'Wc') \| else \| call search('$', 'Wc') \| endif<cr>
|
||||
onoremap <silent> <buffer> $ :if match(getline('.'), '^--->') > -1 \| call search('.\s{\@=', 'Wc') \| else \| call search('$', 'Wc') \| endif<cr>
|
||||
noremap <silent> <buffer> ^ :if match(getline('.'), '^--->') > -1 \| call search('\(--->\s\)\@<=.', 'bcW') \| else \| call search('^', 'bcW') \|endif<cr>
|
||||
onoremap <silent> <buffer> ^ :if match(getline('.'), '^--->') > -1 \| call search('\(--->\s\)\@<=.', 'bcW') \| else \| call search('^', 'bcW') \|endif<cr>
|
||||
nmap <silent> <buffer> 0 ^<esc>
|
||||
nmap <silent> <buffer> <Home> ^<esc>
|
||||
nmap <silent> <buffer> <End> $
|
||||
imap <silent> <buffer> <Home> <esc>^<esc>:startinsert<cr>
|
||||
imap <silent> <buffer> <End> <esc>$:startinsert<cr>
|
||||
noremap <silent> <buffer> I :exe "normal! 0" \| startinsert<cr>
|
||||
endfunction
|
||||
|
||||
" Navigation: {{{1
|
||||
|
||||
" taken from http://stackoverflow.com/a/24224578
|
||||
|
||||
function! tutor#ForwardSkipConceal(count)
|
||||
let cnt=a:count
|
||||
let mvcnt=0
|
||||
let c=col('.')
|
||||
let l=line('.')
|
||||
let lc=col('$')
|
||||
let line=getline('.')
|
||||
while cnt
|
||||
if c>=lc
|
||||
let mvcnt+=cnt
|
||||
break
|
||||
endif
|
||||
if stridx(&concealcursor, 'n')==-1
|
||||
let isconcealed=0
|
||||
else
|
||||
let [isconcealed, cchar, group] = synconcealed(l, c)
|
||||
endif
|
||||
if isconcealed
|
||||
let cnt-=strchars(cchar)
|
||||
let oldc=c
|
||||
let c+=1
|
||||
while c < lc
|
||||
let [isconcealed2, cchar2, group2] = synconcealed(l, c)
|
||||
if !isconcealed2 || cchar2 != cchar
|
||||
break
|
||||
endif
|
||||
let c+= 1
|
||||
endwhile
|
||||
let mvcnt+=strchars(line[oldc-1:c-2])
|
||||
else
|
||||
let cnt-=1
|
||||
let mvcnt+=1
|
||||
let c+=len(matchstr(line[c-1:], '.'))
|
||||
endif
|
||||
endwhile
|
||||
return mvcnt.'l'
|
||||
endfunction
|
||||
|
||||
function! tutor#BackwardSkipConceal(count)
|
||||
let cnt=a:count
|
||||
let mvcnt=0
|
||||
let c=col('.')
|
||||
let l=line('.')
|
||||
let lc=0
|
||||
let line=getline('.')
|
||||
while cnt
|
||||
if c<=1
|
||||
let mvcnt+=cnt
|
||||
break
|
||||
endif
|
||||
if stridx(&concealcursor, 'n')==-1 || c == 0
|
||||
let isconcealed=0
|
||||
else
|
||||
let [isconcealed, cchar, group]=synconcealed(l, c-1)
|
||||
endif
|
||||
if isconcealed
|
||||
let cnt-=strchars(cchar)
|
||||
let oldc=c
|
||||
let c-=1
|
||||
while c>1
|
||||
let [isconcealed2, cchar2, group2] = synconcealed(l, c-1)
|
||||
if !isconcealed2 || cchar2 != cchar
|
||||
break
|
||||
endif
|
||||
let c-=1
|
||||
endwhile
|
||||
let c = max([c, 1])
|
||||
let mvcnt+=strchars(line[c-1:oldc-2])
|
||||
else
|
||||
let cnt-=1
|
||||
let mvcnt+=1
|
||||
let c-=len(matchstr(line[:c-2], '.$'))
|
||||
endif
|
||||
endwhile
|
||||
return mvcnt.'h'
|
||||
endfunction
|
||||
|
||||
" Hypertext: {{{1
|
||||
|
||||
function! tutor#FollowLink(force)
|
||||
let l:stack_s = join(map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")'), '')
|
||||
if l:stack_s =~# 'tutorLink'
|
||||
let l:link_start = searchpairpos('\[', '', ')', 'nbcW')
|
||||
let l:link_end = searchpairpos('\[', '', ')', 'ncW')
|
||||
if l:link_start[0] == l:link_end[0]
|
||||
let l:linkData = getline(l:link_start[0])[l:link_start[1]-1:l:link_end[1]-1]
|
||||
else
|
||||
return
|
||||
endif
|
||||
let l:target = matchstr(l:linkData, '(\@<=.*)\@=')
|
||||
if a:force != 1 && match(l:target, '\*.\+\*') > -1
|
||||
call cursor(l:link_start[0], l:link_end[1])
|
||||
call search(l:target, '')
|
||||
normal! ^
|
||||
elseif a:force != 1 && match(l:target, '^@tutor:') > -1
|
||||
let l:tutor = matchstr(l:target, '@tutor:\zs.*')
|
||||
exe "Tutor ".l:tutor
|
||||
else
|
||||
exe "help ".l:target
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" Folding And Info: {{{1
|
||||
|
||||
function! tutor#TutorFolds()
|
||||
if getline(v:lnum) =~# '^#\{1,6}'
|
||||
return ">". len(matchstr(getline(v:lnum), '^#\{1,6}'))
|
||||
else
|
||||
return "="
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! tutor#InfoText()
|
||||
let l:info_parts = []
|
||||
if exists('b:tutor_infofunc')
|
||||
call add(l:info_parts, eval(b:tutor_infofunc.'()'))
|
||||
endif
|
||||
return join(l:info_parts, " ")
|
||||
endfunction
|
||||
|
||||
" Marks {{{1
|
||||
function! tutor#PlaceXMarks()
|
||||
call cursor(1, 1)
|
||||
let b:tutor_sign_id = 1
|
||||
while search('^--->', 'W') > 0
|
||||
call tutor#CheckText(getline('.'))
|
||||
let b:tutor_sign_id+=1
|
||||
endwhile
|
||||
call cursor(1, 1)
|
||||
endfunction
|
||||
|
||||
function! tutor#CheckText(text)
|
||||
if match(a:text, '{expect:ANYTHING}\s*$') == -1
|
||||
if match(getline('.'), '^--->\s*$') > -1
|
||||
exe "sign place ".b:tutor_sign_id." line=".line('.')." name=tutorbad buffer=".bufnr('%')
|
||||
else
|
||||
if match(getline('.'), '|expect:.\+|') == -1
|
||||
let l:cur_text = matchstr(a:text, '---> \zs.\{-}\ze {expect:')
|
||||
let l:expected_text = matchstr(a:text, '{expect:\zs.*\ze}\s*$')
|
||||
else
|
||||
let l:cur_text = matchstr(a:text, '---> \zs.\{-}\ze |expect:')
|
||||
let l:expected_text = matchstr(a:text, '|expect:\zs.*\ze|\s*$')
|
||||
endif
|
||||
if l:cur_text ==# l:expected_text
|
||||
exe "sign place ".b:tutor_sign_id." line=".line('.')." name=tutorok buffer=".bufnr('%')
|
||||
else
|
||||
exe "sign place ".b:tutor_sign_id." line=".line('.')." name=tutorbad buffer=".bufnr('%')
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! tutor#OnTextChanged()
|
||||
let l:text = getline('.')
|
||||
if match(l:text, '^--->') > -1
|
||||
call tutor#CheckText(l:text)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" Tutor Cmd: {{{1
|
||||
|
||||
function! s:Locale()
|
||||
let l:lang = ""
|
||||
if exists('v:lang') && v:lang =~ '\a\a'
|
||||
let l:lang = v:lang
|
||||
elseif $LC_ALL =~ '\a\a'
|
||||
let l:lang = $LC_ALL
|
||||
elseif $LANG =~ '\a\a'
|
||||
let l:lang = $LANG
|
||||
endif
|
||||
return split(l:lang, '_')
|
||||
endfunction
|
||||
|
||||
function! s:GlobPath(lp, pat)
|
||||
if version >= 704 && has('patch279')
|
||||
return globpath(a:lp, a:pat, 0, 1)
|
||||
else
|
||||
return split(globpath(a:lp, a:pat, 0), '\n')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! s:Sort(a, b)
|
||||
let mod_a = fnamemodify(a:a, ':t')
|
||||
let mod_b = fnamemodify(a:b, ':t')
|
||||
if mod_a == mod_b
|
||||
let retval = 0
|
||||
elseif mod_a > mod_b
|
||||
if match(mod_a, '^vim-') > -1 && match(mod_b, '^vim-') == -1
|
||||
let retval = -1
|
||||
else
|
||||
let retval = 1
|
||||
endif
|
||||
else
|
||||
if match(mod_b, '^vim-') > -1 && match(mod_a, '^vim-') == -1
|
||||
let retval = 1
|
||||
else
|
||||
let retval = -1
|
||||
endif
|
||||
endif
|
||||
return retval
|
||||
endfunction
|
||||
|
||||
function! s:GlobTutorials(name)
|
||||
" search for tutorials:
|
||||
" 1. non-localized
|
||||
let l:tutors = s:GlobPath(&rtp, 'tutor/'.a:name.'.tutor')
|
||||
" 2. localized for current locale
|
||||
let l:locale_tutors = s:GlobPath(&rtp, 'tutor/'.s:Locale()[0].'/'.a:name.'.tutor')
|
||||
" 3. fallback to 'en'
|
||||
if len(l:locale_tutors) == 0
|
||||
let l:locale_tutors = s:GlobPath(&rtp, 'tutor/en/'.a:name.'.tutor')
|
||||
endif
|
||||
call extend(l:tutors, l:locale_tutors)
|
||||
return uniq(sort(l:tutors, 's:Sort'), 's:Sort')
|
||||
endfunction
|
||||
|
||||
function! tutor#TutorCmd(tutor_name)
|
||||
if match(a:tutor_name, '[[:space:]]') > 0
|
||||
echom "Only one argument accepted (check spaces)"
|
||||
return
|
||||
endif
|
||||
|
||||
if a:tutor_name == ''
|
||||
let l:tutor_name = 'vim-01-beginner.tutor'
|
||||
else
|
||||
let l:tutor_name = a:tutor_name
|
||||
endif
|
||||
|
||||
if match(l:tutor_name, '\.tutor$') > 0
|
||||
let l:tutor_name = fnamemodify(l:tutor_name, ':r')
|
||||
endif
|
||||
|
||||
let l:tutors = s:GlobTutorials(l:tutor_name)
|
||||
|
||||
if len(l:tutors) == 0
|
||||
echom "No tutorial with that name found"
|
||||
return
|
||||
endif
|
||||
|
||||
if len(l:tutors) == 1
|
||||
let l:to_open = l:tutors[0]
|
||||
else
|
||||
let l:idx = 0
|
||||
let l:candidates = ['Several tutorials with that name found. Select one:']
|
||||
for candidate in map(copy(l:tutors),
|
||||
\'fnamemodify(v:val, ":h:h:t")."/".s:Locale()[0]."/".fnamemodify(v:val, ":t")')
|
||||
let l:idx += 1
|
||||
call add(l:candidates, l:idx.'. '.candidate)
|
||||
endfor
|
||||
let l:tutor_to_open = inputlist(l:candidates)
|
||||
let l:to_open = l:tutors[l:tutor_to_open-1]
|
||||
endif
|
||||
|
||||
if has('gui') || has('nvim')
|
||||
exe "drop ".l:to_open
|
||||
else
|
||||
exe "edit ".l:to_open
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! tutor#TutorCmdComplete(lead,line,pos)
|
||||
let l:tutors = s:GlobTutorials('*')
|
||||
let l:names = uniq(sort(map(l:tutors, 'fnamemodify(v:val, ":t:r")'), 's:Sort'))
|
||||
return join(l:names, "\n")
|
||||
endfunction
|
@ -5238,7 +5238,7 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
print/ files for printing |postscript-print-encoding|
|
||||
spell/ spell checking files |spell|
|
||||
syntax/ syntax files |mysyntaxfile|
|
||||
tutor/ files for vimtutor |tutor|
|
||||
tutor/ tutorial files |:Tutor|
|
||||
|
||||
And any other file searched for with the |:runtime| command.
|
||||
|
||||
|
50
runtime/doc/pi_tutor.txt
Normal file
50
runtime/doc/pi_tutor.txt
Normal file
@ -0,0 +1,50 @@
|
||||
*pi_tutor.txt* Interactive tutorials.
|
||||
*vim-tutor-mode*
|
||||
|
||||
vim-tutor-mode provides a system to follow and create interactive tutorials
|
||||
for vim and third party plugins. It replaces the venerable `vimtutor` system.
|
||||
|
||||
==============================================================================
|
||||
1. Usage *vim-tutor-usage*
|
||||
|
||||
vim-tutor-mode tutorials are hypertext documents, they have rich text and
|
||||
contain links. To stand out from the rest of the text, links are underlined.
|
||||
You can follow them by placing the cursor over them and pressing <Enter>, or
|
||||
by double-clicking them.
|
||||
|
||||
1.1 Commands
|
||||
------------
|
||||
*:Tutor*
|
||||
:Tutor {tutorial} Opens a tutorial. Command-line completion for
|
||||
{tutorial} is provided, the candidates are a list of
|
||||
'.tutor' files found in the 'tutor/' folder in
|
||||
the 'runtimepath'. Tutorials prefixed with 'vim-' will
|
||||
always be shown first.
|
||||
|
||||
If no {tutorial} is provided, the command starts the
|
||||
'vim-01-beginner' tutorial, which is equivalent to
|
||||
Vim's `vimtutor`.
|
||||
|
||||
=============================================================================
|
||||
2. Creating tutorials *vim-tutor-create*
|
||||
|
||||
Writing vim-tutor-mode tutorials is easy. For an overview of the format used,
|
||||
please consult the 'tutor.tutor' file: >
|
||||
|
||||
:Tutor tutor
|
||||
<
|
||||
New tutorials must be placed in the 'tutor/' folder in the 'runtimepath'
|
||||
to be detected by the :Tutor command.
|
||||
|
||||
It is recommended to use a less formal style when writing tutorials than in
|
||||
regular documentation (unless the content requires it).
|
||||
|
||||
============================================================================
|
||||
3. Contributing
|
||||
|
||||
Development of the plugin is done over at github [1]. Feel free to report
|
||||
issues and make suggestions.
|
||||
|
||||
[1]: https://github.com/fmoralesc/vim-tutor-mode
|
||||
|
||||
" vim: set ft=help :
|
@ -70,52 +70,18 @@ If the file already exists you probably want to keep it.
|
||||
For more info see |vimrc|.
|
||||
|
||||
==============================================================================
|
||||
*01.3* Using the Vim tutor *tutor* *vimtutor*
|
||||
*01.3* Using the Vim tutor *tutor* *vimtutor*
|
||||
|
||||
Instead of reading the text (boring!) you can use the vimtutor to learn your
|
||||
first Vim commands. This is a 30 minute tutorial that teaches the most basic
|
||||
Vim functionality hands-on.
|
||||
|
||||
On Unix, if Vim has been properly installed, you can start it from the shell:
|
||||
>
|
||||
vimtutor
|
||||
To start the tutorial, execute >
|
||||
|
||||
On MS-Windows you can find it in the Program/Vim menu. Or execute
|
||||
vimtutor.bat in the $VIMRUNTIME directory.
|
||||
|
||||
This will make a copy of the tutor file, so that you can edit it without
|
||||
the risk of damaging the original.
|
||||
There are a few translated versions of the tutor. To find out if yours is
|
||||
available, use the two-letter language code. For French: >
|
||||
|
||||
vimtutor fr
|
||||
|
||||
On Unix, if you prefer using the GUI version of Vim, use "gvimtutor" or
|
||||
"vimtutor -g", optionally with a two-letter language code.
|
||||
|
||||
|
||||
On other systems, you have to do a little work:
|
||||
|
||||
1. Copy the tutor file. You can do this with Vim (it knows where to find it):
|
||||
>
|
||||
vim -u NONE -c 'e $VIMRUNTIME/tutor/tutor' -c 'w! TUTORCOPY' -c 'q'
|
||||
:Tutor
|
||||
<
|
||||
This will write the file "TUTORCOPY" in the current directory. To use a
|
||||
translated version of the tutor, append the two-letter language code to the
|
||||
filename. For French:
|
||||
>
|
||||
vim -u NONE -c 'e $VIMRUNTIME/tutor/tutor.fr' -c 'w! TUTORCOPY' -c 'q'
|
||||
<
|
||||
2. Edit the copied file with Vim:
|
||||
>
|
||||
vim -u NONE TUTORCOPY
|
||||
<
|
||||
The extra arguments make sure Vim is started in a good mood.
|
||||
from within nvim. The tutorial will lead you from that point. Have fun!
|
||||
|
||||
3. Delete the copied file when you are finished with it:
|
||||
>
|
||||
del TUTORCOPY
|
||||
<
|
||||
==============================================================================
|
||||
*01.4* Copyright *manual-copyright*
|
||||
|
||||
|
@ -164,7 +164,7 @@ right and j points down. In a picture: >
|
||||
The best way to learn these commands is by using them. Use the "i" command to
|
||||
insert some more lines of text. Then use the hjkl keys to move around and
|
||||
insert a word somewhere. Don't forget to press <Esc> to go back to Normal
|
||||
mode. The |vimtutor| is also a nice way to learn by doing.
|
||||
mode. |:Tutor| is also a nice way to learn by doing.
|
||||
|
||||
For Japanese users, Hiroshi Iwatani suggested using this:
|
||||
|
||||
|
@ -2259,6 +2259,9 @@ au BufNewFile,BufReadPost *.tssop setf tssop
|
||||
" TSS - Command Line (temporary)
|
||||
au BufNewFile,BufReadPost *.tsscl setf tsscl
|
||||
|
||||
" Tutor mode
|
||||
au BufNewFile,BufReadPost *.tutor setf tutor
|
||||
|
||||
" TWIG files
|
||||
au BufNewFile,BufReadPost *.twig setf twig
|
||||
|
||||
|
43
runtime/ftplugin/tutor.vim
Normal file
43
runtime/ftplugin/tutor.vim
Normal file
@ -0,0 +1,43 @@
|
||||
" vim: fdm=marker
|
||||
|
||||
" Base: {{{1
|
||||
call tutor#SetupVim()
|
||||
|
||||
" Buffer Settings: {{{1
|
||||
if !exists('g:tutor_debug') || g:tutor_debug == 0
|
||||
setlocal buftype=nofile
|
||||
setlocal concealcursor+=inv
|
||||
setlocal conceallevel=2
|
||||
else
|
||||
setlocal buftype=
|
||||
setlocal concealcursor&
|
||||
setlocal conceallevel=0
|
||||
endif
|
||||
setlocal noundofile
|
||||
|
||||
setlocal keywordprg=:help
|
||||
setlocal iskeyword=@,-,_
|
||||
|
||||
setlocal foldmethod=expr
|
||||
setlocal foldexpr=tutor#TutorFolds()
|
||||
setlocal foldcolumn=3
|
||||
setlocal foldlevel=4
|
||||
|
||||
setlocal statusline=%{toupper(expand('%:t:r'))}\ tutorial%=
|
||||
setlocal statusline+=%{tutor#InfoText()}
|
||||
|
||||
" Mappings: {{{1
|
||||
|
||||
call tutor#SetNormalMappings()
|
||||
call tutor#SetSampleTextMappings()
|
||||
|
||||
" Checks: {{{1
|
||||
|
||||
sign define tutorok text=✓ texthl=tutorOK
|
||||
sign define tutorbad text=✗ texthl=tutorX
|
||||
|
||||
if !exists('g:tutor_debug') || g:tutor_debug == 0
|
||||
call tutor#PlaceXMarks()
|
||||
autocmd! TextChanged <buffer> call tutor#OnTextChanged()
|
||||
autocmd! TextChangedI <buffer> call tutor#OnTextChanged()
|
||||
endif
|
6
runtime/plugin/tutor.vim
Normal file
6
runtime/plugin/tutor.vim
Normal file
@ -0,0 +1,6 @@
|
||||
if exists('g:loaded_tutor_mode_plugin') || &compatible
|
||||
finish
|
||||
endif
|
||||
let g:loaded_tutor_mode_plugin = 1
|
||||
|
||||
command! -nargs=? -complete=custom,tutor#TutorCmdComplete Tutor call tutor#TutorCmd(<q-args>)
|
83
runtime/syntax/tutor.vim
Normal file
83
runtime/syntax/tutor.vim
Normal file
@ -0,0 +1,83 @@
|
||||
if exists("b:current_syntax")
|
||||
finish
|
||||
endif
|
||||
|
||||
syn include @VIM syntax/vim.vim
|
||||
unlet b:current_syntax
|
||||
syn include @TUTORSHELL syntax/sh.vim
|
||||
unlet b:current_syntax
|
||||
syn include @VIMNORMAL syntax/vimnormal.vim
|
||||
|
||||
syn match tutorLink /\[.\{-}\](.\{-})/ contains=tutorInlineNormal
|
||||
syn match tutorLinkBands /\[\|\]\|(\|)/ contained containedin=tutorLink,tutorLinkAnchor conceal
|
||||
syn match tutorLinkAnchor /(.\{-})/ contained containedin=tutorLink conceal
|
||||
syn match tutorURL /\(https\?\|file\):\/\/[[:graph:]]\+\>\/\?/
|
||||
syn match tutorEmail /\<[[:graph:]]\+@[[:graph:]]\+\>/
|
||||
syn match tutorInternalAnchor /\*[[:alnum:]-]\+\*/ contained conceal containedin=tutorSection
|
||||
|
||||
syn match tutorSection /^#\{1,6}\s.\+$/ fold
|
||||
syn match tutorSectionBullet /#/ contained containedin=tutorSection
|
||||
|
||||
syn match tutorTOC /\ctable of contents:/
|
||||
|
||||
syn match tutorConcealedEscapes /\\[`*!\[\]()«»:$-]\@=/ conceal
|
||||
|
||||
syn region tutorEmphasis matchgroup=Delimiter start=/[\*]\@<!\*\*\@!/ end=/[\*]\@<!\*\*\@!/
|
||||
\ concealends contains=tutorInlineCommand,tutorInlineNormal
|
||||
syn region tutorBold matchgroup=Delimiter start=/\*\{2}/ end=/\*\{2}/
|
||||
\ concealends contains=tutorInlineCommand,tutorInlineNormal
|
||||
|
||||
syn keyword tutorMarks TODO NOTE IMPORTANT TIP ATTENTION EXERCISE
|
||||
syn keyword tutorMarks todo note tip attention exercise
|
||||
syn keyword tutorMarks Todo Note Tip Excersise
|
||||
|
||||
syn match tutorTextMark /\\\@<!--->/ conceal cchar=→
|
||||
syn region tutorSampleText start=/^\(--->\)\@=/ end=/$/ keepend contains=@SPELL
|
||||
syn match tutorSampleTextMark /^--->/ contained containedin=tutorSampleText conceal cchar=→
|
||||
syn match tutorSampleTextExpect /\}\@<! {expect:.\+}\s*$/ contained containedin=tutorSampleText conceal
|
||||
syn match tutorSampleTextExpect /|\@<! |expect:.\+|\s*$/ contained containedin=tutorSampleText conceal
|
||||
|
||||
syn region tutorCodeblock matchgroup=Delimiter start=/^\~\{3}.*$/ end=/^\~\{3}/
|
||||
|
||||
syn region tutorShell matchgroup=Delimiter start=/^\~\{3} sh\s*$/ end=/^\~\{3}/ keepend contains=@TUTORSHELL concealends
|
||||
syn match tutorShellPrompt /\(^\s*\)\@<=[$#]/ contained containedin=tutorShell
|
||||
|
||||
syn region tutorInlineCode matchgroup=Delimiter start=/\\\@<!`/ end=/\\\@<!\(`{\@!\|`\s\)/ concealends
|
||||
|
||||
syn region tutorCommand matchgroup=Delimiter start=/^\~\{3} cmd\( :\)\?\s*$/ end=/^\~\{3}/ keepend contains=@VIM concealends
|
||||
syn region tutorInlineCommand matchgroup=Delimiter start=/\\\@<!`\(.*{vim}\)\@=/ end=/\\\@<!`\({vim}\)\@=/ nextgroup=tutorInlineType contains=@VIM concealends
|
||||
|
||||
syn region tutorNormal matchgroup=Delimiter start=/^\~\{3} norm\(al\?\)\?\s*$/ end=/^\~\{3}/ contains=@VIMNORMAL concealends
|
||||
syn region tutorInlineNormal matchgroup=Delimiter start=/\\\@<!`\(\S*{normal}\)\@=/ end=/\\\@<!`\({normal}\)\@=/ nextgroup=tutorInlineType contains=@VIMNORMAL concealends
|
||||
|
||||
syn match tutorInlineType /{\(normal\|vim\)}/ contained conceal
|
||||
|
||||
syn match tutorInlineOK /✓/
|
||||
syn match tutorInlineX /✗/
|
||||
|
||||
hi! tutorLink cterm=underline gui=underline ctermfg=lightblue guifg=#0088ff
|
||||
hi! link tutorLinkBands Delimiter
|
||||
hi! link tutorLinkAnchor Underlined
|
||||
hi! link tutorInternalAnchor Underlined
|
||||
hi! link tutorURL tutorLink
|
||||
hi! link tutorEmail tutorLink
|
||||
|
||||
hi! link tutorSection Title
|
||||
hi! link tutorSectionBullet Delimiter
|
||||
|
||||
hi! link tutorTOC Directory
|
||||
|
||||
hi! tutorMarks cterm=bold gui=bold
|
||||
|
||||
hi! tutorEmphasis gui=italic cterm=italic
|
||||
hi! tutorBold gui=bold cterm=bold
|
||||
|
||||
hi! link tutorSampleText Special
|
||||
hi! tutorOK ctermfg=green guifg=#00ff88 cterm=bold gui=bold
|
||||
hi! tutorX ctermfg=red guifg=#ff2000 cterm=bold gui=bold
|
||||
hi! link tutorInlineOK tutorOK
|
||||
hi! link tutorInlineX tutorX
|
||||
|
||||
hi! link tutorShellPrompt Delimiter
|
||||
|
||||
let b:current_syntax = "tutor"
|
16
runtime/syntax/vimnormal.vim
Normal file
16
runtime/syntax/vimnormal.vim
Normal file
@ -0,0 +1,16 @@
|
||||
syn match normalOp /[dcrypoaxv!"#%&.-\/:<>=?@ABCDGHIJKLMNOPQRSUVWXYZgmqstz~iu]/ nextgroup=normalMod
|
||||
syn match normalMod /m\@<![ia]/
|
||||
syn match normalObject /["'()<>BW\[\]`bstweE{}ftFT;,$]/
|
||||
syn match normalCount /[0-9]/
|
||||
syn region normalSearch start=/[/?]\@<=./ end=/.<CR>\@=/ contains=normalKey keepend
|
||||
syn region normalChange start=/\([cr][wWbBeE()\[\]{}pst]\)\@<=./ end=/.\@=/ contains=normalKey keepend
|
||||
syn match normalCharSearch /\c[ftr]\@<=\w/
|
||||
syn match normalMark /\(f\@<!m\)\@<=[a-zA-Z0-9]/
|
||||
syn match normalKey /<'\@!.\{-}>'\@!/
|
||||
|
||||
hi! link normalOp Operator
|
||||
hi! link normalMod PreProc
|
||||
hi! link normalObject Structure
|
||||
hi! link normalCount Number
|
||||
hi! link normalMark Identifier
|
||||
hi! link normalKey Special
|
955
runtime/tutor/en/vim-01-beginner.tutor
Normal file
955
runtime/tutor/en/vim-01-beginner.tutor
Normal file
@ -0,0 +1,955 @@
|
||||
# Welcome to the VIM Tutor
|
||||
|
||||
Vim is a very powerful editor that has many commands, too many to explain in a
|
||||
tutor such as this. This tutor is designed to describe enough of the commands
|
||||
that you will be able to easily use Vim as an all-purpose editor. It is
|
||||
IMPORTANT to remember that this tutor is set up to teach by use. That means
|
||||
that you need to do the exercises to learn them properly. If you only read
|
||||
the text, you will soon forget what is most important!
|
||||
|
||||
NOTE: The commands in the lessons will modify the text, but those changes won't
|
||||
be saved. Don't worry about messing things up; just remember that pressing
|
||||
[<Esc>](<Esc>) and then [u](u) will undo the latest change.
|
||||
|
||||
This tutorial is interactive, and there are a few things you should know.
|
||||
Pressing [<Enter>](<Enter>) over text highlighted [like this](holy-grail) will take you to some relevant
|
||||
help (hopefully), and pressing K over any word will try to do so too. Sometimes
|
||||
you will be required to modify text like
|
||||
---> this here {expect:this here}
|
||||
Once you have done the changes correctly, the ✗ sign at the left will change
|
||||
to ✓. I imagine you can already see how neat Vim can be ;)
|
||||
Other times, you'll be prompted to run a command (I'll explain this later):
|
||||
~~~ cmd
|
||||
:help <Enter>
|
||||
~~~
|
||||
or press a sequence of keys
|
||||
~~~ normal
|
||||
<Esc>0f<Space>d3wP$P
|
||||
~~~
|
||||
|
||||
Text within <'s and >'s (like `<Enter>`{normal}) describes a key to press instead of text
|
||||
to type.
|
||||
|
||||
Now, make sure that your Shift-Lock key is NOT depressed and press the `j`{normal}
|
||||
key enough times to move the cursor so that Lesson 1.1 completely fills the
|
||||
screen.
|
||||
|
||||
## Lesson 1.1: MOVING THE CURSOR
|
||||
|
||||
** To move the cursor, press the `h`, `j`, `k`, `l` keys as indicated. **
|
||||
|
||||
↑
|
||||
k Hint: The h key is at the left and moves left.
|
||||
← h l → The l key is at the right and moves right.
|
||||
j The j key looks like a down arrow.
|
||||
↓
|
||||
|
||||
1. Move the cursor around the screen until you are comfortable.
|
||||
|
||||
2. Hold down the down key (j) until it repeats.
|
||||
Now you know how to move to the next lesson.
|
||||
|
||||
3. Using the down key, move to Lesson 1.2.
|
||||
|
||||
NOTE: If you are ever unsure about something you typed, press <Esc> to place
|
||||
you in Normal mode. Then retype the command you wanted.
|
||||
|
||||
NOTE: The cursor keys should also work. But using hjkl you will be able to
|
||||
move around much faster, once you get used to it. Really!
|
||||
|
||||
# Lesson 1.2: EXITING VIM
|
||||
|
||||
!! NOTE: Before executing any of the steps below, read this entire lesson !!
|
||||
|
||||
1. Press the <Esc> key (to make sure you are in [Normal mode]().
|
||||
|
||||
2. Type:
|
||||
|
||||
`:q!`{vim} `<Enter>`{normal}.
|
||||
|
||||
This exits the editor, DISCARDING any changes you have made.
|
||||
|
||||
3. Open vim and get back here by executing the command that got you into this
|
||||
tutor. That might be:
|
||||
|
||||
:Tutor <Enter>
|
||||
|
||||
4. If you have these steps memorized and are confident, execute steps
|
||||
1 through 3 to exit and re-enter the editor.
|
||||
|
||||
NOTE: [:q!](:q) <Enter> discards any changes you made. In a few lessons you
|
||||
will learn how to save the changes to a file.
|
||||
|
||||
5. Move the cursor down to Lesson 1.3.
|
||||
|
||||
## Lesson 1.3: TEXT EDITING - DELETION
|
||||
|
||||
** Press `x`{normal} to delete the character under the cursor. **
|
||||
|
||||
1. Move the cursor to the line below marked --->.
|
||||
|
||||
2. To fix the errors, move the cursor until it is on top of the
|
||||
character to be deleted.
|
||||
|
||||
3. Press [the x key](x) to delete the unwanted character.
|
||||
|
||||
4. Repeat steps 2 through 4 until the sentence is correct.
|
||||
|
||||
---> The ccow jumpedd ovverr thhe mooon. {expect:The cow jumped over the moon.}
|
||||
|
||||
5. Now that the line is correct, go on to Lesson 1.4.
|
||||
|
||||
NOTE: As you go through this tutor, do not try to memorize, learn by usage.
|
||||
|
||||
# Lesson 1.4: TEXT EDITING: INSERTION
|
||||
|
||||
** Press `i`{normal} to insert text. **
|
||||
|
||||
1. Move the cursor to the first line below marked --->.
|
||||
|
||||
2. To make the first line the same as the second, move the cursor on top
|
||||
of the first character AFTER where the text is to be inserted.
|
||||
|
||||
3. Press i and type in the necessary additions.
|
||||
|
||||
4. As each error is fixed press <Esc> to return to Normal mode.
|
||||
Repeat steps 2 through 4 to correct the sentence.
|
||||
|
||||
---> There is text misng this . {expect:There is some text missing from this line.}
|
||||
---> There is some text missing from this line. {expect:There is some text missing from this line.}
|
||||
|
||||
5. When you are comfortable inserting text move to lesson 1.5.
|
||||
|
||||
# Lesson 1.5: TEXT EDITING: APPENDING
|
||||
|
||||
** Press `A`{normal} to append text. **
|
||||
|
||||
1. Move the cursor to the first line below marked --->.
|
||||
It does not matter on what character the cursor is in that line.
|
||||
|
||||
2. Press [A](A) and type in the necessary additions.
|
||||
|
||||
3. As the text has been appended press <Esc> to return to Normal mode.
|
||||
|
||||
4. Move the cursor to the second line marked ---> and repeat
|
||||
steps 2 and 3 to correct this sentence.
|
||||
|
||||
---> There is some text missing from th {expect:There is some text missing from this line.}
|
||||
---> There is some text missing from this line. {expect:There is some text missing from this line.}
|
||||
---> There is also some text miss {expect:There is also some text missing here.}
|
||||
---> There is also some text missing here. {expect:There is also some text missing here.}
|
||||
|
||||
5. When you are comfortable appending text move to lesson 1.6.
|
||||
|
||||
# Lesson 1.6: EDITING A FILE
|
||||
|
||||
** Use `:wq`{vim} to save a file and exit. **
|
||||
|
||||
!! NOTE: Before executing any of the steps below, read this entire lesson !!
|
||||
|
||||
1. Exit this tutor as you did in lesson 1.2: :q!
|
||||
Or, if you have access to another terminal, do the following there.
|
||||
|
||||
2. At the shell prompt type this command:
|
||||
~~~ sh
|
||||
$ vim tutor
|
||||
~~~
|
||||
'vim' is the command to start the Vim editor, 'tutor' is the name of the
|
||||
file you wish to edit. Use a file that may be changed.
|
||||
|
||||
3. Insert and delete text as you learned in the previous lessons.
|
||||
|
||||
4. Save the file with changes and exit Vim with:
|
||||
~~~ cmd
|
||||
:wq
|
||||
~~~
|
||||
|
||||
Note you'll need to press `<Enter>` to execute the command.
|
||||
|
||||
5. If you have quit vimtutor in step 1 restart the vimtutor and move down to
|
||||
the following summary.
|
||||
|
||||
6. After reading the above steps and understanding them: do it.
|
||||
|
||||
# Lesson 1 SUMMARY
|
||||
|
||||
1. The cursor is moved using either the arrow keys or the hjkl keys.
|
||||
h (left) j (down) k (up) l (right)
|
||||
|
||||
2. To start Vim from the shell prompt type:
|
||||
|
||||
~~~ sh
|
||||
$ vim FILENAME
|
||||
~~~
|
||||
|
||||
3. To exit Vim type: <Esc> :q! <Enter> to trash all changes.
|
||||
OR type: <Esc> :wq <Enter> to save the changes.
|
||||
|
||||
4. To delete the character at the cursor type: `x`{normal}
|
||||
|
||||
5. To insert or append text type:
|
||||
`i`{normal} type inserted text `<Esc>`{normal} insert before the cursor
|
||||
`A`{normal} type appended text `<Esc>`{normal} append after the line
|
||||
|
||||
NOTE: Pressing `<Esc>`{normal} will place you in Normal mode or will cancel
|
||||
an unwanted and partially completed command.
|
||||
|
||||
Now continue with Lesson 2.
|
||||
|
||||
# Lesson 2.1: DELETION COMMANDS
|
||||
|
||||
** Type `dw`{normal} to delete a word. **
|
||||
|
||||
1. Press `<Esc>`{normal} to make sure you are in Normal mode.
|
||||
|
||||
2. Move the cursor to the line below marked --->.
|
||||
|
||||
3. Move the cursor to the beginning of a word that needs to be deleted.
|
||||
|
||||
4. Type [d](d)[w](w) to make the word disappear.
|
||||
|
||||
---> There are a some words fun that don't belong paper in this sentence. {expect:There are some words that don't belong in this sentence.}
|
||||
|
||||
5. Repeat steps 3 and 4 until the sentence is correct and go to Lesson 2.2.
|
||||
|
||||
# Lesson 2.2: MORE DELETION COMMANDS
|
||||
|
||||
** Type `d$`{normal} to delete to the end of the line. **
|
||||
|
||||
1. Press <Esc> to make sure you are in Normal mode.
|
||||
|
||||
2. Move the cursor to the line below marked --->.
|
||||
|
||||
3. Move the cursor to the end of the correct line (AFTER the first . ).
|
||||
|
||||
4. Type `d$`{normal} to delete to the end of the line.
|
||||
|
||||
---> Somebody typed the end of this line twice. end of this line twice. {expect:ANYTHING}
|
||||
|
||||
5. Move on to Lesson 2.3 to understand what is happening.
|
||||
|
||||
# Lesson 2.3: ON OPERATORS AND MOTIONS
|
||||
|
||||
|
||||
Many commands that change text are made from an [operator](operator) and a [motion](navigation).
|
||||
The format for a delete command with the [d](d) delete operator is as follows:
|
||||
|
||||
d motion
|
||||
|
||||
Where:
|
||||
d - is the delete operator.
|
||||
motion - is what the operator will operate on (listed below).
|
||||
|
||||
A short list of motions:
|
||||
[w](w) - until the start of the next word, EXCLUDING its first character.
|
||||
[e](e) - to the end of the current word, INCLUDING the last character.
|
||||
[$]($) - to the end of the line, INCLUDING the last character.
|
||||
|
||||
Thus typing `de`{normal} will delete from the cursor to the end of the word.
|
||||
|
||||
NOTE: Pressing just the motion while in Normal mode without an operator will
|
||||
move the cursor as specified.
|
||||
|
||||
# Lesson 2.4: USING A COUNT FOR A MOTION
|
||||
|
||||
** Typing a number before a motion repeats it that many times. **
|
||||
|
||||
1. Move the cursor to the start of the line marked ---> below.
|
||||
|
||||
2. Type `2w`{normal} to move the cursor two words forward.
|
||||
|
||||
3. Type `3e`{normal} to move the cursor to the end of the third word forward.
|
||||
|
||||
4. Type `0`{normal} ([zero](0)) to move to the start of the line.
|
||||
|
||||
5. Repeat steps 2 and 3 with different numbers.
|
||||
|
||||
---> This is just a line with words you can move around in. {expect:ANYTHING}
|
||||
|
||||
6. Move on to Lesson 2.5.
|
||||
|
||||
# Lesson 2.5: USING A COUNT TO DELETE MORE
|
||||
|
||||
** Typing a number with an operator repeats it that many times. **
|
||||
|
||||
In the combination of the delete operator and a motion mentioned above you
|
||||
insert a count before the motion to delete more:
|
||||
d number motion
|
||||
|
||||
1. Move the cursor to the first UPPER CASE word in the line marked --->.
|
||||
|
||||
2. Type `d2w`{normal} to delete the two UPPER CASE words
|
||||
|
||||
3. Repeat steps 1 and 2 with a different count to delete the consecutive
|
||||
UPPER CASE words with one command
|
||||
|
||||
---> this ABC DE line FGHI JK LMN OP of words is Q RS TUV cleaned up. {expect:this line of words is cleaned up.}
|
||||
|
||||
# Lesson 2.6: OPERATING ON LINES
|
||||
|
||||
** Type dd to delete a whole line. **
|
||||
|
||||
Due to the frequency of whole line deletion, the designers of Vi decided
|
||||
it would be easier to simply type two d's to delete a line.
|
||||
|
||||
1. Move the cursor to the second line in the phrase below.
|
||||
2. Type [dd](dd) to delete the line.
|
||||
3. Now move to the fourth line.
|
||||
4. Type `2dd`{normal} to delete two lines.
|
||||
|
||||
---> 1) Roses are red, {expect:ANYTHING}
|
||||
---> 2) Mud is fun, {expect:ANYTHING}
|
||||
---> 3) Violets are blue, {expect:ANYTHING}
|
||||
---> 4) I have a car, {expect:ANYTHING}
|
||||
---> 5) Clocks tell time, {expect:ANYTHING}
|
||||
---> 6) Sugar is sweet {expect:ANYTHING}
|
||||
---> 7) And so are you. {expect:ANYTHING}
|
||||
|
||||
# Lesson 2.7: THE UNDO COMMAND
|
||||
|
||||
** Press u to undo the last commands, U to fix a whole line. **
|
||||
|
||||
1. Move the cursor to the line below marked ---> and place it on the
|
||||
first error.
|
||||
2. Type `x`{normal} to delete the first unwanted character.
|
||||
3. Now type `u`{normal} to undo the last command executed.
|
||||
4. This time fix all the errors on the line using the `x`{normal} command.
|
||||
5. Now type a capital `U`{normal} to return the line to its original state.
|
||||
6. Now type `u`{normal} a few times to undo the U and preceding commands.
|
||||
7. Now type `<Ctrl-r>`{normal} a few times to redo the commands (undo the undo's).
|
||||
|
||||
---> Fiix the errors oon thhis line and reeplace them witth undo. {expect:Fix the errors on this line and replace them with undo.}
|
||||
|
||||
8. These are very useful commands. Now move on to the Lesson 2 Summary.
|
||||
|
||||
# Lesson 2 SUMMARY
|
||||
|
||||
1. To delete from the cursor up to the next word type: `dw`{normal}
|
||||
2. To delete from the cursor to the end of a line type: `d$`{normal}
|
||||
3. To delete a whole line type: `dd`{normal}
|
||||
4. To repeat a motion prepend it with a number: `2w`{normal}
|
||||
|
||||
5. The format for a change command is:
|
||||
operator [number] motion
|
||||
where:
|
||||
operator - is what to do, such as [d](d) for delete
|
||||
[number] - is an optional count to repeat the motion
|
||||
motion - moves over the text to operate on, such as:
|
||||
[w](w) (word),
|
||||
[$]($) (to the end of line), etc.
|
||||
|
||||
6. To move to the start of the line use a zero: [0](0)
|
||||
|
||||
7. To undo previous actions, type: `u`{normal} (lowercase u)
|
||||
To undo all the changes on a line, type: `U`{normal} (capital U)
|
||||
To undo the undo's, type: `<Ctrl-r>`{normal}
|
||||
|
||||
# Lesson 3.1: THE PUT COMMAND
|
||||
|
||||
** Type p to put previously deleted text after the cursor. **
|
||||
|
||||
1. Move the cursor to the first ---> line below.
|
||||
|
||||
2. Type `dd`{normal} to delete the line and store it in a Vim register.
|
||||
|
||||
3. Move the cursor to the c) line, ABOVE where the deleted line should go.
|
||||
|
||||
4. Type `p`{normal} to put the line below the cursor.
|
||||
|
||||
5. Repeat steps 2 through 4 to put all the lines in correct order.
|
||||
|
||||
---> d) Can you learn too? {expect:ANYTHING}
|
||||
---> b) Violets are blue, {expect:ANYTHING}
|
||||
---> c) Intelligence is learned, {expect:ANYTHING}
|
||||
---> a) Roses are red, {expect:ANYTHING}
|
||||
|
||||
# Lesson 3.2: THE REPLACE COMMAND
|
||||
|
||||
** Type `rx`{normal} to replace the character at the cursor with x. **
|
||||
|
||||
1. Move the cursor to the first line below marked --->.
|
||||
|
||||
2. Move the cursor so that it is on top of the first error.
|
||||
|
||||
3. Type `r`{normal} and then the character which should be there.
|
||||
|
||||
4. Repeat steps 2 and 3 until the first line is equal to the second one.
|
||||
|
||||
---> Whan this lime was tuoed in, someone presswd some wrojg keys! {expect:When this line was typed in, someone pressed some wrong keys!}
|
||||
---> When this line was typed in, someone pressed some wrong keys! {expect:When this line was typed in, someone pressed some wrong keys!}
|
||||
|
||||
5. Now move on to Lesson 3.3.
|
||||
|
||||
NOTE: Remember that you should be learning by doing, not memorization.
|
||||
|
||||
# Lesson 3.3: THE CHANGE OPERATOR
|
||||
|
||||
** To change until the end of a word, type `ce`{normal} **
|
||||
|
||||
1. Move the cursor to the first line below marked --->.
|
||||
|
||||
2. Place the cursor on the "u" in "lubw".
|
||||
|
||||
3. Type `ce`{normal} and the correct word (in this case, type "ine" ).
|
||||
|
||||
4. Press `<Esc>`{normal} and move to the next character that needs to be changed.
|
||||
|
||||
5. Repeat steps 3 and 4 until the first sentence is the same as the second.
|
||||
|
||||
---> This lubw has a few wptfd that mrrf changing usf the change operator. {expect:This line has a few words that need changing using the change operator.}
|
||||
---> This line has a few words that need changing using the change operator. {expect:This line has a few words that need changing using the change operator.}
|
||||
|
||||
Notice that [c](c)e deletes the word and places you in Insert mode.
|
||||
|
||||
# Lesson 3.4: MORE CHANGES USING c
|
||||
|
||||
** The change operator is used with the same motions as delete. **
|
||||
|
||||
1. The change operator works in the same way as delete. The format is:
|
||||
|
||||
c [number] motion
|
||||
|
||||
2. The motions are the same, such as `w`{normal} (word) and `$`{normal} (end of line).
|
||||
|
||||
3. Move to the first line below marked --->.
|
||||
|
||||
4. Move the cursor to the first error.
|
||||
|
||||
5. Type `c$`{normal} and type the rest of the line like the second and press `<Esc>`{normal}.
|
||||
|
||||
---> The end of this line needs some help to make it like the second. {expect:The end of this line needs to be corrected using the c$ command.}
|
||||
---> The end of this line needs to be corrected using the c$ command. {expect:The end of this line needs to be corrected using the c$ command.}
|
||||
|
||||
NOTE: You can use the Backspace key to correct mistakes while typing.
|
||||
|
||||
# Lesson 3 SUMMARY
|
||||
|
||||
1. To put back text that has just been deleted, type [p](p). This puts the
|
||||
deleted text AFTER the cursor (if a line was deleted it will go on the
|
||||
line below the cursor).
|
||||
|
||||
2. To replace the character under the cursor, type [r](r) and then the
|
||||
character you want to have there.
|
||||
|
||||
3. The [change operator](c) allows you to change from the cursor to where the
|
||||
motion takes you. eg. Type `ce`{normal} to change from the cursor to the end of
|
||||
the word, `c$`{normal} to change to the end of a line.
|
||||
|
||||
4. The format for change is:
|
||||
|
||||
c [number] motion
|
||||
|
||||
Now go on to the next lesson.
|
||||
|
||||
# Lesson 4.1: CURSOR LOCATION AND FILE STATUS
|
||||
|
||||
** Type `<Ctrl-g>`{normal} to show your location in the file and the file status.
|
||||
Type `G`{normal} to move to a line in the file. **
|
||||
|
||||
NOTE: Read this entire lesson before executing any of the steps!!
|
||||
|
||||
1. Hold down the `<Ctrl>`{normal} key and press `g`{normal}. We call this `<Ctrl-g>`{normal}.
|
||||
A message will appear at the bottom of the page with the filename and the
|
||||
position in the file. Remember the line number for Step 3.
|
||||
|
||||
NOTE: You may see the cursor position in the lower right corner of the screen
|
||||
This happens when the ['ruler']('ruler') option is set (see :help 'ruler' )
|
||||
|
||||
2. Press [G](G) to move you to the bottom of the file.
|
||||
Type [gg](gg) to move you to the start of the file.
|
||||
|
||||
3. Type the number of the line you were on and then `G`{normal} . This will
|
||||
return you to the line you were on when you first pressed `<Ctrl-g>`{normal}.
|
||||
|
||||
4. If you feel confident to do this, execute steps 1 through 3.
|
||||
|
||||
# Lesson 4.2: THE SEARCH COMMAND
|
||||
|
||||
** Type `/`{normal} followed by a phrase to search for the phrase. **
|
||||
|
||||
1. In Normal mode type the `/`{normal} character. Notice that it and the cursor
|
||||
appear at the bottom of the screen as with the : command.
|
||||
|
||||
2. Now type 'errroor' `<Enter>`{normal}. This is the word you want to search for.
|
||||
|
||||
3. To search for the same phrase again, simply type [n](n) .
|
||||
To search for the same phrase in the opposite direction, type [N](N) .
|
||||
|
||||
4. To search for a phrase in the backward direction, use [?](?) instead of / .
|
||||
|
||||
5. To go back to where you came from press `<Ctrl-o>`{normal} (Keep Ctrl down while
|
||||
pressing the letter o). Repeat to go back further. `<Ctrl-i>`{normal} goes forward.
|
||||
|
||||
---> "errroor" is not the way to spell error; errroor is an error. {expect:ANYTHING}
|
||||
|
||||
NOTE: When the search reaches the end of the file it will continue at the
|
||||
start, unless the ['wrapscan']('wrapscan') option has been reset.
|
||||
|
||||
# Lesson 4.3: MATCHING PARENTHESES SEARCH
|
||||
|
||||
** Type `%`{normal} to find a matching ),], or }. **
|
||||
|
||||
1. Place the cursor on any (, [, or { in the line below marked --->.
|
||||
|
||||
2. Now type the [%](%) character.
|
||||
|
||||
3. The cursor will move to the matching parenthesis or bracket.
|
||||
|
||||
4. Type `%`{normal} to move the cursor to the other matching bracket.
|
||||
|
||||
5. Move the cursor to another (,),[,],{ or } and see what `%`{normal} does.
|
||||
|
||||
---> This ( is a test line with ('s, ['s ] and {'s } in it. )) {expect:ANYTHING}
|
||||
|
||||
NOTE: This is very useful in debugging a program with unmatched parentheses!
|
||||
|
||||
# Lesson 4.4: THE SUBSTITUTE COMMAND
|
||||
|
||||
** Type `:s/old/new/g` to substitute "new" for "old". **
|
||||
|
||||
1. Move the cursor to the line below marked --->.
|
||||
|
||||
2. Type
|
||||
~~~ cmd
|
||||
:s/thee/the/
|
||||
~~~
|
||||
|
||||
NOTE that the [:s](:s) command only changed the first occurrence of "thee" in the line.
|
||||
|
||||
3. Now type
|
||||
~~~ cmd
|
||||
:s/thee/the/g
|
||||
~~~
|
||||
|
||||
Adding the g [flag](:s_flags) means to substitute globally in the line, change
|
||||
all occurrences of "thee" in the line.
|
||||
|
||||
---> thee best time to see thee flowers is in thee spring. {expect:the best time to see the flowers is in the spring.}
|
||||
|
||||
4. To change every occurrence of a character string between two lines, type
|
||||
~~~ cmd
|
||||
:#,#s/old/new/g
|
||||
~~~
|
||||
where #,# are the line numbers of the range of lines where the substitution is to be done.
|
||||
|
||||
Type
|
||||
~~~ cmd
|
||||
:%s/old/new/g
|
||||
~~~
|
||||
to change every occurrence in the whole file.
|
||||
|
||||
Type
|
||||
~~~ cmd
|
||||
:%s/old/new/gc
|
||||
~~~
|
||||
to find every occurrence in the whole file, with a prompt whether to substitute or not.
|
||||
|
||||
# Lesson 4 SUMMARY
|
||||
|
||||
1. `<Ctrl-g>`{normal} displays your location in the file and the file status.
|
||||
`G`{normal} moves to the end of the file.
|
||||
number `G`{normal} moves to that line number.
|
||||
`gg`{normal} moves to the first line.
|
||||
|
||||
2. Typing `/`{normal} followed by a phrase searches FORWARD for the phrase.
|
||||
Typing `?`{normal} followed by a phrase searches BACKWARD for the phrase.
|
||||
After a search type `n`{normal} to find the next occurrence in the same direction
|
||||
or `N`{normal} to search in the opposite direction.
|
||||
`<Ctrl-o>`{normal} takes you back to older positions, `<Ctrl-i>`{normal} to newer positions.
|
||||
|
||||
3. Typing `%`{normal} while the cursor is on a (,),[,],{, or } goes to its match.
|
||||
|
||||
4. To substitute new for the first old in a line type
|
||||
~~~ cmd
|
||||
:s/old/new
|
||||
~~~
|
||||
To substitute new for all 'old's on a line type
|
||||
~~~ cmd
|
||||
:s/old/new/g
|
||||
~~~
|
||||
To substitute phrases between two line #'s type
|
||||
~~~ cmd
|
||||
:#,#s/old/new/g
|
||||
~~~
|
||||
To substitute all occurrences in the file type
|
||||
~~~ cmd
|
||||
:%s/old/new/g
|
||||
~~~
|
||||
To ask for confirmation each time add 'c'
|
||||
~~~ cmd
|
||||
:%s/old/new/gc
|
||||
~~~
|
||||
|
||||
# Lesson 5.1: HOW TO EXECUTE AN EXTERNAL COMMAND
|
||||
|
||||
** Type `:!`{vim} followed by an external command to execute that command. **
|
||||
|
||||
1. Type the familiar command `:`{normal} to set the cursor at the bottom of the
|
||||
screen. This allows you to enter a command-line command.
|
||||
|
||||
2. Now type the [!](!cmd) (exclamation point) character. This allows you to
|
||||
execute any external shell command.
|
||||
|
||||
3. As an example type "ls" following the "!" and then hit `<Enter>`{normal}. This
|
||||
will show you a listing of your directory, just as if you were at the
|
||||
shell prompt.
|
||||
|
||||
NOTE: It is possible to execute any external command this way, also with
|
||||
arguments.
|
||||
|
||||
NOTE: All : commands must be finished by hitting <Enter>
|
||||
From here on we will not always mention it.
|
||||
|
||||
# Lesson 5.2: MORE ON WRITING FILES
|
||||
|
||||
** To save the changes made to the text, type `:w`{vim} FILENAME. **
|
||||
|
||||
1. Type `:!ls`{vim} to get a listing of your directory.
|
||||
You already know you must hit `<Enter>`{normal} after this.
|
||||
|
||||
2. Choose a filename that does not exist yet, such as TEST.
|
||||
|
||||
3. Now type:
|
||||
~~~ cmd
|
||||
:w TEST
|
||||
~~~
|
||||
(where TEST is the filename you chose.)
|
||||
|
||||
4. This saves the whole file (the Vim Tutor) under the name TEST.
|
||||
To verify this, type `:!ls`{vim} again to see your directory.
|
||||
|
||||
NOTE: If you were to exit Vim and start it again with vim TEST , the file
|
||||
would be an exact copy of the tutor when you saved it.
|
||||
|
||||
5. Now remove the file by typing:
|
||||
~~~ cmd
|
||||
:!rm TEST
|
||||
~~~
|
||||
|
||||
# Lesson 5.3: SELECTING TEXT TO WRITE
|
||||
|
||||
** To save part of the file, type `v`{normal} motion `:w FILENAME`{vim} **
|
||||
|
||||
1. Move the cursor to this line.
|
||||
|
||||
2. Press [v](v) and move the cursor to the fifth item below. Notice that the
|
||||
text is highlighted.
|
||||
|
||||
3. Press the `:`{normal} character. At the bottom of the screen
|
||||
|
||||
:'<,'>
|
||||
|
||||
will appear.
|
||||
|
||||
4. Type
|
||||
|
||||
`:w TEST`{vim}
|
||||
|
||||
where TEST is a filename that does not exist yet. Verify that you see
|
||||
|
||||
`:'<,'>w TEST`{vim}
|
||||
|
||||
before you press `<Enter>`{normal}.
|
||||
|
||||
5. Vim will write the selected lines to the file TEST. Use `:!ls`{vim} to see it.
|
||||
Do not remove it yet! We will use it in the next lesson.
|
||||
|
||||
NOTE: Pressing [v](v) starts [Visual selection](visual-mode). You can move
|
||||
the cursor around to make the selection bigger or smaller. Then you can
|
||||
use an operator to do something with the text. For example, `d`{normal} deletes
|
||||
the text.
|
||||
|
||||
# Lesson 5.4: RETRIEVING AND MERGING FILES
|
||||
|
||||
** To insert the contents of a file, type `:r FILENAME`{vim} **
|
||||
|
||||
1. Place the cursor just above this line.
|
||||
|
||||
NOTE: After executing Step 2 you will see text from Lesson 5.3. Then move
|
||||
DOWN to see this lesson again.
|
||||
|
||||
2. Now retrieve your TEST file using the command
|
||||
|
||||
`:r TEST`{vim}
|
||||
|
||||
where TEST is the name of the file you used.
|
||||
The file you retrieve is placed below the cursor line.
|
||||
|
||||
3. To verify that a file was retrieved, cursor back and notice that there
|
||||
are now two copies of Lesson 5.3, the original and the file version.
|
||||
|
||||
NOTE: You can also read the output of an external command. For example,
|
||||
|
||||
`:r !ls`{vim}
|
||||
|
||||
reads the output of the `ls` command and puts it below the cursor.
|
||||
|
||||
# Lesson 5 SUMMARY
|
||||
|
||||
1. [:!command](:!cmd) executes an external command.
|
||||
|
||||
Some useful examples are:
|
||||
`:!ls`{vim} - shows a directory listing
|
||||
`:!rm FILENAME`{vim} - removes file FILENAME
|
||||
|
||||
2. [:w](:w) FILENAME writes the current Vim file to disk with
|
||||
name FILENAME.
|
||||
|
||||
3. [v](v) motion :w FILENAME saves the Visually selected lines in file
|
||||
FILENAME.
|
||||
|
||||
4. [:r](:r) FILENAME retrieves disk file FILENAME and puts it
|
||||
below the cursor position.
|
||||
|
||||
5. [:r !dir](:r!) reads the output of the dir command and
|
||||
puts it below the cursor position.
|
||||
|
||||
# Lesson 6.1: THE OPEN COMMAND
|
||||
|
||||
** Type `o`{normal} to open a line below the cursor and place you in Insert mode. **
|
||||
|
||||
1. Move the cursor to the line below marked --->.
|
||||
|
||||
2. Type the lowercase letter `o`{normal} to [open](o) up a line BELOW the cursor and place
|
||||
you in Insert mode.
|
||||
|
||||
3. Now type some text and press `<Esc>`{normal} to exit Insert mode.
|
||||
|
||||
---> After typing o the cursor is placed on the open line in Insert mode. {expect:ANYTHING}
|
||||
|
||||
4. To open up a line ABOVE the cursor, simply type a [capital O](O), rather
|
||||
than a lowercase `o`{normal}. Try this on the line below.
|
||||
|
||||
---> Open up a line above this by typing O while the cursor is on this line. {expect:ANYTHING}
|
||||
|
||||
# Lesson 6.2: THE APPEND COMMAND
|
||||
|
||||
** Type `a`{normal} to insert text AFTER the cursor. **
|
||||
|
||||
1. Move the cursor to the start of the line below marked --->.
|
||||
|
||||
2. Press `e`{normal} until the cursor is on the end of "li".
|
||||
|
||||
3. Type an `a`{normal} (lowercase) to [append](a) text AFTER the cursor.
|
||||
|
||||
4. Complete the word like the line below it. Press `<Esc>`{normal} to exit Insert
|
||||
mode.
|
||||
|
||||
5. Use `e`{normal} to move to the next incomplete word and repeat steps 3 and 4.
|
||||
|
||||
---> This li will allow you to pract appendi text to a line. {expect:This line will allow you to practice appending text to a line.}
|
||||
---> This line will allow you to practice appending text to a line. {expect:This line will allow you to practice appending text to a line.}
|
||||
|
||||
NOTE: [a](a), [i](i) and [A](A) all go to the same Insert mode, the only difference is where
|
||||
the characters are inserted.
|
||||
|
||||
# Lesson 6.3: ANOTHER WAY TO REPLACE
|
||||
|
||||
** Type a capital `R`{normal} to replace more than one character. **
|
||||
|
||||
1. Move the cursor to the first line below marked --->. Move the cursor to
|
||||
the beginning of the first "xxx".
|
||||
|
||||
2. Now press `R`{normal} ([capital R](R)) and type the number below it in the second line, so that it
|
||||
replaces the "xxx".
|
||||
|
||||
3. Press `<Esc>`{normal} to leave [Replace mode](mode-replace). Notice that the rest of the line
|
||||
remains unmodified.
|
||||
|
||||
4. Repeat the steps to replace the remaining "xxx".
|
||||
|
||||
---> Adding 123 to xxx gives you xxx. {expect:Adding 123 to 456 gives you 579.}
|
||||
---> Adding 123 to 456 gives you 579. {expect:Adding 123 to 456 gives you 579.}
|
||||
|
||||
NOTE: Replace mode is like Insert mode, but every typed character deletes an
|
||||
existing character.
|
||||
|
||||
# Lesson 6.4: COPY AND PASTE TEXT
|
||||
|
||||
** Use the `y`{normal} operator to copy text and `p`{normal} to paste it **
|
||||
|
||||
1. Go to the line marked with ---> below and place the cursor after "a)".
|
||||
|
||||
2. Start Visual mode with `v`{normal} and move the cursor to just before "first".
|
||||
|
||||
3. Type `y`{normal} to [yank](yank) (copy) the highlighted text.
|
||||
|
||||
4. Move the cursor to the end of the next line: `j$`{normal}
|
||||
|
||||
5. Type `p`{normal} to [put](put) (paste) the text. Then type: "a second"`<Esc>`{normal}.
|
||||
|
||||
6. Use Visual mode to select " item.", yank it with `y`{normal}, move to the end of
|
||||
the next line with `j$`{normal} and put the text there with `p`{normal}.
|
||||
|
||||
---> a) this is the first item.
|
||||
---> b) {expect: b) this is the second item}
|
||||
|
||||
NOTE: you can also use `y`{normal} as an operator; `yw`{normal} yanks one word.
|
||||
|
||||
# Lesson 6.5: SET OPTION
|
||||
|
||||
** Set an option so a search or substitute ignores case **
|
||||
|
||||
1. Search for 'ignore' by entering: `/ignore`
|
||||
Repeat several times by pressing `n`{normal}.
|
||||
|
||||
2. Set the 'ic' (Ignore case) option by entering:
|
||||
~~~ cmd
|
||||
:set ic
|
||||
~~~
|
||||
3. Now search for 'ignore' again by pressing n
|
||||
Notice that Ignore and IGNORE are now also found.
|
||||
|
||||
4. Set the 'hlsearch' and 'incsearch' options:
|
||||
~~~ cmd
|
||||
:set hls is
|
||||
~~~
|
||||
5. Now type the search command again and see what happens: /ignore <Enter>
|
||||
|
||||
6. To disable ignoring case enter:
|
||||
~~~ cmd
|
||||
:set noic
|
||||
~~~
|
||||
7. To toggle the value of a setting, prepend it with "inv":
|
||||
~~~ cmd
|
||||
:set invic
|
||||
~~~
|
||||
NOTE: To remove the highlighting of matches enter:
|
||||
~~~ cmd
|
||||
:nohlsearch
|
||||
~~~
|
||||
NOTE: If you want to ignore case for just one search command, use [\c](/\c)
|
||||
in the phrase: /ignore\c <Enter>
|
||||
|
||||
# Lesson 6 SUMMARY
|
||||
|
||||
1. Type `o`{normal} to open a line BELOW the cursor and start Insert mode.
|
||||
Type `O`{normal} to open a line ABOVE the cursor.
|
||||
|
||||
2. Type `a`{normal} to insert text AFTER the cursor.
|
||||
Type `A`{normal} to insert text after the end of the line.
|
||||
|
||||
3. The `e`{normal} command moves to the end of a word.
|
||||
|
||||
4. The `y`{normal} operator yanks (copies) text, `p`{normal} puts (pastes) it.
|
||||
|
||||
5. Typing a capital `R`{normal} enters Replace mode until `<Esc>`{normal} is pressed.
|
||||
|
||||
6. Typing "[:set](:set) xxx" sets the option "xxx". Some options are:
|
||||
|
||||
'ic' 'ignorecase' ignore upper/lower case when searching
|
||||
'is' 'incsearch' show partial matches for a search phrase
|
||||
'hls' 'hlsearch' highlight all matching phrases
|
||||
|
||||
You can either use the long or the short option name.
|
||||
|
||||
7. Prepend "no" to switch an option off:
|
||||
~~~ cmd
|
||||
:set noic
|
||||
~~~
|
||||
8. Prepend "inv" to toggle an option:
|
||||
~~~ cmd
|
||||
:set invic
|
||||
~~~
|
||||
|
||||
# Lesson 7.1: GETTING HELP
|
||||
|
||||
** Use the on-line help system **
|
||||
|
||||
Vim has a comprehensive on-line help system. To get started, try one of
|
||||
these three:
|
||||
- press the `<HELP>`{normal} key (if you have one)
|
||||
- press the `<F1>`{normal} key (if you have one)
|
||||
- type
|
||||
`:help`{vim}
|
||||
|
||||
Read the text in the help window to find out how the help works.
|
||||
Type `<Ctrl-w><Ctrl-w>`{normal} to jump from one window to another.
|
||||
Type `:q`{vim} to close the help window.
|
||||
|
||||
You can find help on just about any subject, by giving an argument to the
|
||||
":help" command. Try these (don't forget pressing <Enter>):
|
||||
~~~ cmd
|
||||
:help w
|
||||
:help c_CTRL-D
|
||||
:help insert-index
|
||||
:help user-manual
|
||||
~~~
|
||||
# Lesson 7.2: CREATE A STARTUP SCRIPT
|
||||
|
||||
** Enable Vim features **
|
||||
|
||||
Vim has many more features than Vi, but most of them are disabled by
|
||||
default. To start using more features you have to create a "vimrc" file.
|
||||
|
||||
1. Start editing the "vimrc" file. This depends on your system:
|
||||
`:e ~/.vimrc`{vim} for Unix-like systems
|
||||
`:e $VIM/_vimrc`{vim} for Microsoft Windows
|
||||
|
||||
2. Now read the example "vimrc" file contents:
|
||||
`:r $VIMRUNTIME/vimrc_example.vim`{vim}
|
||||
|
||||
3. Write the file with:
|
||||
`:w`{vim}
|
||||
|
||||
The next time you start Vim it will use syntax highlighting.
|
||||
You can add all your preferred settings to this "vimrc" file.
|
||||
For more information type :help vimrc-intro
|
||||
|
||||
# Lesson 7.3: COMPLETION
|
||||
|
||||
** Command line completion with `<Ctrl-d>`{normal} and `<Tab>`{normal} **
|
||||
|
||||
1. Look what files exist in the directory: `:!ls`{vim}
|
||||
|
||||
2. Type the start of a command: `:e`{vim}
|
||||
|
||||
3. Press `<Ctrl-d>`{normal} and Vim will show a list of commands that start with "e".
|
||||
|
||||
4. Press `<Tab>`{normal} and Vim will complete the command name to ":edit".
|
||||
|
||||
5. Now add a space and the start of an existing file name: `:edit FIL`{vim}
|
||||
|
||||
6. Press `<Tab>`{normal}. Vim will complete the name (if it is unique).
|
||||
|
||||
NOTE: Completion works for many commands. It is especially useful for `:help`{vim}.
|
||||
|
||||
# Lesson 7 SUMMARY
|
||||
|
||||
1. Type `:help`{vim}
|
||||
or press `<F1>`{normal} or `<Help>`{normal} to open a help window.
|
||||
|
||||
2. Type `:help TOPIC`{vim} to find help on TOPIC.
|
||||
|
||||
3. Type `<Ctrl-w><Ctrl-w>`{normal} to jump to another window
|
||||
|
||||
4. Type `:q`{vim} to close the help window
|
||||
|
||||
5. Create a vimrc startup script to keep your preferred settings.
|
||||
|
||||
6. While in command mode, press `<Ctrl-d>`{normal} to see possible completions.
|
||||
Press `<Tab>`{normal} to use one completion.
|
||||
|
||||
# CONCLUSION
|
||||
|
||||
This 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. Consult the help often.
|
||||
|
||||
There are many resources online to learn more about vim. Here's a bunch of them:
|
||||
|
||||
- *Learn Vim Progressively*: http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/
|
||||
- *Learning Vim in 2014*: http://benmccormick.org/learning-vim-in-2014/
|
||||
- Vimcasts: http://vimcasts.org/
|
||||
- Vim Video-Tutorials by Derek Wyatt: http://derekwyatt.org/vim/tutorials/
|
||||
- *Learn Vimscript the Hard Way*: http://learnvimscriptthehardway.stevelosh.com/
|
||||
- *7 Habits of Effective Text Editing*: http://www.moolenaar.net/habits.html
|
||||
|
||||
If you prefer a book, *Practival Vim* by Drew Neil is recommended often.
|
||||
|
||||
This tutorial was written by Michael C. Pierce and Robert K. Ware, Colorado
|
||||
School of Mines using ideas supplied by Charles Smith, Colorado State
|
||||
University. E-mail: bware@mines.colorado.edu.
|
||||
|
||||
Modified for Vim by Bram Moolenaar.
|
||||
Modified for vim-tutor-mode by Felipe Morales.
|
259
runtime/tutor/tutor.tutor
Normal file
259
runtime/tutor/tutor.tutor
Normal file
@ -0,0 +1,259 @@
|
||||
# CREATING A VIM TUTORIAL WITH VIM-TUTOR-MODE
|
||||
|
||||
This tutorial will guide you through the steps required to create a tutorial
|
||||
file for vim-tutor-mode. It is also meant as a demo of vim-tutor-mode
|
||||
capabilities.
|
||||
|
||||
Table of contents:
|
||||
|
||||
- [Setting up](*setting-up*)
|
||||
- [vim-tutor-mode's markup](*markup*)
|
||||
- [emphasis](*emphasis*)
|
||||
- [headers](*headers*)
|
||||
- [links](*links*)
|
||||
- [codeblocks](*codeblocks*)
|
||||
- [Interactive elements](*interactive*)
|
||||
- [expect](*expect*)
|
||||
|
||||
## SETTING UP *setting-up*
|
||||
|
||||
First, you'll need to enable "debug" mode
|
||||
~~~ cmd
|
||||
:let g:tutor_debug = 1
|
||||
~~~
|
||||
This will allow saving changes to the tutor files and will disable conceals, so
|
||||
you can more easily check your changes.
|
||||
|
||||
After this, create a new .tutor file (we will be practicing on this very file, so you
|
||||
don't need to do this now):
|
||||
~~~ cmd
|
||||
:e new-tutorial.tutor
|
||||
~~~
|
||||
|
||||
## VIM-TUTOR-MODE's MARKDOWN *markup*
|
||||
|
||||
vim-tutor-mode uses a subset of markdown's syntax to format the tutorials. The
|
||||
subset supported should be enough for most tutorials and the maintainers will
|
||||
try to keep it as small as possible (if regular markdown allows for several
|
||||
ways to do the same thing, tutor markdown will only provide the one the
|
||||
maintainers think is easier to handle).
|
||||
|
||||
### Emphasis *emphasis*
|
||||
|
||||
For emphasized text (italics), as in normal markdown, you use \*. E.g.:
|
||||
|
||||
\*text\*
|
||||
|
||||
is displayed like
|
||||
|
||||
*text*
|
||||
|
||||
Note: The underscores variant is not supported.
|
||||
|
||||
For strong emphasis (bold), you use \*\*. E.g.:
|
||||
|
||||
\*\*this\*\*
|
||||
|
||||
is displayed like
|
||||
|
||||
**this**
|
||||
|
||||
1. Format the line below so it becomes a lesson description:
|
||||
|
||||
---> This is text with importat information {expect:This is text with **important information**}
|
||||
---> This is text with **important information** {expect:This is text with **important information**}
|
||||
|
||||
Note: Some words (e.g., NOTE, IMPORTANT, tip, ATTENTION, etc.) will also be
|
||||
highlighted. You don't need to mark them specially.
|
||||
|
||||
2. Turn the line below into a TODO item:
|
||||
|
||||
---> Document '&variable' {expect:TODO: Document '&variable'}
|
||||
---> TODO: Document '&variable' {expect:TODO: Document '&variable'}
|
||||
|
||||
### Headers *headers*
|
||||
|
||||
3. Practice fixing the lines below:
|
||||
|
||||
---> This is a level 1 header {expect:# This is a level 1 header}
|
||||
---> # This is a level 1 header {expect:# This is a level 1 header}
|
||||
---> This is a level 3 header {expect:### This is a level 3 header}
|
||||
---> ### This is a level 3 header {expect:### This is a level 3 header}
|
||||
---> This is a header with a label {expect:# This is a header with a label {*label*}}
|
||||
---> # This is a header with a label {*label*} {expect:# This is a header with a label {*label*}}
|
||||
|
||||
4. Now, create a 4th level section here, and add a label like in the previous
|
||||
exercise:
|
||||
|
||||
|
||||
|
||||
ATTENTION We will use this label later, so remember it.
|
||||
|
||||
### Links *links*
|
||||
|
||||
It is good practice to include links in your tutorials to reference materials,
|
||||
like vim's own help or external documents. You can also link to other parts of
|
||||
the document.
|
||||
|
||||
Links have the syntax
|
||||
|
||||
\[label\]\(target\)
|
||||
|
||||
#### Help links
|
||||
|
||||
If the target of a link matches a help topic, opening it will open it.
|
||||
|
||||
5. Fix the following line:
|
||||
|
||||
---> A link to help for the 'breakindent' option {expect:A link to help for the ['breakindent']('breakindent') option}
|
||||
---> A link to help for the ['breakindent']('breakindent') option {expect:A link to help for the ['breakindent']('breakindent') option}
|
||||
|
||||
#### Anchor links
|
||||
|
||||
A link can also lead to a place in the file itself. Anchors are written
|
||||
|
||||
\*anchor\*
|
||||
|
||||
and are hidden by default. Links to them look like
|
||||
|
||||
\[label\]\(\*anchor\*\)
|
||||
|
||||
6. Add the appropiate link:
|
||||
|
||||
---> A link to the Links section {expect:A link to the [Links](*links*) section}
|
||||
---> A link to the [Links](*links*) section {expect:A link to the [Links](*links*) section}
|
||||
|
||||
7. Now, create a link to the section you created on exercise 4
|
||||
above.
|
||||
|
||||
|
||||
|
||||
# Tutorial links
|
||||
|
||||
You can also have links to other tutorials. For this, you'll write the wnchor in the format
|
||||
|
||||
@tutor:TUTORIAL
|
||||
|
||||
7. Create a link to this tutorial:
|
||||
|
||||
---> A link to the vim-tutor-mode tutorial {expect:A link to [the vim-tutor-mode tutorial](@tutor:tutor)}
|
||||
---> A link to [the vim-tutor-mode tutorial](@tutor:tutor) {expect:A link to [the vim-tutor-mode tutorial](@tutor:tutor)}
|
||||
|
||||
### Codeblocks *codeblocks*
|
||||
|
||||
vim-tutor-mode tutorials can include viml sections
|
||||
|
||||
~~~ cmd
|
||||
echom "hello"
|
||||
~~~
|
||||
|
||||
is displayed as
|
||||
~~~ cmd
|
||||
echom "hello"
|
||||
~~~
|
||||
|
||||
8. Copy the viml section below
|
||||
|
||||
---> {expect:~~~ viml}
|
||||
---> {expect:echom "the value of &number is".string(&number)}
|
||||
---> {expect:~~~}
|
||||
|
||||
---> ~~~ viml {expect:~~~ viml}
|
||||
---> echom "the value of &number is".string(&number) {expect:echom "the value of &number is".string(&number)}
|
||||
---> ~~~ {expect:~~~}
|
||||
|
||||
You can inline viml code using "\`" and "\`{vim}":
|
||||
|
||||
\`call myFunction()\`{vim}
|
||||
|
||||
is displayed as
|
||||
|
||||
`call myFunction()`{vim}
|
||||
|
||||
[normal](Normal-mode) commands can also be embedded in tutorials.
|
||||
|
||||
~~~ normal
|
||||
ftdaW
|
||||
~~~
|
||||
|
||||
is displayed as
|
||||
~~~ normal
|
||||
ftdaW
|
||||
~~~
|
||||
|
||||
Note: you can also write `norm` or `normal`.
|
||||
|
||||
9. Copy the normal section below
|
||||
|
||||
---> {expect:~~~ normal}
|
||||
---> {expect:d2w}
|
||||
---> {expect:~~~}
|
||||
|
||||
---> ~~~ normal {expect:~~~ normal}
|
||||
---> d2w {expect:d2w}
|
||||
---> ~~~ {expect:~~~}
|
||||
|
||||
You can also inline normal commands by using "\`" and "\`{normal}":
|
||||
|
||||
\`gq\`{normal} is very useful.
|
||||
|
||||
is displayed:
|
||||
|
||||
`gq`{normal} is very useful.
|
||||
|
||||
10. Complete the line as shown
|
||||
|
||||
---> d {expect:«d2w»}
|
||||
---> «d2w» {expect:«d2w»}
|
||||
|
||||
Commands to run in the system shell can be highlighted by indenting a line starting with "$".
|
||||
|
||||
~~~ sh
|
||||
$ vim --version
|
||||
~~~
|
||||
|
||||
## INTERACTIVE ELEMENTS *interactive*
|
||||
|
||||
As visible in this very document, vim-tutor-mode includes some interactive
|
||||
elements, to provide feedback to the user about his progress. These elements
|
||||
all have the syntax
|
||||
|
||||
\---> TEXT {CLAUSE}
|
||||
|
||||
where \---> must start at the beginning of the line. If TEXT satisfies CLAUSE,
|
||||
a ✓ sign will appear to the left. A ✗ sign is displayed otherwise. The CLAUSE
|
||||
itself is hidden unless debug mode is set or ['conceallevel']('conceallevel')
|
||||
is 2.
|
||||
|
||||
### expect *expect*
|
||||
|
||||
The basic clause is "expect", which is satisfied if TEXT is the same as the
|
||||
content of the clause. For example
|
||||
|
||||
\---> TEXT {expect:TEXT}
|
||||
|
||||
is satisfied, but
|
||||
|
||||
\---> OTHER TEXT {expect:TEXT}
|
||||
|
||||
is not.
|
||||
|
||||
13. Make both lines the same:
|
||||
|
||||
---> this is not right {expect:---> this is right} |expect:---> this is right {expect:---> this is right}|
|
||||
---> ---> this is right {expect:---> this is right} |expect:---> this is right {expect:---> this is right}|
|
||||
|
||||
|
||||
If the content of a expect clause is ANYTHING, no checks will be performed. This is
|
||||
useful to create a line that is highlighted you want the user to play with.
|
||||
|
||||
\---> TEXT {expect:ANYTHING}
|
||||
|
||||
is displayed
|
||||
|
||||
---> this is free text {expect:ANYTHING}
|
||||
|
||||
14. Turn the line below into free text:
|
||||
|
||||
---> this is some text |expect:---> this is some text {expect:ANYTHING}|
|
||||
---> ---> this is some text {expect:ANYTHING} |expect:---> this is some text {expect:ANYTHING}|
|
Loading…
Reference in New Issue
Block a user