次のスニペットは、vim wikiにあります。
function! TwiddleCase(str)
if a:str ==# toupper(a:str)
let result = tolower(a:str)
elseif a:str ==# tolower(a:str)
let result = substitute(a:str,'\(\<\w\+\>\)', '\u\1', 'g')
else
let result = toupper(a:str)
endif
return result
endfunction
vnoremap ~ ygv"=TwiddleCase(@")<CR>Pgv
ただし、これはビジュアル ブロック モードでは失敗します。次の入力があるとします。
foo alpha
bar beta
カーソルを の上に置いてf
をfoo
押す
ctrl-v je~と、次の結果が得られます。
Foo
Bar alpha
beta
予想の代わりに
Foo alpha
Bar beta
ビジュアル ブロック モードで適切に動作するように、この機能をどのように改善できますか?