2011-07-13 6 views
19

edición de texto simple con Vim: http://vimgolf.com/challenges/4d1a34ccfa85f32065000004Desafío "Edición de texto simple con Vim" en VimGolf: ¿Cómo funciona la solución n. ° 1?

me resulta difícil entender la solución # 1 (Puntuación 13).

Lo sentimos, no se pega ninguna solución en esta publicación, porque no sé si es apropiado hacerlo.

+3

Hay un problema con esta pregunta: nadie puede ver la solución n. ° 1 (a menos que estén registrados en vimgolf, como yo). Mientras tanto, ¿por qué no lo prueba paso a paso? – sehe

Respuesta

33

La solución se centra en el comando :g. De la ayuda:

           :g :global E147 E148 
:[range]g[lobal]/{pattern}/[cmd] 
         Execute the Ex command [cmd] (default ":p") on the 
         lines within [range] where {pattern} matches. 

Así que, básicamente, la solución ejecuta algunos comandos ex en las líneas que tienen una "V", que son exactamente los que necesitan de edición. Probablemente haya notado que las soluciones anteriores de se basan en la duplicación de las líneas, en lugar de cambiarlas realmente en . Esta solución muestra especialmente un patrón interesante:

3jYjVp3jYjVp3jYjVpZZ 
^ ^ ^

que podría reducirse con una macro:

[email protected] 

La solución usando el comando :g hace básicamente lo mismo. El primer comando ejecutado es t.. De la ayuda:

              :t 
:t     Synonym for copy. 

:[range]co[py] {address}        :co :copy 
         Copy the lines given by [range] to below the line 
         given by {address}. 

La dirección indicada fue ., lo que significa que la línea actual:

Line numbers may be specified with:   :range E14 {address} 
     {number}   an absolute line number 
     .     the current line       :. 
     $     the last line in the file     :$ 
     %     equal to 1,$ (the entire file)    :% 
     't     position of mark t (lowercase)    :' 
     'T     position of mark T (uppercase); when the mark is in 
          another file it cannot be used in a range 
     /{pattern}[/]  the next line where {pattern} matches  :/ 
     ?{pattern}[?]  the previous line where {pattern} matches :? 
     \/     the next line where the previously used search 
          pattern matches 
     \?     the previous line where the previously used search 
          pattern matches 
     \&     the next line where the previously used substitute 
          pattern matches 

Así el comando ex t. significa "línea actual copia a por debajo de la línea actual". Entonces, hay un bar que:

             :bar :\bar 
'|' can be used to separate commands, so you can give multiple commands in one 
line. If you want to use '|' in an argument, precede it with '\'. 

Y el comando d, lo que obviamente elimina la línea. Se le dio un rango de +, lo que significa la "línea actual + 1". Puede pasar .+1 pero + para abreviar. Estos información se puede leer que rodea la ayuda de :range:

The default line specifier for most commands is the cursor position, but the 
commands ":write" and ":global" have the whole file (1,$) as default. 

Each may be followed (several times) by '+' or '-' and an optional number. 
This number is added or subtracted from the preceding line number. If the 
number is omitted, 1 is used. 

Y eso es todo.

:g/V/t.|+d<CR>ZZ 

En cada línea que tiene una "V", copiar hacia abajo y elimine la siguiente línea. Escriba y salga.


Una cosa que no he mencionado es por eso que los comandos se ejecutan :g tres veces en lugar de 6 o incluso más (líneas se duplican a lo largo del proceso). El comando :g comienza a posicionar el cursor en la línea uno, y baja a $. Pero si los comandos cambian la línea actual, :g continúa desde allí. Entonces:

:g/V/ 

La línea actual es 4.Ahora:

t. 

Esto mueve el cursor a la línea 5. Y luego:

+d 

Borra la línea 6, el cursor permanece en 5. Así que la próxima :g partido estará en la línea 8.

+0

+1 Buena explicación incluso si no puedo leer el problema. :) –

+0

Gracias @Xavier T. El problema debe ser visible para todos, simplemente siga el enlace proporcionado en la pregunta. – sidyll

+0

¡Tienes razón, realmente puedo ver la condición de inicio/finalización! –

Cuestiones relacionadas