Agrupar secuencias de comandos juntas para repetir (.)

10

Considerar:

apple
pear

Coloque el cursor en la primera línea y escriba Yp, produciendo:

apple
apple
pear

Coloque el cursor en la pearlínea y escriba .para repetir el último comando. Esto repite solo el p(en lugar de la combinación Yp), produciendo:

apple
apple
pear
apple

Me gustaría una forma de decir .que repita los últimos N comandos. Algo así como 2.repetir la combinación Yppara producir:

apple
apple
pear
pear

Ofc que no funcionará, se repite pdos veces. Pero la idea sería "repetir la secuencia de los últimos 2 comandos".

Sé que puedo qgrabar secuencias de comandos y repetirlas con ellas @@, pero esta solución no es ideal, ya que requiere que hayas estado planeando todo el tiempo, mientras que en la práctica a menudo no te das cuenta de que necesitas repetir algo hasta después. Lo has hecho.

¿Hay alguna forma de lograr lo que quiero?

Premio de consolación: si lo anterior no es posible, ¿hay alguna manera de repetir la última reproducción de macro? Por ejemplo, si escribí @@para reproducir mi última macro, me gustaría que la siguiente .sea ​​equivalente a escribir @@nuevamente, lo cual no es así (por ejemplo, si el resultado @@depende de la línea en la que se encuentre)

Jonás
fuente
No conozco una solución para la primera parte de su problema, pero para la segunda parte, puede probar esta asignación: nno <silent> @@ @@:sil! call repeat#set('@@', v:count1)<CR>pero para que funcione, debe instalar este complemento: github.com/tpope/vim-repeat
user9433424

Respuestas:

4

Vim solo almacena el último comando ejecutado, y solo eso se repite .; En mi opinión, cualquier otra cosa sería difícil de manejar.

Si siente la necesidad de repetir el Ypcombo como una entidad única, debe convertirlo en un solo comando. El complemento repeat.vim de Tim Pope permite hacerlo fácilmente para las asignaciones personalizadas. Por supuesto, si elige una [secuencia] de tecla corta para la asignación, puede .volver a escribirla rápidamente (en lugar de ) e incluso evitar la integración de repeat.vim.

Por cierto, mi complemento LineJuggler proporciona una ]dasignación para duplicar la línea actual, y admite la repetición a través de repeat.vim.

Ingo Karkat
fuente
2

En Yp, el único "cambio" para repetir es p. La única forma en que sé alterar el comportamiento de .en modo normal es agregar ya la cpoptionsopción:

set cpoptions+=y

que le permite repetir el último tirón y el último cambio.

Pero eso no cambia nada a su problema porque Yptodavía hay dos comandos: un tirón seguido de un cambio.

No creo que pueda obtener lo que quiere sin algunas secuencias de comandos no triviales. ¿Le echó un vistazo a la sección de scripts de vim.org ?

romainl
fuente
1

Con frecuencia uso mappara lograr este efecto. Por ejemplo:

map <F12> Yp

Luego, presionar F12repetidamente se ejecutará, YpYpYpetc. Si desea pasar a la siguiente línea después de cada pegado, asigne una tecla a Yp+.

usuario112358
fuente
1

El notable artilugio que es el complemento RepeatLast (por nuestro propio @joeytwiddle ) proporciona esta funcionalidad, a través del método impuro de grabar todo lo que haces como macro.

Proporciona una serie de nuevas asignaciones, pero, si estoy leyendo la documentación correctamente, para realizar las ediciones que describa, podría usar la secuencia de comandos (suponiendo que esté usando el valor predeterminado <leader>de \):

  • YpYank y poner / pegar la línea apple,
  • jMueve hacia abajo una línea para que el cursor esté ahora en la pearlínea,
  • \Dolvida el jcomando
  • 2\.Repita los dos comandos Yyp
Rico
fuente
¡Profano, de hecho! Pero aprecio la ambición.
Jonás