有时我在没有Vim的系统上,使用默认的nvi(BSD系统)
或原始的vi(Arch Linux)。

有很多区别,但最大的区别是烦人的是,我只能撤消上一次操作。第二次按下u键是
“ redo”。

是否有某种方法可以使此功能正常工作?

#1 楼

来自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,它将“反转”方向并按。将重做。

直到昨天我才知道。并以为这是一个新功能,但似乎至少从1996年的nvi 1.79开始就这样工作了。

在最初的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
将重做您的更改。

Vim的:help undo也是这样(以及为什么我认为它也不会在nvi中起作用):

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


#2 楼

原始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中进行了说明。

#3 楼

使用原始vi,按[n] u后退n步。
逐步逐步返回...


按[n] u后退n步
然后按[n] u重做n步
然后按[n + 1] u返回[n + 1]步



评论


我有一些接近原始vi的东西,而且似乎没有退后n步。

–muru
16年4月18日在19:49

同意原始Vi只能使用u还原单个更改,或者将单个行还原为开始使用U进行编辑之前的状态。

– Antony
16 Dec 26 '15:13