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
2条答案
按热度按时间l3zydbqr1#
这通常被称为 * 标题情况 *; Vim Tips Wiki提供了一个可视化模式Map解决方案
备选
如果你想自己实现一个更健壮的解决方案,我的TextTransform plugin可以帮助设置
x{motion}
、xx
和{Visual}x
Map,所以你只需要编写实际的转换函数。编辑:啊,好吧,不能阻止我自己,这里是一个能够处理异常的实现:
这里有一个变体,它循环通过Title Case with exceptions → Title Case all(without exceptions)→ Title Case:
nlejzf6q2#
有几种方法可以使每个单词大写。
:s/\w\+/\u\0/g
出现在:substitute
示例中。在:help s/\\\\
的文档之后可以查看此内容一种效率较低但更直观的方法是使用
gUl
,将光标放在第一个单词的第一个字母上。然后对所有剩余的单词重复w.
。