在阅读有关以下内容的 vim 文档后*:bar* *:\bar*
:
'|'
可用于分隔命令,因此您可以在一行中给出多个命令。
我试图通过以下命令清除历史记录:
:set history=0 | set history=20
我希望,这两个命令应该被一个一个执行,并且历史应该被清除。
但它没有。历史仍然存在,并添加了新的历史。
然后我尝试了:
:set history=0
:set history=20
有用。
为什么?
在阅读有关以下内容的 vim 文档后*:bar* *:\bar*
:
'|'
可用于分隔命令,因此您可以在一行中给出多个命令。
我试图通过以下命令清除历史记录:
:set history=0 | set history=20
我希望,这两个命令应该被一个一个执行,并且历史应该被清除。
但它没有。历史仍然存在,并添加了新的历史。
然后我尝试了:
:set history=0
:set history=20
有用。
为什么?
当您执行命令行时会发生以下情况:
init_hist()
函数调用getcmdline()
)。getcmdline()
)。add_to_history()
调用getcmdline()
)。do_one_cmd()
在do_cmdline()
,发生在getcmdline()
调用之后(getexline()
通过作为fgetline
参数传递给do_cmdline()
))。设置选项本身什么都不做,它只会改变 p_hi
变量。历史的实际修改在步骤 1 完成。
现在让我们看看在这两种情况下会发生什么(假设您输入了第二个或第三个附加命令):
p_hi
,然后它被更改两次,然后当你执行下一个命令时它已经设置为20
。p_hi
有旧值时首先初始化,然后更改一次并第二次初始化,在这一步被有效截断,然后值再次更改。当您开始输入第三个命令时,它已经被清除了。因此,您的假设(命令被一一执行)是正确的,但是您错误地发生了历史修改。我宁愿建议histdel()
按照@Michael 的建议使用,因为首先它会自行清除历史记录,其次,它没有硬编码的“历史记录”值。我不能说只有 20 行长的历史(我已将其设置为 65535 并且始终确保我不会丢失任何小但有用的东西),但硬编码此值会使历史大小更改为其他内容更痛苦。