¿Puedo deshacer varias veces en nvi y / o vi original?

A veces «estoy en un sistema sin Vim y uso el nvi predeterminado (sistemas BSD) o el original vi (Arch Linux).

Hay bastantes diferencias, pero la mayor molestia es que puedo deshacer solo mi última operación. Al presionar u la segunda vez, los trabajos son un «rehacer».

¿Hay alguna forma de hacer que esto funcione?

Respuesta

De nvi(1) :

 u Undo the last change made to the file. If repeated, the u command alternates between these two states. The . command, when used immediately after u, causes the change log to be rolled forward or backward, depending on the action of the u command. 

Entonces presione u , y luego siga presionando . para deshacer más; si presiona u nuevamente, «invertirá» la dirección y presionar . será rehacer.

No supe de esto hasta ayer; y pensé que de alguna manera era una característica nueva, pero parece que ha funcionado así desde al menos nvi 1.79 de 1996 .

Esto no «t trabajar en el original vi ; donde el deshacer está documentado como:

 u Undoes the last change made to the current buffer. If repeated, will alternate between these two states, thus is its own inverse. When used after an insert which inserted text on more than one line, the lines are saved in the numeric named buffers (3.5). 

Lo cual es realmente una forma complicada de decir que presionando u nuevamente se rehacerán los cambios.

Que es también lo que dice Vim «s :help undo (y por qué asumí que tampoco funcionaría en nvi):

 u Undo [count] changes. {Vi: only one level} 

Responder

Lo más parecido a la vi tiene que deshacer múltiples (además de U que puede revertir varios cambios dentro de una sola línea) son los registros numerados, que contienen los nueve cambios más recientes o eliminaciones.

Si coloca desde un registro numerado, los comandos de puntos posteriores incrementarán ese registro cuando repita el comando.

Por ejemplo, con el siguiente texto, con la línea del cursor indicada con >,

 aaaa > bbbb cccc dddd eeee 

el comando dd.. dará como resultado:

 aaaa > eeee 

Si luego escribe "1P, vi pondrá la eliminación más reciente del registro "1:

 aaaa > dddd eeee 

Pulsando . pondrá el contenido del siguiente registro más reciente, haciendo "2P, y presionando . de nuevo se pondrá el contenido del registro "3.

Entonces, en resumen, "P.. devolverá todo el texto que eliminaste, dejándote con

 aaaa > bbbb cccc dddd eeee 

¡No es brillante, pero es mejor que nada! De manera más útil, puede usarlo al principio o al final del búfer para inspeccionar rápidamente lo que hay en sus registros numerados. Luego, puede eliminar fácilmente lo que no necesita.

Está documentado en vim debajo de :help redo-register.

Responder

Con el vi original, presione [n] u para retroceder n pasos. Para retroceder progresivamente paso a paso …

  • presione [n] u para retroceder n pasos
  • luego presione [n] u para rehacer n pasos
  • luego presione [n + 1] u para retroceder [n + 1] pasos
  • etc

Comentarios

  • Tengo algo parecido al vi original , y no ' parece retroceder n pasos.
  • De acuerdo. Vi original puede revertir solo un único cambio con u, o restaurar una sola línea a su forma fue antes de que empezaras a editarlo con U.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *