在Vim中更改标题大小写(所有单词的首字母大写)

a0zr77ik  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(136)

有很多解决方案可以改变整个单词的大小写,但我想要的是以这样的方式改变大小写:
从“生命的意义是什么?一个新的建议”我想:“生命的意义是什么?一个新的建议”,如果这是太难了:“生命的意义是什么?“一个新的建议”就足够了。

l3zydbqr

l3zydbqr1#

这通常被称为 * 标题情况 *; Vim Tips Wiki提供了一个可视化模式Map解决方案

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 plugin可以帮助设置x{motion}xx{Visual}xMap,所以你只需要编写实际的转换函数。

编辑:啊,好吧,不能阻止我自己,这里是一个能够处理异常的实现:

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')

这里有一个变体,它循环通过Title Case with exceptions → Title Case all(without exceptions)→ Title Case:

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
nlejzf6q

nlejzf6q2#

有几种方法可以使每个单词大写。
:s/\w\+/\u\0/g出现在:substitute示例中。在:help s/\\\\的文档之后可以查看此内容
一种效率较低但更直观的方法是使用gUl,将光标放在第一个单词的第一个字母上。然后对所有剩余的单词重复w.

相关问题