diff --git a/autoload/SpaceVim/api/data/string.vim b/autoload/SpaceVim/api/data/string.vim index 9ce026976..6ac7c3c55 100644 --- a/autoload/SpaceVim/api/data/string.vim +++ b/autoload/SpaceVim/api/data/string.vim @@ -49,6 +49,20 @@ function! s:self.fill(str, length, ...) abort return l:string . l:spaces endfunction +function! s:self.toggle_case(str) abort + let chars = [] + for char in self.string2chars(a:str) + if char2nr(char) >= 97 && char2nr(char) <= 122 + call add(chars, nr2char(char2nr(char) - 32)) + elseif char2nr(char) >= 65 && char2nr(char) <= 90 + call add(chars, nr2char(char2nr(char) + 32)) + else + call add(chars, char) + endif + endfor + return join(chars, '') +endfunction + function! s:self.fill_left(str, length, ...) abort if strwidth(a:str) <= a:length let l:string = a:str diff --git a/autoload/SpaceVim/plugins/iedit.vim b/autoload/SpaceVim/plugins/iedit.vim index ca1c04050..e14456969 100644 --- a/autoload/SpaceVim/plugins/iedit.vim +++ b/autoload/SpaceVim/plugins/iedit.vim @@ -221,6 +221,11 @@ function! s:handle_normal(char) abort let s:cursor_stack[i].end = '' endfor call s:replace_symbol() + elseif a:char == 126 " ~ + for i in range(len(s:cursor_stack)) + let s:cursor_stack[i].cursor = s:STRING.toggle_case(s:cursor_stack[i].cursor) + endfor + call s:replace_symbol() elseif a:char == 115 " s let s:mode = 'i' let w:spacevim_iedit_mode = s:mode diff --git a/test/api/data/string.vader b/test/api/data/string.vader index 117edb407..d691f64af 100644 --- a/test/api/data/string.vader +++ b/test/api/data/string.vader @@ -40,4 +40,6 @@ Execute ( SpaceVim api: data#string ): AssertEqual str.strAllIndex('hello spacevim hello', 'he.*', 1), [[0, 20]] AssertEqual str.strAllIndex('hello spacevim hello', 'he[^ ]*', 1), [[0, 5], [15, 20]] AssertEqual str.strAllIndex('let s:cursor_stack[i].end = s:cursor_stack[i].cursor . s:cursor_stack[i].end', 's.cursor[^_]*', 1), [[4, 12], [28, 36], [55, 63]] + Log 'test toggle_case()' + AssertEqual str.toggle_case(' A b 123'), ' a B 123' unlet str