2009-11-05 24 views
12

¿Cómo puedo revertir una palabra en Vim? Preferiblemente con una expresión regular o comandos en modo normal, pero otros métodos también son bienvenidos:Invertir una palabra en Vim

palabra => drow

Gracias por su ayuda! PD: estoy en Windows XP

Python es compatible con mi vim, pero no Perl.

+0

Veo esta función muy a menudo. Exactamente: ¿por qué lo necesitas? ;) – wishi

+2

Hola @wishi_! Mi novia puede revertir las palabras muy rápido en mente y quiero verificarlo :-) – Jogusa

Respuesta

2

si su versión de VIM es compatible con ella se puede hacer vw\is o viw\is (poner el cursor en la primera letra de la palabra antes de escribir el comando) ... pero he tenido un montón de problemas de compatibilidad con eso. No estoy seguro de qué tiene que compilarse o encenderse, pero esto solo funciona a veces.

EDITAR:

\is es:

:<C-U>let [email protected]<CR> 
\ :let [email protected]"<CR> 
\ gv"ay :let @a=substitute(@a, '.\(.*\)\@=', '\[email protected][strlen(submatch(1))]', 'g')<CR> 
\ gvc<C-R>a<Esc> :let @a=old_reg_a<CR> 
\ :let @"=old_reg<CR> 

no se acordaron de donde vino, pero una búsqueda en Google vienen este artículo en vim.wikia.com. Lo cual muestra lo mismo, así que supongo que eso es todo.

+0

Hmm, eso no parece funcionar para mí, si escribes "mapa", ¿a qué has asignado? – Benj

4

Suponiendo que tenemos el apoyo del Perl integrado en vim, usted puede hacer esto:

command! ReverseWord call ReverseWord() 
function! ReverseWord() 
perl << EOF 
    $curword = VIM::Eval('expand("<cword>")'); 
    $reversed = reverse($curword); 
    VIM::Msg("$curword => $reversed"); 
    VIM::DoCommand("norm lbcw$reversed"); 
EOF 
endfun 

y potencialmente obligar a que un golpe de teclado, así:

nmap ,r :ReverseWord<CR> 
+0

Hmm, acabo de darme cuenta de que no funciona si estás en la primera letra de la palabra, necesitas estar en la letra dos más. – Benj

+0

Ok, lo arreglé y edité mi respuesta, básicamente necesitaba la norma lbcw not just bcw – Benj

+0

Parece que no funciona para mí, tal vez no es compatible con perl. ¡Pero Python es compatible! Gracias por tu esfuerzo. – Jogusa

1

Si usted tiene algún tiempo en sus manos, puede abrir un camino burbujeante al transitar de forma iterativa los caracteres (xp) ...

3

No tengo Python compatible con mi VIM, pero parece que sería muy simple hacerlo con Python. This article parece una buena explicación de cómo utilizar Python en VIM y supongo que haría algo como esto:

:python 'word'[::-1] 

El artículo indica que el resultado aparece en la barra de estado, que no serían -Optimal si está intentando reemplazar la cadena en un documento, pero si solo quiere comprobar que su novia está invirtiendo correctamente las cuerdas en su cabeza, esto debería estar bien.

6

Aquí hay otra solución (Pythonic) en función de cómo funciona esto:

:echo join(reverse(split('hello', '.\zs')), '') 
olleh 

Si desea reemplazar todas las palabras en la memoria intermedia,

:%s/\(\<.\{-}\>\)/\=join(reverse(split(submatch(1), '.\zs')), '')/g 

Esto funciona creando primero una lista de caracteres en la palabra, que se invierte y se une para formar la palabra. El comando sustituto encuentra cada palabra y luego pasa la palabra a las expresiones y usa el resultado como reemplazo.

1

Bien podrías usar python para invertir la línea a través del comando de filtro.Supongamos que el texto que ha escrito es:

Python 

Puede revertir emitiendo.

:1 ! python -c "print raw_input()[::-1]" 

y su texto será reemplazado para convertirse en:

nohtyP 

El "1" en el orden le dice a VI para enviar la línea 1 a la declaración de pitón, que estamos ejecutando: "raw_input de impresión() [:: - 1] ". Entonces, si quisieras invertir otra línea, enviarías ese número de línea como argumento. La instrucción python luego invierte la línea de entrada.

0

Si tiene rev instalado (por ejemplo, a través de MSys o Cygwin), entonces realmente no es tan difícil.

Seleccione lo que desea invertir y filtrar (%! <cmd>) que:

:%! rev 

Este tuberías de su selección a su intérprete de órdenes mientras pasándolo a un comando.