Switching case of characters
From Vim Tips Wiki
You can change the case of text:
- Toggle case "
HellO" to "hELLo" withg~then a movement. - Uppercase "
HellO" to "HELLO" withgUthen a movement. - Lowercase "
HellO" to "hello" withguthen a movement.
Alternatively, you can visually select text then press ~ to toggle case, or U to convert to uppercase, or u to convert to lowercase.
Contents |
[edit] Examples
-
~ - Toggle case of the character under the cursor, or all visually-selected characters.
-
3~ - Toggle case of the next three characters.
-
g~3w - Toggle case of the next three words.
-
g~iw - Toggle case of the current word (inner word – cursor anywhere in word).
-
g~$ - Toggle case of all characters to end of line.
-
g~~ - Toggle case of the current line (same as
V~).
The above uses ~ to toggle case. In each example, you can replace ~ with u to convert to lowercase, or with U to convert to uppercase. For example:
-
U - Uppercase the visually-selected text.
- First press
vorVthen move to select text. - If you don't select text, pressing
Uwill undo all changes to the current line.
-
gUU - Change the current line to uppercase (same as
VU).
-
gUiw - Change current word to uppercase.
-
u - Lowercase the visually-selected text.
- If you don't select text, pressing
uwill undo the last change.
-
guu - Change the current line to lowercase (same as
Vu).
[edit] Title case
The :s substitute command can change case (see :help s/\u).
The following converts the current line to Title Case (all lowercase, except for initial uppercase letters):
:s/\<\(\w\)\(\w*\)\>/\u\1\L\2/g
Explanation The search pattern is \<\(\w\)\(\w*\)\> which searches for \< (beginning of word), then \w (a word character), then \w* (zero or more word characters), then \> (end of word). The \(...\) create subexpressions to be recalled with \1 and \2 in the replacement. The replacement is \u\1\L\2 which substitutes the two subexpressions transformed: The \u converts the first character of what follows to uppercase, while \L converts all of what follows to lowercase.
[edit] Twiddle case
With the following (for example, in vimrc), you can visually select text then press ~ to convert the text to UPPER CASE, then to lower case, then to Title Case. Keep pressing ~ until you get the case you want.
function! TwiddleCase(str)
if a:str ==# toupper(a:str)
let result = tolower(a:str)
elseif a:str ==# tolower(a:str)
let result = substitute(a:str,'\(\<\w\+\>\)', '\u\1', 'g')
else
let result = toupper(a:str)
endif
return result
endfunction
vnoremap ~ ygv"=TwiddleCase(@")<CR>Pgv
[edit] References
[edit] Comments
The following will skip single-letter words and words that aren't in uppercase. It also accounts for non-english latin characters.
:s/\v\C<([A-ZÀ-Ý])([A-ZÀ-Ý]+)>/\u\1\L\2/g
--Jenny 165.2.186.10 19:05, April 5, 2012 (UTC)
- Nice, thanks. I added
\Cto your command above to make the search case sensitive (it won't skip lowercase words if'ignorecase'is set, unless\Cis present). JohnBeckett 09:58, April 6, 2012 (UTC)