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

时间:2012-06-16 14:39:12

标签: vim

阅读关于*:bar* *:\bar*的vim文档:

  

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


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

:set history=0 | set history=20

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


然后我尝试了:

:set history=0
:set history=20

有效。


为什么?

1 个答案:

答案 0 :(得分:7)

当您执行发生的命令行时:

  1. 历史记录已初始化(此处发生截断)(init_hist()中的getcmdline()函数调用)。
  2. 获取要执行的字符串(在getcmdline()中)。
  3. 它已添加到历史记录中(add_to_history()中的getcmdline())。
  4. 执行do_one_cmd() do_cmdline(),在getcmdline()调用后调用(由getexline()调用fgetline参数传递给do_cmdline()) )。
  5. 设置选项本身不执行任何操作,只有changes p_hi变量。历史的实际修改在步骤1完成。

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

    1. 历史记录首先在p_hi具有旧值时初始化,然后更改两次,然后当您执行下一个命令时,它已设置为20
    2. 历史记录首先在p_hi具有旧值时初始化,然后更改一次,第二次初始化,在此步骤中被有效截断,然后值再次更改。当你开始输入第三个命令时,它已经被消灭了。
    3. 因此,您的假设(命令一个接一个地执行)是正确的,但您错误地发现了历史修改。我宁愿建议使用histdel()作为@Michael建议,因为,首先,它自己清除历史,第二,它没有硬编码的“历史”价值。我不能说你如何生活只有20行历史(我已经设置为65535并且我总是确定我不会丢失任何小的,但有用的),但硬编码这个值将使历史大小改变为其他更痛苦。