-- 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. local helpers = require('test.functional.helpers') local feed, insert, source = helpers.feed, helpers.insert, helpers.source local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect -- Vim script user functions needed for some of the test cases. local function source_user_functions() source([[ 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 ]]) end describe('Visual mode and operator', function() before_each(function() clear() source_user_functions() end) it('simple change in Visual mode', function() insert([[ 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]]) -- Exercise characterwise Visual mode plus operator, with count and repeat. execute('/^apple') feed('lvld.l3vd.') -- Same in linewise Visual mode. execute('/^line 1') feed('Vcnewlinej.j2Vd.') -- Same in blockwise Visual mode. execute('/^xxxx') feed('jlc l.l2c----l.') -- Assert buffer contents. expect([[ a y newline newline --------x --------x xxxx--------x xxxx--------x]]) end) it('Visual mode mapping', function() insert([[ KiwiRaspberryDateWatermelonPeach JambuRambutanBananaTangerineMango]]) -- Set up Visual mode mappings. execute('vnoremap W /\\u/s-1') execute('vnoremap iW :call SelectInCaps()') -- Do a simple change using the simple vmap, also with count and repeat. execute('/^Kiwi') feed('vWcNol.fD2vd.') -- Same, using the vmap that maps to an Ex command. execute('/^Jambu') feed('llviWc-l.l2vdl.') -- Assert buffer contents. expect([[ NoNoberryach --ago]]) end) it('Operator-pending mode mapping', function() insert([[ PineappleQuinceLoganberryOrangeGrapefruitKiwiZ JuniperDurianZ LemonNectarineZ]]) -- Set up Operator-pending mode mappings. execute('onoremap W /\\u/') execute('onoremap W :call MoveToCap()') execute('onoremap iW :call SelectInCaps()') -- Do a simple change using the simple omap, also with count and repeat. execute('/^Pineapple') feed('cW-l.l2.l.') -- Same, using the omap that maps to an Ex command to move the cursor. execute('/^Juniper') feed('g?\\WfD.') -- Same, using the omap that uses Ex and Visual mode (custom text object). execute('/^Lemon') feed('yiWPlciWNewfr.') -- Assert buffer contents. expect([[ ----Z WhavcreQhevnaZ LemonNewNewZ]]) end) -- Vim patch 7.3.879 addressed a bug where typing ":" (the start of an Ex -- command) in Operator-pending mode couldn't be aborted with Escape, the -- change operation implied by the operator was always executed. it('patch 7.3.879', function() insert([[ zzzz zzzz]]) -- Start a change operation consisting of operator plus Ex command, like -- "dV:..." etc., then either -- - complete the operation by pressing Enter: as a result the buffer is -- changed, taking into account the v/V/ modifier given; or -- - abort the operation by pressing Escape: no change to the buffer is -- carried out. execute('/^zzzz') feed([[dV:dv::set noma | let v:errmsg = '']]) feed([[d::set ma | put = v:errmsg =~# '^E21' ? 'ok' : 'failed']]) feed([[dv:dV::set noma | let v:errmsg = '']]) feed([[d::set ma | put = v:errmsg =~# '^E21' ? 'failed' : 'ok']]) -- Assert buffer contents. expect([[ zzz ok ok]]) end) end)