Windows下,VIM调试python的设置

作者:半瓶墨水   链接:http://www.2maomao.com/blog/win32-vim-debug-python/

vim很好用,但是python的set_trace太难用了,参考这篇文章,自己搞了一下。
现在Ctrl+M插入set_trace,Ctrl+U消除所有set_trace,Ctrl+D运行。觉得快捷键不爽的自己改改。
(M=>Mark, U=>Unmark, D=>Do)

总共四个步骤:

1. 安装python新版,http://www.python.org,并把python安装目录加入到系统路径

2. 安装VIM的runscript插件:其作用是在vim脚本中执行python脚本

3. 下载python2.4版本的python24.dll,放到c:\windows\system32目录。(注意,如果你的vim用的不是这个版本,后面的步骤中vim会出错,提示你没有pythonxx.dll,自己去找相应的版本下载),这个主要配合vim使用,也就是解释下面那一步的脚本的,和你调试的时候所用的python版本没有关系。

4. 把下面这段加入到_vimrc文件里面(我加在最后了):

python << EOF
import time
import vim
def SetBreakpoint():
    
nLine = int( vim.eval( 'line(".")'))
    
strLine = vim.current.line
    
i = 0
    
strWhite = ""
    
while strLine[i] == ' ' or strLine[i] == "\t":
        
i += 1
        
strWhite += strLine[i]
    
vim.current.buffer.append(
      
"%(space)spdb.set_trace() %(mark)s Breakpoint %(mark)s" %
         {
'space':strWhite, 'mark': '#' * 30}, nLine - 1)
    
for strLine in vim.current.buffer:
        
if strLine == "import pdb":
            
break
        
else:
            
vim.current.buffer.append( 'import pdb', 0)
            
vim.command( 'normal j1')
            
break
vim.command( 'map <C-M> :py SetBreakpoint()<cr>')
 
def RemoveBreakpoints():
    
nCurrentLine = int( vim.eval( 'line(".")'))
    
nLines = []
    
nLine = 1
    
for strLine in vim.current.buffer:
        
if strLine == 'import pdb' or strLine.lstrip()[:15] == 'pdb.set_trace()':
            
nLines.append( nLine)
        
nLine += 1
    
nLines.reverse()
    
for nLine in nLines:
        
vim.command( 'normal %dG' % nLine)
        
vim.command( 'normal dd')
        
if nLine < nCurrentLine:
            
nCurrentLine -= 1
    
vim.command( 'normal %dG' % nCurrentLine)
vim.command( 'map <C-U> :py RemoveBreakpoints()<cr>')
vim.command( 'map <C-D> :!python %<cr>')
EOF

13 条评论 发表在“Windows下,VIM调试python的设置”上

  1. 我的天空说道:

    vim是linux的vim吗

  2. 半瓶墨水说道:

    是windows下的gvim,不过和linux下应该是同源的。

  3. kero说道:

    vimgdb不知道你有没有试过,就是在vim里一个buffer显示源文件,一个buffer显示gdb窗口,可以给gdb发命令,也可以用key mapping,当前运行行高亮,总之用起来几乎和visual studio一样了。但是那个东西只支持gdb,所以我希望有一个同等功能的支持pdb的。
    看了你的文章,但是我在linux上,runscript和这个代码都是windows的,我实在没有精力把它调通,只想问问,用起来的效果是怎么样的?可以同时看到代码、pdb窗,并且跟踪当前行吗?就是比如我从一个py文件调用到另一个文件了,能不能自动把另一个文件打开并跟踪到该位置?
    说得比较多,主要是上vim.org找了很久都没发现合适的插件,呵呵

  4. 半瓶墨水说道:

    呵呵就这一段脚本,不可能做到那么强大,只是执行的时候在这些断点停止下来,可以做一些命令行的本地变量查询工作

  5. augix说道:

    我在我的macvim里试了,成功,就是要修改一下runscript里头的python路径设置。我不明白的是,既然装了runscript,为何还要加一段python代码进到_vimrc里头?

  6. 半瓶墨水说道:

    @augix
    放在哪里都行

  7. augix说道:

    我的意思是,有了runscript.vim,它应该可以自动运行了,还要在_vimrc里头加这段代码做什么,你知道这段代码的具体用途吗?

  8. 半瓶墨水说道:

    @augix 知道啊,怎么了?没搞懂你在讲啥

  9. augix说道:

    我不是说博主你不知道,我只是想具体了解这段代码的作用,比如说它怎么工作。我在使用的时候遇到一个问题,就是当我SetBreakpoint的时候,有些时候自动插入的是:pdb.set_trace(),这是对的,但是在有些行的位置上插入,就变成fpdb.set_trace()这样的,反正就是前面加了个字符。我估计是我将runscript.vim从dos文件转换成unix文件的时候,对end of line的处理有问题。

  10. 半瓶墨水说道:

    @augix
    这就是一段Python代码啊,既然你用来debug python,应该不难懂的

  11. augix说道:

    看懂了,第十行应该修改一下
    i += 1
    strWhite += strLine[i]
    这两行应该颠倒一下。

  12. 半瓶墨水说道:

    @augix
    可能你是对的
    这个调试方法我很少用到,没有仔细测过,不知道vim里面是0-based还是1-based

  13. Kevlyn说道:

    The gieuns store called, they’re running out of you.

留下回复