有很多解决方案可以更改整个单词的大小写,但我想要的是以如下方式更改大小写:
从“生命的意义是什么?一个新的建议”我想要:“生命的意义是什么?一个新的建议”如果这太难了,这个:“生命的意义是什么?一个新的建议”就足够了.
这通常称为 title case; Vim Tips 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 ~ y:call setreg('', TwiddleCase(@"), getregtype(''))<CR>gv""Pgvl
如果您想自己实现更强大的解决方案,我的 TextTransform 插件 可以帮助设置
x{motion}
、xx
和 {Visual}x
映射,因此您只需编写实际的转换函数即可。
编辑:啊好吧,我无法阻止自己,这是一个能够处理异常的实现:
if ! exists('g:TitleCase_ExceptionPattern')
" Source:
" http://grammar.yourdictionary.com/capitalization/rules-for-capitalization-in-titles.html
let g:TitleCase_ExceptionPattern = '^\%(amid\|a[nst]\?\|and\|are\|but\|by\|down\|for\|from\|i[ns]\|into\|like\|near\|new\|nor\|old\|o[fnr]\|off\|onto\|over\|past\|per\|plus\|than\|the\|to\|up\|upon\|via\|with\)$'
endif
function! TitleCase( text )
return substitute(a:text, '\(^\<\w\+\>\)\|\<\w\+\>', '\=s:TitleCase(submatch(0), ! empty(submatch(1)))', 'g')
endfunction
function! s:TitleCase( word, isException )
if ! a:isException && a:word =~# g:TitleCase_ExceptionPattern
return tolower(a:word)
endif
return substitute(a:word, '\w', '\u&', '')
endfunction
call TextTransform#MakeMappings('', '<Leader>s~', 'TitleCase')
这里有一个变体,它循环使用标题大小写(有例外)→ 标题大小写全部(无例外)→ 小写:
function! subs#TitleCase#Do( text )
let l:wordExpr = '\(^\<\w\+\>\|\<\w\+\>$\)\|\<\w\+\>'
let l:text = substitute(a:text, l:wordExpr, '\=s:TitleCase(submatch(0), ! empty(submatch(1)))', 'g')
if l:text ==# a:text
let l:text = substitute(a:text, l:wordExpr, '\=s:TitleCase(submatch(0), 1)', 'g')
if l:text ==# a:text
let l:text = substitute(a:text, l:wordExpr, '\L&', 'g')
endif
endif
return l:text
endfunction
有几种方法可以将每个单词大写。
:s/\w\+/\u\0/g
出现在 :substitute
示例中。这可以在 :help s/\\\\
的文档之后查看
一种效率较低但更直观的方法是使用
gUl
将光标放在第一个单词的第一个字母上。然后对所有剩余单词重复 w.
。