如何在VimL中调试问题?

时间:2014-02-14 05:30:45

标签: debugging vim

我想了解更多有关vim调试的信息。 vim有哪些功能可以帮助我诊断出我可能遇到的问题?

我基本上想知道:

  • 如何诊断.vimrc和其他配置文件的问题?
  • 在VimL中调试脚本有哪些策略?

3 个答案:

答案 0 :(得分:4)

如何诊断.vimrc和其他配置文件的问题?

如果你在vim中有一些意想不到的行为,你不确定在哪里 问题是起源的,有一些方法可以在源头上进行珩磨 这个问题。最好的第一步之一是找出问题所在 正常的vim行为,由插件引起或由.vimrc引起。

如果您的vim实例正在设置特定的'option'而您不确定 它被设置的地方。您可以使用:verbose命令查找。对于 实例

:verbose set nocompatible?
nocompatible
     Last set from ~/.vimrc

运行没有任何插件或配置文件的vim实例

vim -N -u NONE

我在我的cleanvim文件中将其设置为名为.bashrc的别名。 -u NONE是。{ 这里有什么魔力呢。 -N只是将vim置于nocompatible模式, 这通常是期望的。您也可以使用NORC选项仅排除 你的vimrc。请注意,如果你使用像病原体或vundle这样的东西 从你的vimrc中实例化你的插件,然后你的插件也会 没有正确加载。

如果你使用像病原体或vundle这样的插件管理器,那么排除你的 插件很简单;只需在.vimrc调用中注明该行 病原体或vundle。但是,如果您从.vim加载了其他插件 您可以使用--noplugin标记排除它们的目录。

如果您的问题是由插件引起的,请尝试逐个添加插件 确定哪一个导致问题。从那里你可以报告 插件的维护者的错误或尝试自己诊断问题 使用本答案其余部分的提示。

如果您的问题是由.vimrc引起的,那么有一些方法可以继续使用 进一步的问题。一旦简单的方法是在某些地方添加finish命令 指向.vimrc。遇到此命令后,脚本将停止 被采购并且在执行之后没有命令。这样你就可以 排除.vimrc的大部分内容并尝试找出一般区域 问题来自何处。

在VimL中调试脚本有哪些策略?

Vim在:h debug-scripts处有关于此主题的帮助部分。这描述了 详细介绍了vim的调试模式,它允许您设置断点和步骤 通过源文件或用户功能。您可以在特定的位置添加断点 功能或文件中的特定行。例如......

" set a breakpoint on the function MyCoolFunc
:breakadd func MyCoolFunc

" set a breakpoint on line 43 of your .vimrc
:breakadd file 43 .vimrc

" set a breakpoint at this location
:breakadd here

设置断点后,您可以再次获取文件以开始调试模式 那条线。如果您想在整个文件上使用调试模式,请使用 -D标志。您还可以在特定命令上运行调试模式。例如, 说你在使用特定命令:MyCommand时遇到问题。你可以开始了 使用:debug MyCommand对此命令进行调试模式。

启动调试模式后,您可以使用常用的vim命令集。 这很有用,因为您现在可以使用。来检查变量的值 echo命令尝试和诊断问题。您也可以使用verbose 选项以提供有关以下行的额外信息。见:h 'verbose' 对于它的选择。

答案 1 :(得分:3)

The scriptease对调试vimL很有帮助:

  • 提供更容易插入Vim断点的命令
  • :Runtime可以轻松重新加载插件,甚至可以卸载包括警卫
  • :Disarm {file}:尝试通过删除映射,命令和autocmds来禁用运行时文件
  • :Time {command}:profilling
  • :Verbose {command}:与:verbose类似,但会将结果捕获到文件并将其加载到预览窗口中

对于需要多次重启Vim的情况(例如:增量删除插件),session plugin:RestartVim命令可能很有用。

答案 2 :(得分:1)

对于vimL,我发现这两个插件很棒:

  • BreakPts

    设置/查看Vim断点并直观浏览功能

  • Decho

    适用于调试脚本的更好的回声功能

我也使用它来快速获取所选的vimL行:

fu! SourceRange() range
  let tmpsofile = tempname()
  call writefile(getline(a:firstline, a:lastline), l:tmpsofile)
  execute "source " . l:tmpsofile
  call delete(l:tmpsofile)
  let n = a:lastline - a:firstline + 1
  echo 'Sourced ' . n . ' line' . (n > 1 ? 's' : '')
endf
com! -range Source <line1>,<line2>call SourceRange()

nn gs m`:Source<cr>``
vn gs m`:Source<cr>``