如何调试vimrc文件?


80

我在Vim中遇到问题,我认为它可能在我的vimrc文件中(或被告知可能是我的vimrc文件)。

我该如何验证?如果我的vimrc文件,我怎么知道究竟问题出?

Answers:


79

您要做的第一件事是使用默认设置启动Vim:

vim -u NONE -U NONE -N

-u NONE阻止Vim的加载你的vimrc,-U NONE防止Vim的加载你的gvimrc,并-N告诉Vim使用不兼容模式(这不是必须的,但大多数的Vim用户不习惯“兼容”模式)。需要注意的是,NONE要求要在全部大写。

在Windows中,可以通过创建新的快捷方式1 添加这些标志

  • 如果问题保持,那么你知道这是不是东西在你的vimrc。

  • 如果问题消失了,那是由于您的vimrc文件中的某些东西引起的。

这不是我的vimrc!

欢呼!去问你的问题。请务必提及您尝试在没有vimrc文件的情况下启动Vim!

所以这是我的vimrc,现在呢?

如果还没有的话,您可能想先保存vimrc文件的备份副本。

检查插件

您可能想做的下一件事是首先禁用所有插件;插件可以在Vim中改变很多。如果这解决了问题,请尝试通过逐个重新启用它们来找出 哪个插件。在找到哪个插件导致问题的确切原因之后,您可以阅读此插件的文档和/或询问带有标记的问题,以尝试并修复它plugin-<name>

如果它不是一个插件,而你没有任何想法是什么导致你的问题,那么它是一个试错的过程。注释掉vimrc中的一行或多行,启动Vim,检查是否出现问题,然后重复此过程,直到问题不再发生为止。最快的方法是:

  1. 注释掉(或删除)大约一半的vimrc文件。
  2. 重新启动Vim,或打开新的Vim(重新加载vimrc 不够好,因为尚未取消设置)。
  3. 问题现在消失了吗?放回删除的部分(在这里保持Vim打开并使用undo很有用),然后对添加回的部分重复步骤1。
  4. 问题仍然存在吗?转到步骤1。

最后,您应该使用一个选项或几个选项的组合来引起问题。您可以使用以下方法在Vim中找到有关任何选项的更多信息:

:help 'option_name'

引号在这里很重要,通常在没有引号的情况下也可以使用,但是有时如果省略引号,则会导致输入错误的页面。

如果您在阅读帮助页面后仍然感到困惑,则知道在哪里提出问题;-)

调试单个插件

如果您想隔离单个插件,也许要问一个问题,则希望尽可能少地加载,但仍然加载该插件。您可以使用Vim的软件包功能轻松地做到这一点。这需要Vim 8或Neovim的较新版本。

  1. 创建一个新的空目录;~/plugin在本示例中,我们将使用路径。现在,将插件放在常规pack/plugins/start/$name目录中。例如:

    git clone https://github.com/fatih/vim-go.git ~/plugin/pack/plugins/start/vim-go
    
  2. 创建一个test-vimrc具有以下内容的文件;这将确保Vim会从加载的插件~/plugin目录,没有~/.vim 目录:

    set nocompatible
    set packpath=~/plugin,/usr/share/vim/vimfiles,/usr/share/vim/vim80,/usr/share/vim/vimfiles/after,~/plugin/after
    packloadall!
    
    syntax on
    filetype plugin indent on
    
  3. 用以下命令启动Vim:

    vim -U NONE -u ~/test-vimrc
    

    现在,只有一个插件,您有了最小的vimrc。


脚注

1例如:在64位Windows上,快捷方式如下所示:"C:\Program Files (x86)\Vim\vim74\vim.exe" -u NONE -U NONE -N。要创建它,请在想要快捷方式的文件资源管理器中右键单击,然后选择“新建”->“快捷方式”并粘贴快捷方式文本。如果您的Vim安装在其他位置,则可能需要更改Vim路径。



2
在弄清了自己的错误之后,这将是个绝佳的时机,开始将.vimrc保持在版本控制之下:)几乎总是您对它进行的最后更改之一,使内容的行为异常。
escrafford

1
如果需要,-U NONE则不需要-u NONE
安东尼

@MartinTournoij我建议进行编辑,以使首次阅读的人更容易理解。我希望你喜欢它。谢谢!
jpaugh

1
谢谢@jpaugh; 我认为该顺序更有意义。
马丁·图尔诺伊

31

有一个-D专门用于调试的Vim参数,它将在执行脚本中的第一个命令后进入调试模式。

例如在没有任何插件的情况下以调试模式运行Vim,运行方式为:

vim --noplugin -D

键入n/ next解析下一行,并按住Enter

contq返回vim界面。

如果您使用的是GUI版本,请gui在vimrc中放置一个命令以在该命令之后立即开始调试。

Ctrl+ d获取可用命令列表

阅读更多:


1
这对于在导致错误消息的.vimrc文件中查找一个简单错误最有帮助。值得一试,因为它很快。
RichVel

1
@kenorb这个命令真是棒极了,让我不必再去其他编辑器了。
TheLazyChap

11

如前所述,首先尝试vim -u NONE -U NONE -N确保您的香草vim工作正常。

然后正常启动vim并检查

:messages

从问题后的vim内部开始,它将显示所有警告和错误。

最后用以下命令启动vim

vim -V9logfile.log

这将创建一个名为的日志文件logfile.log-V9即日志记录级别,并尝试重现您的问题。


11

另一个提示:就像穴居人一样,我确实喜欢在.vimrc中添加:echom“ message”来查看正在执行的内容和未执行的内容。

例如

if executable('ag')
  :echom "AG FOUND"

  ...
endif

这可以帮助我快速查看if块是否正在执行,等等。下次启动vim时,该消息将打印在控制台上。


6
如果使用echom另一个有趣的命令,则是:messages获取回显的消息的完整日志。在启动后查看它们有时会很有用。
statox

这几乎是我所需要的,我想在我的vimrc中查看cpoptions的值是什么,如何回显“:set cpoptions”的输出??
Mike Lippert

10

我发现有帮助的一件事是保留了一组变量,这些变量可以切换您的部分内容,.vimrc因此您可以禁用或启用部分内容,而不必注释掉内容。它还具有迫使您考虑自己组织的令人愉快的副作用.vimrc

" feature toggles in vimrc
let g:vimrc_feat_pathogen               = 1
let g:vimrc_feat_core_minimal           = 1
let g:vimrc_feat_matchit                = 1
let g:vimrc_feat_options                = 1
let g:vimrc_feat_colors_and_highlight   = 1
let g:vimrc_feat_key_rebinding_arpeggio = 1
let g:vimrc_feat_key_rebinding          = 1
let g:vimrc_feat_autocommand_group      = 1
let g:vimrc_feat_custom_definitions     = 1
let g:vimrc_feat_load_opam              = 1

这是一个由保护的部分的示例if

if g:vimrc_feat_core_minimal
    set nocompatible
    filetype plugin indent on
    syntax on
endif

1

我的vimrc加载时间非常缓慢,大约为400ms,仅通过删除以下行,我将其减少到20ms:

silent !mkdir ~/.config/nvim/backups > /dev/null 2>&1

确保您没有对这样的外部命令的调用。


1
欢迎光临本站!这是一个有用的花絮,但比提出的一般性问题要具体得多。最好将其添加为该问题的答案,或者,如果您只是想分享知识,则可以提出并回答自己的问题?
丰富

0

这是一个非常简单的过程,可以帮助您入门。

  1. 注释掉整个.vimrc文件的内容
  2. 通过运行:source %或重新加载.vimrc:so $MYVIMRC
  3. 取消注释文件的谨慎部分(通常从顶部开始)
  4. 重复步骤2和3,直到找到错误。
  5. 解决错误。

1
如果您正确地大写并标点了这个答案,可能会好得多。

强烈建议您执行二进制搜索。
D. Ben Knoble
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.