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.
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