Test for Visual mode and operators

Tests for the two kinds of operations: Those executed with Visual mode
followed by an operator and those executed via Operator-pending mode. Also
part of the test are mappings, counts, and repetition with the . command.

Test cases:
- Visual modes (v V CTRL-V) followed by an operator; count; repeating
- Visual mode maps; count; repeating
  - Simple
  - With an Ex command (custom text object)
- Operator-pending mode maps
  - Simple
  - With Ex command moving the cursor
  - With Ex command and Visual selection (custom text object)
- Patch 7.3.879: Properly abort Ex command in Operator-pending mode

STARTTEST
:so small.vim
:set enc=utf-8 nocp viminfo+=nviminfo
:
:" User functions
:function MoveToCap()
:  call search('\u', 'W')
:endfunction
:function SelectInCaps()
:  let [line1, col1] = searchpos('\u', 'bcnW')
:  let [line2, col2] = searchpos('.\u', 'nW')
:  call setpos("'<", [0, line1, col1, 0])
:  call setpos("'>", [0, line2, col2, 0])
:  normal! gv
:endfunction
:
:" Visual modes followed by operator
/^apple
lvld.l3vd.:
/^line 1
Vcnewlinej.j2Vd.:
/^xxxx
jlc  l.l2c----l.:
:
:" Visual mode maps (movement and text object)
:vnoremap W /\u/s-1<CR>
:vnoremap iW :<C-U>call SelectInCaps()<CR>
/^Kiwi
vWcNol.fD2vd.:
/^Jambu
llviWc-l.l2vdl.:
:
:" Operator-pending mode maps (movement and text object)
:onoremap W /\u/<CR>
:onoremap <Leader>W :<C-U>call MoveToCap()<CR>
:onoremap iW :<C-U>call SelectInCaps()<CR>
/^Pineapple
cW-l.l2.l.:
/^Juniper
g?\WfD.:
/^Lemon
yiWPlciWNewfr.:
:
:" Patch 7.3.879: Properly abort Operator-pending mode for "dv:<Esc>" etc.
/^zzzz
dV:
dv:
:set noma | let v:errmsg = ''
d:
:set ma | put = v:errmsg =~# '^E21' ? 'ok' : 'failed'
dv:dV::set noma | let v:errmsg = ''
d::set ma | put = v:errmsg =~# '^E21' ? 'failed' : 'ok'
:
:$put =''
:$put ='characterwise visual mode: replace last line'
:$put ='a'
:let @" = 'x'
:let v:errmsg = ''
v$p
:$put ='---'
:$put ='v:errmsg='.v:errmsg
:
:$put =''
:$put ='characterwise visual mode: delete middle line'
:$put ='a'
:$put ='b'
:$put ='c'
kkv$d
:$put ='---'
:
:$put =''
:$put ='characterwise visual mode: delete middle two line'
:$put ='a'
:$put ='b'
:$put ='c'
kkvj$d
:$put ='---'
:
:$put =''
:$put ='characterwise visual mode: delete last line'
:$put ='a'
:$put ='b'
:$put ='c'
v$d
:$put ='---'
:
:$put =''
:$put ='characterwise visual mode: delete last two line'
:$put ='a'
:$put ='b'
:$put ='c'
kvj$d
:$put ='---'
:
:" Select mode maps
:snoremap <lt>End> <End>
:snoremap <lt>Down> <Down>
:snoremap <lt>Del> <Del>
:
:$put =''
:$put ='characterwise select mode: delete middle line'
:$put ='a'
:$put ='b'
:$put ='c'
kkgh<End><Del>
:$put ='---'
:
:$put =''
:$put ='characterwise select mode: delete middle two line'
:$put ='a'
:$put ='b'
:$put ='c'
kkgh<Down><End><Del>
:$put ='---'
:
:$put =''
:$put ='characterwise select mode: delete last line'
:$put ='a'
:$put ='b'
:$put ='c'
gh<End><Del>
:$put ='---'
:
:$put =''
:$put ='characterwise select mode: delete last two line'
:$put ='a'
:$put ='b'
:$put ='c'
kgh<Down><End><Del>
:$put ='---'
:
:$put =''
:$put ='linewise select mode: delete middle line'
:$put ='a'
:$put ='b'
:$put ='c'
kkgH<Del>
:$put ='---'
:
:$put =''
:$put ='linewise select mode: delete middle two line'
:$put ='a'
:$put ='b'
:$put ='c'
kkgH<Down><Del>
:$put ='---'
:
:$put =''
:$put ='linewise select mode: delete last line'
:$put ='a'
:$put ='b'
:$put ='c'
gH<Del>
:$put ='---'
:
:$put =''
:$put ='linewise select mode: delete last two line'
:$put ='a'
:$put ='b'
:$put ='c'
kgH<Down><Del>
:$put ='---'
:
:$put =''
:$put ='v_p: replace last character with line register at middle line'
:$put ='aaa'
:$put ='bbb'
:$put ='ccc'
:-2yank
k$vp
:$put ='---'
:
:$put =''
:$put ='v_p: replace last character with line register at middle line selecting newline'
:$put ='aaa'
:$put ='bbb'
:$put ='ccc'
:-2yank
k$v$p
:$put ='---'
:
:$put =''
:$put ='v_p: replace last character with line register at last line'
:$put ='aaa'
:$put ='bbb'
:$put ='ccc'
:-2yank
$vp
:$put ='---'
:
:$put =''
:$put ='v_p: replace last character with line register at last line selecting newline'
:$put ='aaa'
:$put ='bbb'
:$put ='ccc'
:-2yank
$v$p
:$put ='---'
:
:$put =''
:$put ='gv in exclusive select mode after operation'
:$put ='zzz '
:$put ='Ã¤Ã '
:set selection=exclusive
kv3lyjv3lpgvcxxx
:$put ='---'
:
:$put =''
:$put ='gv in exclusive select mode without operation'
:$put ='zzz '
:set selection=exclusive
0v3lgvcxxx
:$put ='---'
:/^start:/+2,$w! test.out
:q!
ENDTEST

start:

apple banana cherry

line 1 line 1
line 2 line 2
line 3 line 3
line 4 line 4
line 5 line 5
line 6 line 6

xxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxxx

KiwiRaspberryDateWatermelonPeach
JambuRambutanBananaTangerineMango

PineappleQuinceLoganberryOrangeGrapefruitKiwiZ
JuniperDurianZ
LemonNectarineZ

zzzz
zzzz
