Могу ли я отменить несколько раз в nvi и / или оригинальном vi?

13

Иногда я работаю в системе без Vim и использую стандартную nvi(системы BSD) или оригинальную vi(Arch Linux).

Отличий довольно много, но самое большое раздражение в том, что я могу отменить только мою последнюю операцию. Нажатие uво второй раз работает "повторить".

Есть ли способ заставить это работать?

Мартин Турной
источник

Ответы:

16

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

Так что нажмите u, а затем продолжайте нажимать .для более отмены; Если вы нажмете еще uраз, он будет «менять направление», и нажатие .будет повторным.

Я никогда не знал об этом до вчерашнего дня; и думал, что это как-то новая функция, но похоже, что она работала так, по крайней мере, nvi 1.79 от 1996 года .

Это не работает в оригинальном vi ; где отмена задокументирована как:

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

Это действительно сложный способ сказать, что uповторное нажатие вернет ваши изменения.

Что также говорит Вим :help undo(и почему я предположил, что это тоже не сработает nvi):

 u                       Undo [count] changes.  {Vi: only one level}
Мартин Турной
источник
1

Самая близкая вещь, которую оригинал viимеет к множественным отменам (кроме Uкоторых может отменить многократные изменения в пределах одной строки), является пронумерованными регистрами, которые содержат девять самых последних изменений или удалений.

Если вы положили из нумерованного регистра, последующие точечные команды будут увеличивать этот регистр, когда он повторяет команду.

Например, со следующим текстом с линией курсора, обозначенной >,

  aaaa
> bbbb
  cccc
  dddd
  eeee

команда dd..приведет к:

  aaaa
> eeee

Если вы наберете "1P, vi поместит самое последнее удаление из реестра "1:

  aaaa
> dddd
  eeee

Нажав, .вы поместите содержимое следующего самого последнего регистра, выполнив "2P, и нажав еще .раз, поместите содержимое регистра "3.

Короче говоря, "P..вернет весь удаленный текст, оставив вас

  aaaa
> bbbb
  cccc
  dddd
  eeee

Не блестяще, но лучше, чем ничего! Более полезно использовать его в начале или конце буфера, чтобы быстро проверить, что находится в ваших пронумерованных регистрах. Тогда вы можете легко удалить то, что вам не нужно.

Это задокументировано в vim под :help redo-register.

Antony
источник
-1

Используя оригинальный vi, нажмите [n] u, чтобы вернуться на n шагов назад. Чтобы постепенно вернуться назад шаг за шагом ...

  • нажмите [n] u, чтобы вернуться на n шагов
  • затем нажмите [n] u, чтобы повторить n шагов
  • затем нажмите [n + 1] u, чтобы вернуться на [n + 1] шаги
  • и т.д
Адам Миллинг
источник
1
У меня есть что-то близкое к оригинальному vi , и оно, похоже, не возвращается на n шагов.
Муру
Согласовано. Original Vi может отменить только одно изменение с помощью uили восстановить одну строку до того, как это было до того, как вы начали редактировать ее U.
Энтони