Escriba en mayúscula la primera letra de cada palabra en una selección usando vim

83

En vim, sé que podemos usar ~para poner en mayúscula un solo carácter (como se menciona en esta pregunta ), pero ¿hay alguna manera de poner en mayúscula la primera letra de cada palabra en una selección usando vim?

Por ejemplo, si quisiera cambiar de

hello world from stackoverflow

a

Hello World From Stackoverflow

¿Cómo debo hacerlo en vim?

Keelar
fuente
1
También se puede hacer con sed
jpaugh

Respuestas:

173

Puede utilizar la siguiente sustitución:

s/\<./\u&/g
  • \< coincide con el comienzo de una palabra
  • . coincide con el primer carácter de una palabra
  • \u le dice a Vim que ponga en mayúsculas el siguiente carácter en la cadena de sustitución (&)
  • & significa sustituir lo que se haya emparejado en el LHS
Rohit Jain
fuente
4
¡Muchas gracias, especialmente por explicar cada detalle!
keelar
Solo tenía que hacer esto y usé una macro que repetí en exceso y sabía que tenía que haber una forma mejor, pero nunca pensé en expresiones regulares. Esto es genial. Gracias.
Isaac Nequittepas
4
para hacerlo en archivo completo%s/\<./\u&/g
Gabriel Borges Oliveira
51

: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 parte del 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 parte 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  

Una alternativa al modo 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 "()".
Ernix
fuente
3
Esta fue la respuesta más interesante para mí. Nunca había visto el modo muy mágico. Pensé que documentaría la respuesta después de entenderla.
Greg
Además, esta respuesta maneja todas las cadenas en minúsculas, mayúsculas o mayúsculas.
Greg
esta respuesta es el MVP
New Alexandria
12

Vim Tips Wiki tiene un mapeo TwiddleCase que cambia la selección visual a minúsculas, MAYÚSCULAS y mayúsculas.

Si agrega la TwiddleCasefunción a su .vimrc, simplemente seleccione visualmente el texto deseado y presione el carácter de tilde ~para recorrer cada caso.

Ingo Karkat
fuente
2

Prueba esta expresión regular ...

s/ \w/ \u&/g
Krishna
fuente
Me gustó la respuesta con el uso de, &pero no funciona si su cadena de cadena es una combinación de mayúsculas para comenzar o todas en mayúsculas para comenzar.
Greg
2

Opción 1. - Este mapeo mapea la teclaqpara poner en mayúscula la letra en la posición del cursor, y luego se mueve al comienzo de la siguiente palabra:

: mapa q gUlw

Para usar esto, coloque el cursor al principio de la línea y presione quna vez para cada palabra para poner en mayúscula la primera letra. Si desea dejar la primera letra como está, presione en su wlugar para pasar a la siguiente palabra.

Opción 2. - Esta asignación asigna la claveqpara invertir el caso de la letra en la posición del cursor, y luego se mueve al comienzo de la siguiente palabra:

:map q ~w

Para usar esto, coloque el cursor al comienzo de la línea y presione quna vez por cada palabra para invertir el caso de la primera letra. Si desea dejar la primera letra como está, presione en su wlugar para pasar a la siguiente palabra.

Desmapear mapeo. - Para desasignar (eliminar) el mapeo asignado a laqtecla:

:unmap q
Miguel
fuente
¿Por qué un mapeo y no una macro real? qq~wqy reproducir @qseguido de @@?
D. Ben Knoble
0

Para restringir la modificación a la selección visual tenemos que usar algo como:

:'<,'>s/\%V\<.\%V/\u&/g

\%V ............... see help for this
Sergio Araujo
fuente