Capitalize first letter of each word in a selection using Vim
Solution 1
You can use the following substitution:
s/\<./\u&/g
-
\<
matches the start of a word -
.
matches the first character of a word -
\u
tells Vim to uppercase the following character in the substitution string(&)
-
&
means substitute whatever was matched on the left-hand side -
g
means substitute all matches, not only the first
Solution 2
:help case
says:
To turn one line into title caps, make every first letter of a word
uppercase:
: s/\v<(.)(\w*)/\u\1\L\2/g
Explanation:
: # 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.
The pattern portion has this meaning:
\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_].
The result or replacement portion has this meaning:
\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
Result:
ROPER STATE PARK
Roper State Park
An alternate to the very magic mode:
: % s/\<\(.\)\(\w*\)/\u\1\L\2/g
# Each capture group requires a backslash to enable their meta
# character meaning i.e. "\(\)" versus "()".
Solution 3
The Vim Tips Wiki has a TwiddleCase mapping that toggles the visual selection to lower case, UPPER CASE, and Title Case.
If you add the TwiddleCase
function to your .vimrc
, then you just visually select the desired text and press the tilde character ~
to cycle through each case.
Solution 4
Option 1. -- This mapping maps the key q
to capitalize the letter at the cursor position, and then it moves to the start of the next word:
:map q gUlw
To use this, put the cursor at the start of the line and hit q
once for each word to capitalize the first letter. If you want to leave the first letter the way it is, hit w
instead to move to the next word.
Option 2. -- This mappings maps the key q
to invert the case of the letter at the cursor position, and then it moves to the start of the next word:
:map q ~w
To use this, put the cursor at the start of the line hit q
once for each word to invert the case of the first letter. If you want to leave the first letter the way it is, hit w
instead to move to the next word.
Unmap mapping. -- To unmap (delete) the mapping assigned to the q
key:
:unmap q
Solution 5
Try This regex ..
s/ \w/ \u&/g
keelar
I mainly code in C++ and Java, love data structure and algorithms. Recently getting familiar with open-source projects related to databases such as hadoop, Hama, Cassandra, and RocksDB.
Updated on August 05, 2021Comments
-
keelar over 2 years
In Vim, I know we can use
~
to capitalize a single char (as mentioned in this question), but is there a way to capitalize the first letter of each word in a selection using Vim?For example, if I would like to change this
hello world from stack overflow
to
Hello World From Stack Overflow
how should I do it in Vim?
-
Greg over 9 yearsThis was the most interesting answer to me. I'd never seen the very magic mode. I thought I'd document the answer after I understood the answer.
-
Greg over 9 yearsI liked the answer with the use of the
&
but it does not work if your string string is mixed case to begin with or all uppercase to begin with. -
Greg over 9 yearsAdditionally, this answer handles all lower case, all upper case, or mixed case strings.
-
Isaac Nequittepas about 8 yearsI just had to do this and used a macro that I over-repeated and I knew there had to be some better way but I never though of regex. This is great. Thanks.
-
Joshua Pinter about 7 yearsThanks. Smart Title Case works well for Sublime Text as well. github.com/mattstevens/sublime-titlecase
-
Gabriel Borges Oliveira almost 5 yearsto do it in entire file
%s/\<./\u&/g
-
D. Ben Knoble almost 4 yearsWhy a mapping and not an actual macro?
qq~wq
and replay with@q
followed by@@
?