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

将光标定位在fof 上foo并按下 ctrl-v je~会产生以下结果。

Foo
Bar alpha
 beta

而不是预期的

Foo alpha
Bar beta

如何改进此功能以在视觉块模式下正常工作?

4

1 回答 1

3

问题是使用表达式 register ( "=) 会强制进行字符操作。

要解决此问题,请操作默认寄存器(无论如何,它包含原始提取的文本),并通过以下方式保留原始寄存器类型getregtype()

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