1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-02 22:40:06 +08:00

test(iedit): add test for iedit

This commit is contained in:
Wang Shidong 2022-02-03 23:08:04 +08:00 committed by GitHub
parent 9685aa13d4
commit fcd0d28a67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 91 additions and 49 deletions

View File

@ -4,10 +4,10 @@ test: build/vader | build
COVIMERAGE=$(shell command -v covimerage 2>/dev/null || echo build/covimerage/bin/covimerage) COVIMERAGE=$(shell command -v covimerage 2>/dev/null || echo build/covimerage/bin/covimerage)
test_coverage: $(COVIMERAGE) build/vader | build test_coverage: $(COVIMERAGE) build/vader | build
$(COVIMERAGE) run --source after --source autoload --source colors --source config --source ftplugin $(VIM_BIN) -Nu test/vimrc -c 'Vader! test/**' $(COVIMERAGE) run --source after --source syntax --source autoload --source colors --source config --source ftplugin $(VIM_BIN) -Nu test/vimrc -c 'Vader! test/**'
$(COVIMERAGE): $(COVIMERAGE):
$(COVIMERAGE) run --source after --source autoload --source colors --source config --source ftplugin $(VIM_BIN) -Nu test/vimrc -c 'Vader! test/**' $(COVIMERAGE) run --source after --source syntax --source autoload --source colors --source config --source ftplugin $(VIM_BIN) -Nu test/vimrc -c 'Vader! test/**'
build/covimerage: build/covimerage:
virtualenv $@ virtualenv $@

View File

@ -71,7 +71,7 @@ function! s:self.open() abort
let self._clear_cmdline = 1 let self._clear_cmdline = 1
endif endif
redraw redraw
let char = self._getchar() let char = self.__vim.getchar()
if char ==# "\<FocusLost>" || char ==# "\<FocusGained>" || char2nr(char) == 128 if char ==# "\<FocusLost>" || char ==# "\<FocusGained>" || char2nr(char) == 128
continue continue
endif endif
@ -105,13 +105,6 @@ function! s:self.open() abort
redraw redraw
endfunction endfunction
function! s:self._getchar(...) abort
let ret = call('getchar', a:000)
return (type(ret) == type(0) ? nr2char(ret) : ret)
endfunction
function! s:self.defind_keys(dict) abort function! s:self.defind_keys(dict) abort
let self._keys = a:dict let self._keys = a:dict
endfunction endfunction

View File

@ -114,8 +114,9 @@ endfunction
" use SPC s h to highlight current symbol on default range. " use SPC s h to highlight current symbol on default range.
" public API func: start Highlight mode {{{ " public API func: start Highlight mode {{{
function! SpaceVim#plugins#highlight#start(current) abort function! SpaceVim#plugins#highlight#start(...) abort
let curpos = getcurpos() " getcurpos is added in vim 7.4.313
let curpos = getpos('.')
let save_reg_k = @k let save_reg_k = @k
normal! viw"ky normal! viw"ky
let s:current_match = @k let s:current_match = @k

View File

@ -16,6 +16,7 @@ let s:Operator = ''
let s:VIMH = SpaceVim#api#import('vim#highlight') let s:VIMH = SpaceVim#api#import('vim#highlight')
let s:STRING = SpaceVim#api#import('data#string') let s:STRING = SpaceVim#api#import('data#string')
let s:CMP = SpaceVim#api#import('vim#compatible') let s:CMP = SpaceVim#api#import('vim#compatible')
let s:VIM = SpaceVim#api#import('vim')
let s:cursor_stack = [] let s:cursor_stack = []
@ -81,7 +82,7 @@ function! SpaceVim#plugins#iedit#start(...) abort
let w:spacevim_iedit_mode = s:mode let w:spacevim_iedit_mode = s:mode
let w:spacevim_statusline_mode = 'in' let w:spacevim_statusline_mode = 'in'
if empty(s:stack) if empty(s:stack)
let curpos = getcurpos() let curpos = getpos('.')
let argv = get(a:000, 0, '') let argv = get(a:000, 0, '')
let save_reg_k = @k let save_reg_k = @k
" the register " is cleared " the register " is cleared
@ -118,8 +119,8 @@ function! SpaceVim#plugins#iedit#start(...) abort
redrawstatus! redrawstatus!
while s:mode !=# '' while s:mode !=# ''
redraw! redraw!
let char = getchar() let char = s:VIM.getchar()
if s:mode ==# 'n' && char == 27 if s:mode ==# 'n' && char ==# "\<Esc>"
let s:mode = '' let s:mode = ''
else else
let symbol = s:handle(s:mode, char) let symbol = s:handle(s:mode, char)
@ -193,13 +194,13 @@ let s:toggle_stack = {}
" here is a list of normal command which can be handled by idedit " here is a list of normal command which can be handled by idedit
function! s:handle_normal(char) abort function! s:handle_normal(char) abort
silent! call s:remove_cursor_highlight() silent! call s:remove_cursor_highlight()
if a:char ==# 105 if a:char ==# 'i'
" i: switch to iedit insert mode " i: switch to iedit insert mode
let s:mode = 'i' let s:mode = 'i'
let w:spacevim_iedit_mode = s:mode let w:spacevim_iedit_mode = s:mode
let w:spacevim_statusline_mode = 'ii' let w:spacevim_statusline_mode = 'ii'
redrawstatus! redrawstatus!
elseif a:char == 73 elseif a:char ==# 'I'
" I: move surcor to the begin, and switch to iedit insert mode " I: move surcor to the begin, and switch to iedit insert mode
let s:mode = 'i' let s:mode = 'i'
let w:spacevim_iedit_mode = s:mode let w:spacevim_iedit_mode = s:mode
@ -219,7 +220,7 @@ function! s:handle_normal(char) abort
let s:cursor_stack[i].begin = '' let s:cursor_stack[i].begin = ''
endfor endfor
redrawstatus! redrawstatus!
elseif a:char == 9 " <tab> elseif a:char ==# "\<Tab>"
if index(keys(s:toggle_stack), s:index . '') == -1 if index(keys(s:toggle_stack), s:index . '') == -1
call extend(s:toggle_stack, {s:index : [s:stack[s:index], s:cursor_stack[s:index]]}) call extend(s:toggle_stack, {s:index : [s:stack[s:index], s:cursor_stack[s:index]]})
call remove(s:stack, s:index) call remove(s:stack, s:index)
@ -229,7 +230,7 @@ function! s:handle_normal(char) abort
call insert(s:cursor_stack, s:toggle_stack[s:index][1] , s:index) call insert(s:cursor_stack, s:toggle_stack[s:index][1] , s:index)
call remove(s:toggle_stack, s:index) call remove(s:toggle_stack, s:index)
endif endif
elseif a:char == 97 elseif a:char ==# 'a'
" a: goto iedit insert mode after cursor char " a: goto iedit insert mode after cursor char
let s:mode = 'i' let s:mode = 'i'
let w:spacevim_iedit_mode = s:mode let w:spacevim_iedit_mode = s:mode
@ -243,7 +244,7 @@ function! s:handle_normal(char) abort
\ '^.', '', 'g') \ '^.', '', 'g')
endfor endfor
redrawstatus! redrawstatus!
elseif a:char == 65 " A elseif a:char ==# 'A'
let s:mode = 'i' let s:mode = 'i'
let w:spacevim_iedit_mode = s:mode let w:spacevim_iedit_mode = s:mode
let w:spacevim_statusline_mode = 'ii' let w:spacevim_statusline_mode = 'ii'
@ -253,7 +254,7 @@ function! s:handle_normal(char) abort
let s:cursor_stack[i].end = '' let s:cursor_stack[i].end = ''
endfor endfor
redrawstatus! redrawstatus!
elseif a:char == 67 " C elseif a:char ==# 'C'
let s:mode = 'i' let s:mode = 'i'
let w:spacevim_iedit_mode = s:mode let w:spacevim_iedit_mode = s:mode
let w:spacevim_statusline_mode = 'ii' let w:spacevim_statusline_mode = 'ii'
@ -262,15 +263,15 @@ function! s:handle_normal(char) abort
let s:cursor_stack[i].end = '' let s:cursor_stack[i].end = ''
endfor endfor
call s:replace_symbol() call s:replace_symbol()
elseif a:char == 126 " ~ elseif a:char ==# '~'
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
let s:cursor_stack[i].cursor = s:STRING.toggle_case(s:cursor_stack[i].cursor) let s:cursor_stack[i].cursor = s:STRING.toggle_case(s:cursor_stack[i].cursor)
endfor endfor
call s:replace_symbol() call s:replace_symbol()
elseif a:char == 102 " f elseif a:char ==# 'f'
let s:Operator = 'f' let s:Operator = 'f'
call s:timeout() call s:timeout()
elseif a:char == 115 " s elseif a:char ==# 's'
let s:mode = 'i' let s:mode = 'i'
let w:spacevim_iedit_mode = s:mode let w:spacevim_iedit_mode = s:mode
let w:spacevim_statusline_mode = 'ii' let w:spacevim_statusline_mode = 'ii'
@ -280,18 +281,18 @@ function! s:handle_normal(char) abort
let s:cursor_stack[i].end = substitute(s:cursor_stack[i].end, '^.', '', 'g') let s:cursor_stack[i].end = substitute(s:cursor_stack[i].end, '^.', '', 'g')
endfor endfor
call s:replace_symbol() call s:replace_symbol()
elseif a:char == 120 " x elseif a:char ==# 'x'
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
let s:cursor_stack[i].cursor = matchstr(s:cursor_stack[i].end, '^.') let s:cursor_stack[i].cursor = matchstr(s:cursor_stack[i].end, '^.')
let s:cursor_stack[i].end = substitute(s:cursor_stack[i].end, '^.', '', 'g') let s:cursor_stack[i].end = substitute(s:cursor_stack[i].end, '^.', '', 'g')
endfor endfor
call s:replace_symbol() call s:replace_symbol()
elseif a:char == 88 " X elseif a:char ==# 'X'
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
let s:cursor_stack[i].begin = substitute(s:cursor_stack[i].begin, '.$', '', 'g') let s:cursor_stack[i].begin = substitute(s:cursor_stack[i].begin, '.$', '', 'g')
endfor endfor
call s:replace_symbol() call s:replace_symbol()
elseif a:char ==# "\<Left>" || a:char == 104 elseif a:char ==# "\<Left>" || a:char ==# 'h'
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
if !empty(s:cursor_stack[i].begin) if !empty(s:cursor_stack[i].begin)
let s:cursor_stack[i].end = s:cursor_stack[i].cursor . s:cursor_stack[i].end let s:cursor_stack[i].end = s:cursor_stack[i].cursor . s:cursor_stack[i].end
@ -299,41 +300,41 @@ function! s:handle_normal(char) abort
let s:cursor_stack[i].begin = substitute(s:cursor_stack[i].begin, '.$', '', 'g') let s:cursor_stack[i].begin = substitute(s:cursor_stack[i].begin, '.$', '', 'g')
endif endif
endfor endfor
elseif a:char ==# "\<Right>" || a:char == 108 elseif a:char ==# "\<Right>" || a:char ==# 'l'
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
let s:cursor_stack[i].begin = s:cursor_stack[i].begin . s:cursor_stack[i].cursor let s:cursor_stack[i].begin = s:cursor_stack[i].begin . s:cursor_stack[i].cursor
let s:cursor_stack[i].cursor = matchstr(s:cursor_stack[i].end, '^.') let s:cursor_stack[i].cursor = matchstr(s:cursor_stack[i].end, '^.')
let s:cursor_stack[i].end = substitute(s:cursor_stack[i].end, '^.', '', 'g') let s:cursor_stack[i].end = substitute(s:cursor_stack[i].end, '^.', '', 'g')
endfor endfor
elseif a:char == 48 || a:char ==# "\<Home>" " 0 or <Home> elseif a:char ==# '0' || a:char ==# "\<Home>" " 0 or <Home>
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
let old_cursor_char = s:cursor_stack[i].cursor let old_cursor_char = s:cursor_stack[i].cursor
let s:cursor_stack[i].cursor = matchstr(s:cursor_stack[i].begin . s:cursor_stack[i].cursor . s:cursor_stack[i].end, '^.') let s:cursor_stack[i].cursor = matchstr(s:cursor_stack[i].begin . s:cursor_stack[i].cursor . s:cursor_stack[i].end, '^.')
let s:cursor_stack[i].end = substitute(s:cursor_stack[i].begin . old_cursor_char . s:cursor_stack[i].end , '^.', '', 'g') let s:cursor_stack[i].end = substitute(s:cursor_stack[i].begin . old_cursor_char . s:cursor_stack[i].end , '^.', '', 'g')
let s:cursor_stack[i].begin = '' let s:cursor_stack[i].begin = ''
endfor endfor
elseif a:char == 36 || a:char ==# "\<End>" " $ or <End> elseif a:char ==# '$' || a:char ==# "\<End>" " $ or <End>
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
let old_cursor_char = s:cursor_stack[i].cursor let old_cursor_char = s:cursor_stack[i].cursor
let s:cursor_stack[i].cursor = matchstr(s:cursor_stack[i].begin . s:cursor_stack[i].cursor . s:cursor_stack[i].end, '.$') let s:cursor_stack[i].cursor = matchstr(s:cursor_stack[i].begin . s:cursor_stack[i].cursor . s:cursor_stack[i].end, '.$')
let s:cursor_stack[i].begin = substitute(s:cursor_stack[i].begin . old_cursor_char . s:cursor_stack[i].end , '.$', '', 'g') let s:cursor_stack[i].begin = substitute(s:cursor_stack[i].begin . old_cursor_char . s:cursor_stack[i].end , '.$', '', 'g')
let s:cursor_stack[i].end = '' let s:cursor_stack[i].end = ''
endfor endfor
elseif a:char == 68 " D elseif a:char ==# 'D'
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
let s:cursor_stack[i].begin = '' let s:cursor_stack[i].begin = ''
let s:cursor_stack[i].cursor = '' let s:cursor_stack[i].cursor = ''
let s:cursor_stack[i].end = '' let s:cursor_stack[i].end = ''
endfor endfor
call s:replace_symbol() call s:replace_symbol()
elseif a:char == 112 " p elseif a:char ==# 'p'
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
let s:cursor_stack[i].begin = @" let s:cursor_stack[i].begin = @"
let s:cursor_stack[i].cursor = '' let s:cursor_stack[i].cursor = ''
let s:cursor_stack[i].end = '' let s:cursor_stack[i].end = ''
endfor endfor
call s:replace_symbol() call s:replace_symbol()
elseif a:char == 83 " S elseif a:char ==# 'S'
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
let s:cursor_stack[i].begin = '' let s:cursor_stack[i].begin = ''
let s:cursor_stack[i].cursor = '' let s:cursor_stack[i].cursor = ''
@ -344,10 +345,10 @@ function! s:handle_normal(char) abort
let w:spacevim_statusline_mode = 'ii' let w:spacevim_statusline_mode = 'ii'
redrawstatus! redrawstatus!
call s:replace_symbol() call s:replace_symbol()
elseif a:char == 71 " G elseif a:char ==# 'G'
exe s:stack[-1][0] exe s:stack[-1][0]
let s:index = len(s:stack) - 1 let s:index = len(s:stack) - 1
elseif a:char == 103 "g elseif a:char ==# 'g'
if s:Operator ==# 'g' if s:Operator ==# 'g'
exe s:stack[0][0] exe s:stack[0][0]
let s:Operator = '' let s:Operator = ''
@ -356,7 +357,7 @@ function! s:handle_normal(char) abort
let s:Operator = 'g' let s:Operator = 'g'
call s:timeout() call s:timeout()
endif endif
elseif a:char == 110 " n elseif a:char ==# 'n'
if s:index == len(s:stack) - 1 if s:index == len(s:stack) - 1
let s:index = 0 let s:index = 0
else else
@ -364,7 +365,7 @@ function! s:handle_normal(char) abort
endif endif
call cursor(s:stack[s:index][0], call cursor(s:stack[s:index][0],
\ s:stack[s:index][1] + len(s:cursor_stack[s:index].begin)) \ s:stack[s:index][1] + len(s:cursor_stack[s:index].begin))
elseif a:char == 78 " N elseif a:char ==# 'N'
if s:index == 0 if s:index == 0
let s:index = len(s:stack) - 1 let s:index = len(s:stack) - 1
else else
@ -393,7 +394,7 @@ endfunction
function! s:handle_insert(char) abort function! s:handle_insert(char) abort
silent! call s:remove_cursor_highlight() silent! call s:remove_cursor_highlight()
let is_movement = 0 let is_movement = 0
if a:char ==# 27 || a:char ==# 7 if a:char ==# "\<Esc>" || a:char ==# "\<C-g>"
" Ctrl-g / <Esc>: switch to iedit normal mode " Ctrl-g / <Esc>: switch to iedit normal mode
let s:mode = 'n' let s:mode = 'n'
let w:spacevim_iedit_mode = s:mode let w:spacevim_iedit_mode = s:mode
@ -402,34 +403,34 @@ function! s:handle_insert(char) abort
redraw! redraw!
redrawstatus! redrawstatus!
return s:cursor_stack[0].begin . s:cursor_stack[0].cursor . s:cursor_stack[0].end return s:cursor_stack[0].begin . s:cursor_stack[0].cursor . s:cursor_stack[0].end
elseif a:char ==# 23 elseif a:char ==# "\<C-w>"
" ctrl-w: delete word before cursor " ctrl-w: delete word before cursor
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
let s:cursor_stack[i].begin = substitute(s:cursor_stack[i].begin, '\S*\s*$', '', 'g') let s:cursor_stack[i].begin = substitute(s:cursor_stack[i].begin, '\S*\s*$', '', 'g')
endfor endfor
elseif a:char ==# 21 elseif a:char ==# "\<C-u>"
" ctrl-u: delete all words before cursor " ctrl-u: delete all words before cursor
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
let s:cursor_stack[i].begin = '' let s:cursor_stack[i].begin = ''
endfor endfor
elseif a:char ==# 11 elseif a:char ==# "\<C-r>"
" Ctrl-k: delete all words after cursor " Ctrl-k: delete all words after cursor
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
let s:cursor_stack[i].cursor = '' let s:cursor_stack[i].cursor = ''
let s:cursor_stack[i].end = '' let s:cursor_stack[i].end = ''
endfor endfor
elseif a:char ==# "\<bs>" || a:char ==# 8 elseif a:char ==# "\<bs>" || a:char ==# "\<C-h>"
" BackSpace or Ctrl-h: delete char before cursor " BackSpace or Ctrl-h: delete char before cursor
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
let s:cursor_stack[i].begin = substitute(s:cursor_stack[i].begin, '.$', '', 'g') let s:cursor_stack[i].begin = substitute(s:cursor_stack[i].begin, '.$', '', 'g')
endfor endfor
elseif a:char ==# "\<Delete>" || a:char ==# 127 " <Delete> elseif a:char ==# "\<Delete>" || a:char ==# "\<C-?>" " <Delete>
" Delete: delete char after cursor " Delete: delete char after cursor
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
let s:cursor_stack[i].cursor = matchstr(s:cursor_stack[i].end, '^.') let s:cursor_stack[i].cursor = matchstr(s:cursor_stack[i].end, '^.')
let s:cursor_stack[i].end = substitute(s:cursor_stack[i].end, '^.', '', 'g') let s:cursor_stack[i].end = substitute(s:cursor_stack[i].end, '^.', '', 'g')
endfor endfor
elseif a:char ==# 2 || a:char ==# "\<Left>" elseif a:char ==# "\<C-b>" || a:char ==# "\<Left>"
" ctrl-b / <Left>: moves the cursor back one character " ctrl-b / <Left>: moves the cursor back one character
let is_movement = 1 let is_movement = 1
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
@ -439,7 +440,7 @@ function! s:handle_insert(char) abort
let s:cursor_stack[i].begin = substitute(s:cursor_stack[i].begin, '.$', '', 'g') let s:cursor_stack[i].begin = substitute(s:cursor_stack[i].begin, '.$', '', 'g')
endif endif
endfor endfor
elseif a:char ==# 6 || a:char ==# "\<Right>" elseif a:char ==# "\<C-f>" || a:char ==# "\<Right>"
" ctrl-f / <Right>: moves the cursor forward one character " ctrl-f / <Right>: moves the cursor forward one character
let is_movement = 1 let is_movement = 1
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
@ -449,10 +450,10 @@ function! s:handle_insert(char) abort
let s:cursor_stack[i].end = substitute(s:cursor_stack[i].end, let s:cursor_stack[i].end = substitute(s:cursor_stack[i].end,
\ '^.', '', 'g') \ '^.', '', 'g')
endfor endfor
elseif a:char == 18 " <C-r> elseif a:char ==# "\<C-r>"
let s:Operator = 'r' let s:Operator = 'r'
call s:timeout() call s:timeout()
elseif a:char == 1 || a:char ==# "\<Home>" elseif a:char ==# "\<C-a>" || a:char ==# "\<Home>"
" Ctrl-a or <Home> " Ctrl-a or <Home>
let is_movement = 1 let is_movement = 1
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
@ -469,7 +470,7 @@ function! s:handle_insert(char) abort
\ '^.', '', 'g') \ '^.', '', 'g')
let s:cursor_stack[i].begin = '' let s:cursor_stack[i].begin = ''
endfor endfor
elseif a:char == 5 || a:char ==# "\<End>" elseif a:char ==# "\<C-e>" || a:char ==# "\<End>"
" Ctrl-e or <End> " Ctrl-e or <End>
let is_movement = 1 let is_movement = 1
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
@ -488,7 +489,7 @@ function! s:handle_insert(char) abort
endfor endfor
else else
for i in range(len(s:cursor_stack)) for i in range(len(s:cursor_stack))
let s:cursor_stack[i].begin .= nr2char(a:char) let s:cursor_stack[i].begin .= a:char
endfor endfor
endif endif
if !is_movement if !is_movement

View File

@ -0,0 +1,20 @@
###################
# Typical comment #
###################
Given (fixture):
================
Hello Hello
Hello
Hello
Execute ( SpaceVim plugin: iedit ):
let g:_spacevim_input_list = ['e', 'D', 'a', 'W', 'o', 'r', 'l', 'd', "\<Esc>", "\<Esc>"]
call SpaceVim#plugins#highlight#start()
Expect (result):
~~~~~~~~~~~~~~~~
World World
World
World

19
test/plugin/iedit.vader Normal file
View File

@ -0,0 +1,19 @@
###################
# Typical comment #
###################
Given (fixture):
================
Hello Hello
Hello
Hello
Execute ( SpaceVim plugin: iedit ):
let g:_spacevim_input_list = ['D', 'a', 'W', 'o', 'r', 'l', 'd', "\<Esc>", "\<Esc>"]
call SpaceVim#plugins#iedit#start()
Expect (result):
~~~~~~~~~~~~~~~~
World World
World
World

4
test/plugin/runner.vader Normal file
View File

@ -0,0 +1,4 @@
Execute ( SpaceVim plugin: code runner ):
call SpaceVim#plugins#runner#open('echo 1')
tabclose

4
test/plugin/tasks.vader Normal file
View File

@ -0,0 +1,4 @@
Execute ( SpaceVim plugin: code runner ):
call SpaceVim#plugins#tasks#list()
exe "normal jjjj\<Cr>"