如何在Vim中取消设置变量?

33

我有一个插件,它设置一个全局变量并在每次加载插件时检查它,以避免多次加载。我想允许重新加载插件(允许重新加载插件),而不需修改插件本身。插件只需检查其变量是否存在(即exists('g:var_name'))——有没有一种方法可以取消该变量,使得exists()检查返回false?

p.s. 我不想修改插件本身,因为我使用git子模块和Pathogen指向插件存储库。

2个回答

43

我发现了Vimscript的Vim文档,其中有一个关于变量的部分:

使用":unlet"命令删除变量。例如:

:unlet s:count

3

您应该能够使用:unlet g:var_name命令。

然而,如果插件中定义的函数没有使用function!关键字,则在插件被再次加载时会出现许多错误。插件可能还在做一些初始化设置,重复运行它可能会导致问题。

通常情况下,如果插件作者添加了一个"loaded trap",那么这样做肯定有其原因。


是的,我正在涉足危险的领域。具体来说,我使用 Mark 插件,但每当我使用 sessionman.vim 加载会话时,它似乎会被覆盖。 - Drew Stephens
1
你可以使用 let g:force_reload_mark = 1 替代 unlet g:loaded_mark,因为测试的构造方式。从脚本页面的自述文件来看,插件似乎是以重新加载资源为目的编写的,因为任何颜色方案的更改都会导致插件失效。 - Randy Morris
这里有两个补充:1. 如果您定义匿名函数(function dict.fname),那么您应该只是清空 dict(如 let dict={})而不是使用 function!。2. 如果您定义普通函数,则为了避免在重新加载插件时出现错误,可以使用 delfunction 命令。这两个操作都由 vimpluginloader 的 LoadCommand reload ... 和 frawor 的 call frawor#Reload(...) 使用(要能够重新加载插件,必须使用这些框架)。 - ZyX
糟糕,我在vim.org上链接了错误的Mark脚本 - 我实际上正在使用Ingo Karkat的Mark,它没有g:force_reload_mark - Drew Stephens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接