vim中的`:bar`无法按预期工作

kev*_*kev 1 vim

阅读vim doc后*:bar* *:\bar*:

'|' 可用于分隔命令,因此您可以在一行中提供多个命令.


我尝试通过此命令清除历史记录:

:set history=0 | set history=20
Run Code Online (Sandbox Code Playgroud)

我希望,这两个命令应该逐个执行,并且应该清除历史记录.
但事实并非如此.历史仍然存在,并增加了新的历史.


然后我尝试了:

:set history=0
:set history=20
Run Code Online (Sandbox Code Playgroud)

有用.


为什么?

ZyX*_*ZyX 7

当您执行命令行时,会发生以下情况:

  1. 历史记录已初始化(此处发生截断)(init_hist()函数调用getcmdline()).
  2. 获取要执行的字符串(in getcmdline()).
  3. 它被添加到历史记录中(add_to_history()调用getcmdline()).
  4. 它被执行(do_one_cmd()在调用do_cmdline()之后发生getcmdline()(getexline()通过作为fgetline参数传递来调用do_cmdline())).

设置选项本身什么也不做,它只改变 p_hi变量.历史的实际修改在步骤1完成.

现在让我们看看在两种情况下会发生什么(假设您键入了第二个或第三个附加命令):

  1. 历史记录首先在p_hi具有旧值时初始化,然后更改两次,然后当您执行下一个命令时,它已经设置为20.
  2. 历史记录首先在p_hi具有旧值时初始化,然后更改一次并第二次初始化,在此步骤中被有效截断,然后值再次更改.当你开始输入第三个命令时,它已经被消灭了.

因此,您的假设(命令一个接一个地执行)是正确的,但您错误地发现了历史修改.我宁愿建议使用histdel()@Michael建议,因为,首先,它自己清除历史,其次,它没有硬编码的"历史"价值.我不能说你如何生活只有20行历史(我已经设置为65535并且我总是确定我不会丢失任何小的,但有用的),但硬编码这个值将使历史大小改变为其他的更痛苦.