使用 Vim 将所选内容中每个单词的首字母大写

Posted

技术标签:

【中文标题】使用 Vim 将所选内容中每个单词的首字母大写【英文标题】:Capitalize first letter of each word in a selection using Vim 【发布时间】:2013-06-30 17:02:49 【问题描述】:

在 Vim 中,我知道我们可以使用 ~ 将单个字符大写(如 this question 中所述),但是有没有办法?

例如,如果我想改变这个

hello world from stack overflow

Hello World From Stack Overflow

在 Vim 中我应该怎么做?

【问题讨论】:

也可以用sed完成 【参考方案1】:

:help case 说:

To turn one line into title caps, make every first letter of a word
uppercase:
    : s/\v<(.)(\w*)/\u\1\L\2/g

解释:

:                      # Enter ex command line mode.

space                  # The space after the colon means that there is no
                       # address range i.e. line,line or % for entire
                       # file.

s/pattern/result/g     # The overall search and replace command uses
                       # forward slashes.  The g means to apply the
                       # change to every thing on the line. If there
                       # g is missing, then change just the first match
                       # is changed.

模式部分的含义如下:

\v                     # Means to enter very magic mode.
<                      # Find the beginning of a word boundary.
(.)                    # The first () construct is a capture group.
                       # Inside the () a single ., dot, means match any
                       #  character.
(\w*)                  # The second () capture group contains \w*. This
                       # means find one or more word characters. \w* is
                       # shorthand for [a-zA-Z0-9_].

结果或替换部分的含义如下:

\u                     # Means to uppercase the following character.
\1                     # Each () capture group is assigned a number
                       # from 1 to 9. \1 or back slash one says use what
                       # I captured in the first capture group.
\L                     # Means to lowercase all the following characters.
\2                     # Use the second capture group

结果:

ROPER STATE PARK
Roper State Park

非常神奇的模式的替代方案:

: % s/\<\(.\)\(\w*\)/\u\1\L\2/g
# Each capture group requires a backslash to enable their meta
# character meaning i.e. "\(\)" versus "()".

【讨论】:

这是我最感兴趣的答案。我从未见过非常神奇的模式。我以为我会在理解答案后记录答案。 此外,此答案处理所有小写、所有大写或混合大小写字符串。【参考方案2】:

您可以使用以下替换:

s/\<./\u&/g
\&lt; 匹配单词的开头 . 匹配单词的第一个字符 \u 告诉 Vim 将替换字符串中的以下字符大写 (&amp;) &amp; 表示替换左侧匹配的任何内容 g 表示替换所有匹配项,而不仅仅是第一个

【讨论】:

我只需要这样做并使用了一个我过度重复的宏,我知道必须有一些更好的方法,但我从来没有想过正则表达式。这很棒。谢谢。 在整个文件中执行 %s/\&lt;./\u&amp;/g【参考方案3】:

以下映射导致 g~ 到“标题大小写”选定文本:

vnoremap g~ "tc<C-r>=substitute(@t, '\v<(.)(\S*)', '\u\1\L\2', 'g')<CR><Esc>

【讨论】:

【参考方案4】:

为了限制对视觉选择的修改,我们必须使用类似的东西:

:'<,'>s/\%V\<.\%V/\u&/g

\%V ............... see help for this

【讨论】:

【参考方案5】:

选项 1。-- 此映射将键 q 映射为大写光标位置的字母,然后移动到下一个单词的开头:

:map q gUlw

要使用此功能,请将光标放在行首并为每个单词点击一次q,以使第一个字母大写。如果您想按原样保留第一个字母,请点击w 转至下一个单词。

选项 2。-- 此映射映射键 q 以反转光标位置字母的大小写,然后移动到开头下一个词:

:map q ~w

要使用此功能,请将光标放在行首点击q 一次,以反转第一个字母的大小写。如果您想按原样保留第一个字母,请点击 w 以移至下一个单词。

取消映射。 -- 取消映射(删除)分配给q 键的映射:

:unmap q

【讨论】:

为什么是映射而不是实际的宏? qq~wq 重播@q 后跟@@ ?【参考方案6】:

还有一个非常有用的vim-titlecase 插件。

【讨论】:

谢谢。 Smart Title Case 也适用于 Sublime Text。 github.com/mattstevens/sublime-titlecase【参考方案7】:

Vim Tips Wiki 有一个TwiddleCase mapping,它将视觉选择切换为小写、大写和标题大小写。

如果您将TwiddleCase 函数添加到您的.vimrc,那么您只需直观地选择所需的文本,然后按波浪号~ 即可循环浏览每个案例。

【讨论】:

【参考方案8】:

试试这个正则表达式..

s/ \w/ \u&/g

【讨论】:

我喜欢使用&amp; 的答案,但如果您的字符串以混合大小写开头或全部以大写开头,则它不起作用。

以上是关于使用 Vim 将所选内容中每个单词的首字母大写的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JavaScript 将字符串中每个单词的首字母大写?

将每个单词的首字母大写而不改变当前的大写字母

如何在 Perl 中将字符串中每个单词的首字母大写?

使用流畅的语法将每个单词的首字母大写?

将一句英文中每个单词的首字母大写,其余字母小写。

C++ 每个单词的首字母必须大写