2

次のスニペットは、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

カーソルを の上に置いてffoo押す ctrl-v je~と、次の結果が得られます。

Foo
Bar alpha
 beta

予想の代わりに

Foo alpha
Bar beta

ビジュアル ブロック モードで適切に動作するように、この機能をどのように改善できますか?

4

1 に答える 1

3

問題は、式レジスタ( ) を使用すると文字単位の操作"=が強制されることです。

これを修正するには、デフォルトのレジスタ (元のヤンクされたテキストを含む) を操作し、次の方法で元のレジスタ タイプを保持しgetregtype()ます。

vnoremap ~ y:call setreg('', TwiddleCase(@"), getregtype(''))<CR>gv""Pgv
于 2013-05-24T14:13:14.090 に答える