regex - tutorial - Poner en mayúscula la primera letra de cada palabra en una selección usando vim
vim linux (5)
En vim, sé que podemos usar ~
para poner en mayúscula un solo carácter (como se menciona en esta pregunta ), pero ¿hay alguna forma de poner en mayúscula la primera letra de cada palabra en una selección usando vim?
Por ejemplo, si me gustaría cambiar de
hello world from stackoverflow
a
Hello World From Stackoverflow
¿Cómo debería hacerlo en vim?
El Wiki de Vim Tips tiene un mapeo TwiddleCase que alterna la selección visual a minúsculas, MAYÚSCULAS y Title Case.
Si agrega la función TwiddleCase
a su .vimrc
, entonces simplemente selecciona visualmente el texto deseado y presiona el carácter tilde ~
para recorrer cada caso.
Prueba esta expresión regular ...
s/ /w/ /u&/g
Puede usar la siguiente sustitución:
s//<.//u&/g
-
/<
coincide con el comienzo de una palabra -
.
coincide con el primer personaje de una palabra -
/u
le dice a Vim que ponga en mayúscula el siguiente carácter en la cadena de sustitución(&)
-
&
significa substituir lo que fue emparejado en el LHS
También está el muy útil complemento vim-titlecase
para esto.
:help case
dice:
To turn one line into title caps, make every first letter of a word
uppercase: >
: s//v<(.)(/w*)//u/1/L/2/g
Explicación:
: # 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.
La porción de patrón tiene este significado.
/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_].
El resultado o la porción de reemplazo tiene este significado:
/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
Resultado:
ROPER STATE PARK
Roper State Park
Un modo alternativo al muy mágico:
: % s//</(./)/(/w*/)//u/1/L/2/g
# Each capture group requires a backslash to enable their meta
# character meaning i.e. "/(/)" verses "()".