改进TwiddleCase功能以在可视块模式下工作

时间:2013-05-24 13:37:14

标签: vim

可以在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的{​​{1}}上并按下 ctrl -v j e 产生以下结果。

foo

而不是预期的

Foo
Bar alpha
 beta

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

1 个答案:

答案 0 :(得分:3)

问题是使用表达式寄存器"=)会强制执行字符操作。

要解决此问题,请操纵默认寄存器(无论如何都包含原始的取消文本),并通过getregtype()保留原始寄存器类型:

vnoremap ~ y:call setreg('', TwiddleCase(@"), getregtype(''))<CR>gv""Pgv