Posso desfazer várias vezes no nvi e / ou no vi original?

13

Às vezes, estou em um sistema sem o Vim e uso o padrão nvi(sistemas BSD) ou o original vi(Arch Linux).

Existem algumas diferenças, mas o maior incômodo é que eu posso desfazer apenas minha última operação. Pressionando ua segunda vez que os trabalhos são "refazer".

Existe alguma maneira de fazer isso funcionar?

Martin Tournoij
fonte

Respostas:

16

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.

Então pressione ue continue pressionando .para desfazer mais; Se você pressionar unovamente, ele irá 'inverter' a direção e pressionar .será refazer.

Eu nunca soube disso até ontem; e pensei que era de alguma forma um novo recurso, mas parece que funciona assim desde pelo menos o nvi 1.79 de 1996 .

Isso não funciona no vi original ; onde o desfazer 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).

O que é realmente uma maneira complicada de dizer que pressionar unovamente irá refazer suas alterações.

O que também é o que o Vim :help undodiz (e por que eu presumi que também não funcionaria nvi):

 u                       Undo [count] changes.  {Vi: only one level}
Martin Tournoij
fonte
1

A coisa mais próxima que o original viprecisa desfazer várias vezes (além da Uqual pode reverter várias alterações em uma única linha) são os registros numerados, que contêm as nove alterações ou exclusões mais recentes.

Se você colocar em um registro numerado, os comandos de ponto subsequentes aumentarão esse registro quando ele repetir o comando.

Por exemplo, com o texto a seguir, com a linha do cursor indicada com >,

  aaaa
> bbbb
  cccc
  dddd
  eeee

o comando dd..resultará em:

  aaaa
> eeee

Se você digitar "1P, vi colocará a exclusão mais recente do registro "1:

  aaaa
> dddd
  eeee

Pressionar .colocará o conteúdo do próximo registro mais recente, fazendo "2P, e pressionar .novamente colocará o conteúdo do registro "3.

Então, resumindo, "P..colocará de volta todo o texto que você excluiu, deixando você com

  aaaa
> bbbb
  cccc
  dddd
  eeee

Não é brilhante, mas melhor que nada! Mais útil, você pode usá-lo no início ou no final do buffer para inspecionar rapidamente o que está em seus registros numerados. Em seguida, você pode excluir facilmente o que não precisa.

Está documentado no vim abaixo :help redo-register.

Antony
fonte
-1

Usando o vi original, pressione [n] u para voltar n etapas. Para voltar progressivamente passo a passo ...

  • pressione [n] u para voltar n passos
  • então pressione [n] u para refazer etapas
  • pressione [n + 1] u para voltar [n + 1] etapas
  • etc
Adam Milling
fonte
1
Eu tenho algo parecido com o vi original e ele não parece voltar n passos.
Muni
Acordado. O Vi original pode reverter apenas uma única alteração uou restaurar uma única linha da forma como estava antes de começar a editá-la U.
Antony