mirror of
1
0
Fork 0
ultimate-vim/sources_non_forked/vim-multiple-cursors/spec/multiple_cursors_spec.rb

727 lines
12 KiB
Ruby

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 'yiwj<C-n><C-n><C-n>vwwp<Esc>'
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 '<C-n><C-n><C-n>vwcaw<Esc>bP<Esc>'
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 '<C-n><C-n><C-n>vwCABC <Esc>p<Esc>'
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 '<C-n><C-n><C-n>vwdawbP<Esc>'
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 '<C-n><C-n><C-n>vwwhDbhP<Esc>'
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 '<C-n><C-n><C-n>vws1<Esc>p<Esc>'
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 '<C-n><C-n>vdx<Esc>'
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 'fw<C-n><C-n>fx<Esc>'
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 '<C-v>jj<C-n>xp<Esc>'
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 '<C-n><C-n><C-n>vwvelywhp<Esc>'
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 'wywb<C-n><C-n><C-n>p<Esc>'
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 '<C-n><C-n><C-n>vwvely^P<Esc>'
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 '<C-n><C-n><C-n>vwvY^P<Esc>'
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 '<C-n><C-n><C-n>cworld<Esc>'
after <<-EOF
world
world
world
EOF
end
specify "#single line replacement" do
before <<-EOF
hello hello hello
EOF
type '<C-n><C-n><C-n>cworld<Esc>'
after <<-EOF
world world world
EOF
end
specify "#mixed line replacement" do
before <<-EOF
hello hello
hello
EOF
type '<C-n><C-n><C-n>cworld<Esc>'
after <<-EOF
world world
world
EOF
end
specify "#new line in insert mode" do
before <<-EOF
hello
hello
EOF
type '<C-n><C-n>chello<CR>world<Esc>'
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 '<C-n><C-n>vlxi<cr><Esc>'
after <<-EOF
hello
world
hello
world
EOF
end
specify "#normal mode 'o'" do
before <<-EOF
hello
hello
EOF
type '<C-n><C-n>voworld<Esc>'
after <<-EOF
hello
world
hello
world
EOF
end
specify "#normal mode 'O'" do
before <<-EOF
hello
hello
EOF
type '<C-n><C-n>vOworld<Esc>'
after <<-EOF
world
hello
world
hello
EOF
end
specify "#find command basic" do
before <<-EOF
hello
hello
EOF
vim.normal ':MultipleCursorsFind hello<CR>'
type 'cworld<Esc>'
after <<-EOF
world
world
EOF
end
specify "#visual line mode replacement" do
before <<-EOF
hello world
hello world
EOF
type '<C-n><C-n>Vchi!<Esc>'
after <<-EOF
hi!
hi!
EOF
end
specify "#skip key" do
before <<-EOF
hello
hello
hello
EOF
type '<C-n><C-n><C-x>cworld<Esc>'
after <<-EOF
world
hello
world
EOF
end
specify "#prev key" do
before <<-EOF
hello
hello
hello
EOF
type '<C-n><C-n><C-n><C-p>cworld<Esc>'
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 'fw<C-n><C-n><C-n>ibcone<Esc>'
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 'fw<C-n><C-n><C-n>abcone<Esc>'
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 'fw<C-n><C-n><C-n>f)cone<Esc>'
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 'fw<C-n><C-n><C-n>F(cbefore<Esc>'
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 '<C-n><C-n><C-n>t.cone<Esc>'
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 'fw<C-n><C-n><C-n>T.cbefore<Esc>'
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 '<C-n><C-n><C-n>VfwvAafter<Esc>'
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 'w<C-n><C-n><C-n>Ibefore<Esc>'
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 'w<C-n><C-n><C-n>Aafter<Esc>'
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 'w<C-n><C-n><C-n>hhhIbefore<Esc>'
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 'w<C-n><C-n><C-n>hhhAbefore<Esc>'
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<CR>'
type 'Ibefore<Esc>'
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 \<hi*\><CR>'
type 'Ibefore<Esc>'
after <<-EOF
hello beforehii world
hello beforehiiii world
hello beforehiiiiii world
EOF
end
specify "#normal mode 'I'" do
before <<-EOF
hello
hello
EOF
type '<C-n><C-n>vIworld <Esc>'
after <<-EOF
world hello
world hello
EOF
end
specify "#normal mode 'A'" do
before <<-EOF
hello
hello
EOF
type '<C-n><C-n>vA world<Esc>'
after <<-EOF
hello world
hello world
EOF
end
specify "#undo" do
before <<-EOF
hello
hello
EOF
type '<C-n><C-n>cworld<Esc>u'
after <<-EOF
hello
hello
EOF
end
specify "#multiline visual mode" do
before <<-EOF
hello
hello
EOF
type 'Vj<C-n>A world<Esc>'
after <<-EOF
hello world
hello world
EOF
end
specify "#set paste mode" do
before <<-EOF
hello
hello
EOF
type ':set paste<CR><C-n><C-n>cworld<Esc>:set nopaste<CR>'
after <<-EOF
world
world
EOF
end
end