¿Cómo puedo convertir palabras a camelCase en una macro?


14

Tengo una lista de palabras, como esta:

these are
some
words that I want
to convert to
camel case

Necesito una manera de convertir, por ejemplo, camel caseen camelCasedentro de una macro (o una manera de convertir cada línea de una selección de línea visual en caso de camello).

Podría usar algo wgUlhxcomo tantas veces como sea necesario, pero el problema es que esto no funciona para palabras de diferentes longitudes (así, por ejemplo, wgUlhxwgUlhxfuncionaría para convert this pleasepero no para convert these pretty please).

El resultado deseado para las líneas anteriores sería

theseAre
some
wordsThatIWant
toConvertTo
camelCase

¿Hay alguna forma de automatizar esto?

Respuestas:


16

Un trazador de líneas

Encontré un reemplazo simple de expresión regular (suponiendo que se establezca 'magic'):

:s/ \([a-zA-Z]\)/\u\1/g

Esto coincide con cualquier letra después de un espacio, guardando la letra. Luego, lo reemplaza con la letra guardada en mayúscula ( \u= mayúscula, \1= primera coincidencia guardada), para cada coincidencia en la línea.

Aplicar sobre todo el archivo poniendo un %entre :y s.

La desventaja de esta solución es que es lineal (lo que funciona para sus ejemplos), pero se quedaría corto si solo quisiera decir algunas palabras de muchas dentro de una línea.

Una solución más completa

map <leader>g~ :set opfunc=MyCamelCase<CR>g@
function! MyCamelCase(type, ...)
  let searchsave=@/
    silent s/\%>'\[ \([a-zA-Z]\)\%<']/\u\1/g
  let @/=searchsave
 endfunction

Esto crea un nuevo operador que puede operar en un movimiento. Si tiene <leader>como \, entonces se le da el siguiente texto (con |el cursor):

This is some |example text to work with.

Escribir \g~3wda

This is some exampleTextTo work with.

Es decir, camello cased sobre 3 palabras.

Descripción de esa sustitución:

s/comienza la sustitución.
\%>'\[Es un poco doloroso. El \%>'mdice que coincida a la derecha de una marca. Queremos marcar [, pero eso también se debe escapar en este patrón. Entonces, esto comienza el partido después del movimiento dado al operador.
\([a-zA-Z\)es el mismo que el de una línea de arriba.
\%<']Este es el otro extremo, que coincide antes del final del movimiento.
/\u\1/ges el reemplazo de la línea de arriba.


En realidad, eso no es una macro, sino un trazador de líneas, pero podría asignarla a una combinación de teclas.
John O'M.

Se agregó una versión del operador para hacerlo. Funciona un poco mejor.
John O'M.

Creo que está bien si su respuesta no usa específicamente una macro; El autor de la pregunta presentó un problema XY , en mi opinión.
tommcdo

@tommcdo Sí, tienes razón; No tiene que ser una macro real. Solo necesita ser algún tipo de método automatizado.
Pomo de la puerta

12

Para una alternativa, uso el complemento vim- abolish que ofrece una función de coerción:

¿Quieres convertirte fooBaren foo_bar? Presione crs(coaccionar a snake_case). MixedCase ( crm), camelCase ( crc), snake_case ( crs) y UPPER_CASE ( cru) están a solo 3 teclas de distancia. Estos comandos son compatibles con repeat.vim .


2
+1 porque siempre hay un complemento de Tim Pope que no conocía.
zool

5

Puede crear una macro recursiva que haga esto para una sola línea con las siguientes teclas:

qqqqqf xgUl@qq

(Tenga en cuenta que el espacio entre el fy el xes un toque de la barra espaciadora, no una pausa)

En detalle:

  1. Limpia el registro q. Esto es necesario porque estamos creando una macro recursiva. (Ver paso 5):qqq

  2. Comience a grabar una macro en el registro q: qq

  3. No puede usar el wmovimiento aquí, porque desea que la macro se cancele cuando llegue al final de la línea, en lugar de saltar a la siguiente línea. En cambio, salte al siguiente carácter de espacio en la línea presionando la ftecla seguida de la barra espaciadora:f<space>

  4. Eliminar el espacio y en mayúscula la siguiente letra: xgUl

  5. Recurse Debido a que borramos el qregistro en el paso 1, todavía no hay nada en él, por lo que esto no hará nada:@q

  6. Guarda la macro: q

Luego puede aplicar esta macro a varias líneas utilizando un rango:

Aplique la macro a cada línea en el archivo:

:%normal @q

Aplique la macro a las líneas 2–5 inclusive:

:2,5normal @q

Haga una selección visual y luego escriba :normal @q. Esto rellenará previamente la línea de comando cuando presione la :tecla, lo que dará como resultado un comando que aplica la macro a cada línea de la selección:

:'<,'>normal @a

No es necesario borrar el qregistro, al qqigual que antes de que comience a grabar las pulsaciones de teclas. De hecho, es precisamente por eso que qqqfunciona para borrar el qregistro :)
tommcdo

Por supuesto, si estaba haciendo algo que requería agregarse al qregistro (es decir, usar qQ), probablemente sería necesario borrarlo primero.
tommcdo

2
@tommcdo Eso definitivamente no es cierto en mi copia de Vim. (Vim 7.3.87, invocado con vim -u NONE). Los contenidos existentes solo se borran cuando guarda el registro, en el paso 6. Por lo tanto, es necesario borrar el registro antes de comenzar si desea repetir.
Rico

@tommcdo He actualizado la respuesta para aclarar por qué es necesario este paso.
Rico

Mi error, de alguna manera salté el arma allí. Excelente aclaración!
tommcdo

1

Ver http://vim.wikia.com/wiki/Changing_case_with_regular_expressions ¡Explica los modificadores \ U, \ L, \ u, \ l de forma clara y concisa!

Su esencia es la siguiente:

Hay momentos en los que le gustaría revisar un archivo y cambiar el caso de los caracteres que coinciden con algunos criterios arbitrarios. Si comprende bien las expresiones regulares, puede hacerlo con bastante facilidad.

Es tan simple como colocar \ U o \ L delante de las referencias traseras de las que desea cambiar el caso, y \ E al final. Vim hará que el texto en referencia sea mayúscula o minúscula (respectivamente). Use \ u y \ l (sin la \ E al final) para cambiar el caso del primer carácter en la referencia.

(Una "referencia inversa" es una parte de una expresión regular que se refiere a una parte anterior de una expresión regular. Las referencias inversas más comunes son &, \ 1, \ 2, \ 3, ..., \ 9).

Algunos ejemplos que demuestran el poder de esta técnica:

Minúscula todo el archivo

:% s /.*/ \ L & / g

(& es una referencia útil que hace referencia al texto completo del partido).

Todas las palabras en mayúscula precedidas por un <(es decir, abrir nombres de etiquetas HTML):

:%s/<\(\w*\)/<\U\1/g

Tenga en cuenta también los comandos gu y gU.

Por ejemplo, ggguG minúscula todo el archivo. (gg = ir al principio, gu = minúscula, G = ir al EOF).

Mediante el uso de la referencia general general \ 0 en lugar de las de nombre (\ 1, \ 2, etc.) puede guardar algo de tipeo para reemplazar la estrofa de la expresión regular.

Esta expresión regular en mayúsculas es un conjunto explícito de palabras en mayúsculas en un archivo:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\0/g

No es ciencia espacial, pero de lo contrario tendrías que hacer esto:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\1\U\2\U\3\U\4\U\5/g

1
¿Puede resumir el artículo que mencionó en su respuesta?
EvergreenTree

¿Nos vemos? Es muy importante, si las respuestas de un solo enlace estuvieran bien, algunos años después este sitio estaría lleno de enlaces eliminados. Pero si solo copia una parte importante del enlace que hace referencia y le da también el enlace donde el OP puede obtener más información, está bien.
peterh - Restablece a Monica el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.