93

在 Vim 中,我知道我们可以使用~大写单个字符(如本问题所述),但是有没有办法使用 Vim 将选择中每个单词的首字母大写?

例如,如果我想改变这个

hello world from stack overflow

Hello World From Stack Overflow

我应该如何在 Vim 中做到这一点?

4

8 回答 8

199

您可以使用以下替换:

s/\<./\u&/g
  • \<匹配单词的开头
  • .匹配单词的第一个字符
  • \u告诉 Vim 将替换字符串中的以下字符大写(&)
  • &表示替换左侧匹配的任何内容
  • g表示替换所有匹配项,而不仅仅是第一个
于 2013-07-03T06:05:14.217 回答
60

: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 "()".
于 2013-07-03T06:08:15.653 回答
13

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

如果您将该TwiddleCase功能添加到您的.vimrc中,那么您只需直观地选择所需的文本并按波浪号字符~即可循环浏览每个案例。

于 2013-07-03T06:13:00.760 回答
2

试试这个正则表达式..

s/ \w/ \u&/g
于 2013-07-03T12:03:51.697 回答
2

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

:map q gUlw

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

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

:map q ~w

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

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

:unmap q
于 2020-05-08T22:01:57.527 回答
1

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

于 2016-01-13T20:07:06.610 回答
0

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

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

\%V ............... see help for this
于 2021-01-04T09:48:56.013 回答
0

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

vnoremap g~ "tc<C-r>=substitute(@t, '\v<(.)(\S*)', '\u\1\L\2', 'g')<CR><Esc>
于 2021-02-01T04:29:42.170 回答