【问题标题】:Vim: set history=500 in .vimrc not taking effectVim:在 .vimrc 中设置 history=500 不生效
【发布时间】:2015-12-05 05:01:26
【问题描述】:

在带有 Vim 7.3 的 Ubuntu 12 系统上,发生了一件奇怪的事情。我的~/.vimrc 文件中有:set history=500。我在那个文件中有很多设置都可以工作。历史功能有效:~/.viminfo 具有良好的权限,并且其中保留了以下内容:命令和搜索历史记录、光标在文件中的位置、寄存器的内容等。但是,在启动 Vim 后,如果我执行 :set all,我会看到 history=20,尽管在 ~/.vimrc 中进行了设置。

如果我以交互方式执行:set history=500,那么它会坚持下去。

我对系统中所有与 Vim 相关的文件进行了递归搜索,寻找流氓set history 命令,但一无所获。

【问题讨论】:

    标签: vim


    【解决方案1】:

    在发布我的问题时,我继续对此进行调查,并在提交之前发现了解决方案。这对未来的访问者可能很有价值。

    答案是:set history 必须放在您的.vimrc 文件中的:set nocompatible 之后。尽管在该选项之前接受了一些其他作为 Vim 扩展的设置,例如 :set backupdir

    问题不在于:set history 在兼容模式下被拒绝

    相反,:set nocompatible 具有将历史重置为默认 20 的副作用:这是我正在寻找的“流氓命令”。

    你可以试试这个:

    :set nocompatible
    :set history=500
    :set nocompatible
    

    :set history=500 命令生效,但第二个:set nocompatiblehistory 更改为20!

    验尸附录:

    注意:虽然今天处理.vimrc 文件确实意味着nocompatible,但正如评论指出的那样,历史上并非如此。

    您可以在 Vim 3.0 sources 中看到,它与 我在 1994 年开始使用的版本非常匹配cmdline.c 中的 dosource 函数不接受任何标志参数并且不在处理.vimrc 时不要做任何特别的事情。您必须在.vimrc 中显式设置:nocompatible

    在较新的源代码中,函数do_source 通过一个标志知道它正在处理一个.vimrc 文件,如果该文件存在,它会调用options.c 中的一个名为vimrc_found 的函数来重置兼容性标志。

    Vim 引入了这种行为,但没有为用户提供任何有用的诊断信息,这些用户在其 .vimrc 文件中继续拥有现在无用且可能有害的 :set nocompatible,并将 "onion in the varnish" 从一个系统带到下一个系统。

    另外需要注意的是,resetting 兼容性选项在 Vim 3 中没有额外的副作用。只有 setting 选项(告诉 Vim 兼容)。您可以在doset 函数的param.c 源文件中看到这一点。有一个检查,如果刚刚调整的选项是兼容性选项,并且该选项现在是布尔真,然后调整无数其他设置,以便更像 Vi。关闭选项时没有设置历史为20这样的行为。

    也就是说,既然:set nocompatible曾经除了清除compatible之外没有任何副作用,前面有其他设置也没关系。 Vim 维护者在:set nocompatible 中添加了副作用,而不关心老用户可能在他们的.vimrc 文件中仍然有这个命令,而不是在顶部。

    TL;博士;我不是白痴。

    【讨论】:

    • 一切都应该放在nocompatible之后。 nocompatible 更改了很多设置,不值得费心找出更改了哪些设置。你甚至不需要设置它,因为有一个 vimrc 隐式设置它。
    • @FDinoff 在这种情况下,它在~/.vimrc 中的唯一作用应该是......发出警告诊断。
    • 大家~/.vimrc的第一行应该是set nocompatible。但是,最好将其包装在条件中,仅在模式之前兼容时才设置它,if &compatible 然后设置它。
    • @FDinoff 见编辑。当我开始使用 Vim 时,:set nocompatible 除了将参数清零之外没有任何副作用,加载.vimrc 也不会影响兼容性选项。
    • @Corey 这是不正确的。回到它是必需的时候,它是否是第一行并不重要。今天,它不是必需的,并且可能会干扰其他.vimrc 文件的设置。例如,如果您在 /etc/ 的主 Vimrc 文件中设置 history,则本地 .vimrc 中的 :set nocompatible 将破坏它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多