1

在阅读有关以下内容的 vim 文档后*:bar* *:\bar*

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


我试图通过以下命令清除历史记录:

:set history=0 | set history=20

我希望,这两个命令应该被一个一个执行,并且历史应该被清除。
但它没有。历史仍然存在,并添加了新的历史。


然后我尝试了:

:set history=0
:set history=20

有用。


为什么?

4

1 回答 1

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 并且始终确保我不会丢失任何小但有用的东西),但硬编码此值会使历史大小更改为其他内容更痛苦。

于 2012-06-16T20:33:23.137 回答