使用 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
\<
匹配单词的开头
.
匹配单词的第一个字符
\u
告诉 Vim 将替换字符串中的以下字符大写 (&)
&
表示替换左侧匹配的任何内容
g
表示替换所有匹配项,而不仅仅是第一个
【讨论】:
我只需要这样做并使用了一个我过度重复的宏,我知道必须有一些更好的方法,但我从来没有想过正则表达式。这很棒。谢谢。 在整个文件中执行%s/\<./\u&/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
【讨论】:
我喜欢使用&
的答案,但如果您的字符串以混合大小写开头或全部以大写开头,则它不起作用。以上是关于使用 Vim 将所选内容中每个单词的首字母大写的主要内容,如果未能解决你的问题,请参考以下文章