使用vim将选择中的每个单词的首字母大写


80

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

例如,如果我想从

hello world from stackoverflow

Hello World From Stackoverflow

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


1
也可以使用sed
jpaugh

Answers:


172

您可以使用以下替换:

s/\<./\u&/g
  • \< 匹配单词的开头
  • . 匹配单词的第一个字符
  • \u 告诉Vim大写替换字符串中的以下字符 (&)
  • & 表示替代LHS上匹配的任何内容

4
非常感谢您,特别是为您解释每个细节!
keelar

我只需要这样做,并使用一个我反复重复的宏,我知道必须有一些更好的方法,但是我从未使用过正则表达式。这很棒。谢谢。
艾萨克·尼基特帕斯

4
在整个文件中执行此操作%s/\<./\u&/g
Gabriel Borges Oliveira,

50

: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 caracters. \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. "\(\)" verses "()".

3
这是我最有趣的答案。我从未见过非常神奇的模式。我以为我在理解答案后就记录了答案。
格雷格

此外,此答案可处理所有小写,所有大写或大小写混合的字符串。
格雷格

这个答案是MVP
新亚历山大

12

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

如果将TwiddleCase功能添加到.vimrc,则只需在视觉上选择所需的文本并按波浪号字符~即可循环显示每种情况。


2

试试这个正则表达式..

s/ \w/ \u&/g

我喜欢使用的答案,&但如果您的字符串以大写字母开头或全部以大写字母开头,则此方法不起作用。
格雷格

2

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

:map q gUlw

要使用此功能,请将光标放在行的开头,然后q为每个单词按一次以大写第一个字母。如果您希望第一个字母保持原样,请点击w以移至下一个单词。

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

:map q ~w

要使用此功能,请将光标放在命中行的开头,q每个单词一次以反转第一个字母的大小写。如果您希望第一个字母保持原样,请点击w以移至下一个单词。

取消映射。-要取消映射(删除)分配给q键的映射,请执行以下操作:

:unmap q

为什么要映射而不是实际的宏?qq~wq并重播@q后跟@@
D. Ben Knoble

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.