# -*- encoding: utf-8 -*- 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 specify "#normal mode '0': goes to 1st char of line" do before <<-EOF hello jan world hello feb world hello mar world EOF type 'vw0dw' after <<-EOF jan world feb world mar world EOF end specify "#normal mode 'd0': deletes backward to 1st char of line" do before <<-EOF hello jan world hello feb world hello mar world EOF type 'vwd0' after <<-EOF jan world feb world mar world EOF end end describe "Multiple Cursors when using insert mapings" do let(:filename) { 'test.txt' } let(:options) { ['imap jj ', 'imap jojo dude'] } specify "#mapping doing " do before <<-EOF hello world! hello world! bla bla bla bla bla bla EOF type 'wcjjidude' after <<-EOF hello dude! hello ! bla bla bla bla bla bla EOF end specify "#mapping using more than 2 characters" do before <<-EOF hello hello bla bla bla bla bla bla EOF type 'A jojo' after <<-EOF hello dude hello dude bla bla bla bla bla bla 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 when changing the line count" do let(:filename) { 'test.txt' } let(:options) { ['set backspace=indent,eol,start'] } specify "#backspace on first char of the line, then carriage return" do before <<-EOF madec antoine andre joseph EOF type 'Gvipi' after <<-EOF madec antoine andre joseph EOF end specify "#del at EOL, then carriage return" do before <<-EOF madec antoine joseph andre EOF type 'vipA' after <<-EOF madec antoine joseph andre EOF end end describe "Multiple Cursors misc" do let(:filename) { 'test.txt' } let(:options) { ['set autoindent'] } 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 "#multiple new lines on one line in insert mode" do before <<-EOF 'a','b','c','d','e' EOF type 'f,vc' after <<-EOF 'a' 'b' 'c' 'd' 'e' EOF end specify "#multiple new lines on one line in insert mode with indents" do before <<-EOF 'a','b','c','d','e' EOF type '4if,vc:%s/^/^' after <<-EOF ^ 'a' ^ 'b' ^ 'c' ^ 'd' ^ 'e' 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 "#find command start-of-line" do before <<-EOF hello world hello world EOF vim.normal ':MultipleCursorsFind ^' type 'Ibegin' after <<-EOF beginhello beginworld begin beginhello beginworld EOF end specify "#find command end-of-line" do before <<-EOF hello world hello world EOF vim.normal ':MultipleCursorsFind $' type 'Iend' after <<-EOF helloend worldend end helloend worldend 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 specify "#multi-byte strings" do before <<-EOF こんにちわビム 世界の中心でビムを叫ぶ ビム大好き EOF type '/ビムcヴィム' after <<-EOF こんにちわヴィム 世界の中心でヴィムを叫ぶ ヴィム大好き EOF end end