可以在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
如何改进此功能以在视觉模块模式下正常工作?
答案 0 :(得分:3)
问题是使用表达式寄存器("=
)会强制执行字符操作。
要解决此问题,请操纵默认寄存器(无论如何都包含原始的取消文本),并通过getregtype()
保留原始寄存器类型:
vnoremap ~ y:call setreg('', TwiddleCase(@"), getregtype(''))<CR>gv""Pgv