require 'spec_helper' def set_file_content(string) string = normalize_string_indent(string) File.open(filename, 'w'){ |f| f.write(string) } vim.edit filename end def get_file_content() vim.write IO.read(filename).strip end def before(string) options.each { |x| vim.command(x) } set_file_content(string) end def after(string) expect(get_file_content()).to eq normalize_string_indent(string) end def type(string) string.scan(/<.*?>|./).each do |key| if /<.*>/.match(key) vim.feedkeys "\\#{key}" else vim.feedkeys key end end end describe "Multiple Cursors op pending & exit from insert|visual mode" do let(:filename) { 'test.txt' } let(:options) { ['let g:multi_cursor_exit_from_insert_mode = 0', 'let g:multi_cursor_exit_from_visual_mode = 0'] } # the default value of g:multi_cursor_normal_maps already works # for testing operator-pending specify "#paste from unnamed register to 3 cursors" do before <<-EOF yankme a b c a b c a b c EOF type 'yiwjvwwp' after <<-EOF yankme a b cyankme a b cyankme a b cyankme EOF end specify "#paste buffer normal caw then p" do before <<-EOF hello jan world hello feb world hello mar world EOF type 'vwcawbP' after <<-EOF jan hello world feb hello world mar hello world EOF end specify "#paste buffer normal C then ABC then p" do before <<-EOF hello jan world hello feb world hello mar world EOF type 'vwCABC p' after <<-EOF hello ABC jan world hello ABC feb world hello ABC mar world EOF end specify "#paste buffer normal daw then P" do before <<-EOF hello jan world hello feb world hello mar world EOF type 'vwdawbP' after <<-EOF jan hello world feb hello world mar hello world EOF end specify "#paste buffer normal D then P" do before <<-EOF hello jan world hello feb world hello mar world EOF type 'vwwhDbhP' after <<-EOF hello world jan hello world feb hello world mar EOF end specify "#paste buffer normal s then p" do before <<-EOF hello jan world hello feb world hello mar world EOF type 'vws1p' after <<-EOF hello 1jan world hello 1feb world hello 1mar world EOF end end describe "Multiple Cursors when normal_maps is empty" do let(:filename) { 'test.txt' } let(:options) { ['let g:multi_cursor_normal_maps = {}'] } # Operator-pending commands are handled correctly thanks to their inclusion # in `g:multi_cursor_normal_maps`. # # When an operator-pending command like 'd' is missing from that setting's # value, then it should result in a no-op, but we should still remain in # multicursor mode. specify "#normal mode 'd'" do before <<-EOF hello hello EOF type 'vdx' after <<-EOF hell hell EOF end end describe "Multiple Cursors when visual_maps is empty" do let(:filename) { 'test.txt' } let(:options) { ['let g:multi_cursor_visual_maps = {}'] } # Operator-pending commands are handled correctly thanks to their inclusion # in `g:multi_cursor_visual_maps`. # # When an operator-pending command like 'f' is missing from that setting's # value, then it should result in a no-op, but we should still remain in # multicursor mode. specify "#visual mode 'i'" do before <<-EOF hello world x hello world x EOF type 'fwfx' after <<-EOF hello x hello x EOF end end describe "Multiple Cursors" do let(:filename) { 'test.txt' } let(:options) { [] } specify "#paste buffer normal x then p" do before <<-EOF jan feb mar EOF type 'jjxp' after <<-EOF ajn efb amr EOF end specify "#paste buffer visual y then p" do before <<-EOF hello jan world hello feb world hello mar world EOF type 'vwvelywhp' after <<-EOF hello jan jan world hello feb feb world hello mar mar world EOF end specify "#paste buffer initial visual y then P" do before <<-EOF hello jan world hello feb world hello mar world EOF type 'wywbp' after <<-EOF jan jan world jan feb world jan mar world EOF end specify "#paste buffer visual y then P" do before <<-EOF hello jan world hello feb world hello mar world EOF type 'vwvely^P' after <<-EOF jan hello jan world feb hello feb world mar hello mar world EOF end specify "#paste buffer visual Y then P" do before <<-EOF hello jan world hello feb world hello mar world EOF type 'vwvY^P' after <<-EOF hello jan world hello jan world hello feb world hello feb world hello mar world hello mar world EOF end specify "#multiline replacement" do before <<-EOF hello hello hello EOF type 'cworld' after <<-EOF world world world EOF end specify "#single line replacement" do before <<-EOF hello hello hello EOF type 'cworld' after <<-EOF world world world EOF end specify "#mixed line replacement" do before <<-EOF hello hello hello EOF type 'cworld' after <<-EOF world world world EOF end specify "#new line in insert mode" do before <<-EOF hello hello EOF type 'chelloworld' after <<-EOF hello world hello world EOF end specify "#new line in insert mode middle of line" do before <<-EOF hello world hello world EOF type 'vlxi' after <<-EOF hello world hello world EOF end specify "#normal mode 'o'" do before <<-EOF hello hello EOF type 'voworld' after <<-EOF hello world hello world EOF end specify "#normal mode 'O'" do before <<-EOF hello hello EOF type 'vOworld' after <<-EOF world hello world hello EOF end specify "#find command basic" do before <<-EOF hello hello EOF vim.normal ':MultipleCursorsFind hello' type 'cworld' after <<-EOF world world EOF end specify "#visual line mode replacement" do before <<-EOF hello world hello world EOF type 'Vchi!' after <<-EOF hi! hi! EOF end specify "#skip key" do before <<-EOF hello hello hello EOF type 'cworld' after <<-EOF world hello world EOF end specify "#prev key" do before <<-EOF hello hello hello EOF type 'cworld' after <<-EOF world world hello EOF end specify "#visual mode 'i'" do before <<-EOF hi (hello world jan) bye hi (hello world feb) bye hi (hello world mar) bye EOF type 'fwibcone' after <<-EOF hi (one) bye hi (one) bye hi (one) bye EOF end specify "#visual mode 'a'" do before <<-EOF hi (hello world jan) bye hi (hello world feb) bye hi (hello world mar) bye EOF type 'fwabcone' after <<-EOF hi one bye hi one bye hi one bye EOF end specify "#visual mode 'f'" do before <<-EOF hi (hello world jan) bye hi (hello world feb) bye hi (hello world mar) bye EOF type 'fwf)cone' after <<-EOF hi (hello one bye hi (hello one bye hi (hello one bye EOF end specify "#visual mode 'F'" do before <<-EOF hi (hello world jan) bye hi (hello world feb) bye hi (hello world mar) bye EOF type 'fwF(cbefore' after <<-EOF hi beforeorld jan) bye hi beforeorld feb) bye hi beforeorld mar) bye EOF end specify "#visual mode 't'" do before <<-EOF hello.jan hello hi.feb hello hi bye.mar EOF type 't.cone' after <<-EOF one.jan one.feb one.mar EOF end specify "#visual mode 'T'" do before <<-EOF jan.world feb.hi world mar.bye hi world EOF type 'fwT.cbefore' after <<-EOF jan.beforeorld feb.beforeorld mar.beforeorld EOF end specify "#visual line mode 'f'" do before <<-EOF hello jan world hello feb world hello mar world EOF type 'VfwvAafter' after <<-EOF hello jan wafterorld hello feb wafterorld hello mar wafterorld EOF end specify "#visual mode 'I'" do before <<-EOF hello world jan hello world feb hello world mar EOF type 'wIbefore' after <<-EOF hello beforeworld jan hello beforeworld feb hello beforeworld mar EOF end specify "#visual mode 'A'" do before <<-EOF hello world jan hello world feb hello world mar EOF type 'wAafter' after <<-EOF hello worldafter jan hello worldafter feb hello worldafter mar EOF end specify "#resize regions visual mode 'I'" do before <<-EOF hello world jan hello world feb hello world mar EOF type 'whhhIbefore' after <<-EOF hello beforeworld jan hello beforeworld feb hello beforeworld mar EOF end specify "#resize regions visual mode 'A'" do before <<-EOF hello world jan hello world feb hello world mar EOF type 'whhhAbefore' after <<-EOF hello wobeforerld jan hello wobeforerld feb hello wobeforerld mar EOF end specify "#no word boundries visual mode 'I'" do before <<-EOF hello hibye world hello hibye world hello hibye world EOF vim.normal ':MultipleCursorsFind bye' type 'Ibefore' after <<-EOF hello hibeforebye world hello hibeforebye world hello hibeforebye world EOF end specify "#variable-length regions visual mode 'I'" do before <<-EOF hello hii world hello hiiii world hello hiiiiii world EOF vim.normal ':MultipleCursorsFind \' type 'Ibefore' after <<-EOF hello beforehii world hello beforehiiii world hello beforehiiiiii world EOF end specify "#normal mode 'I'" do before <<-EOF hello hello EOF type 'vIworld ' after <<-EOF world hello world hello EOF end specify "#normal mode 'A'" do before <<-EOF hello hello EOF type 'vA world' after <<-EOF hello world hello world EOF end specify "#undo" do before <<-EOF hello hello EOF type 'cworldu' after <<-EOF hello hello EOF end specify "#multiline visual mode" do before <<-EOF hello hello EOF type 'VjA world' after <<-EOF hello world hello world EOF end specify "#set paste mode" do before <<-EOF hello hello EOF type ':set pastecworld:set nopaste' after <<-EOF world world EOF end end