2012年1月22日 星期日

Python IDE(Vim)

网上已经有一个类似的,也很全(http://blog.dispatched.ch/2009/05/24/vim-as-python-ide/)
蛮完整的,我简单谈一下我的使用感受.
我的.vimrc是按照amix的终极配置改的.其中的保存python后,删除空白很有效.
然后为了编辑python,我按照所附链接下载了以下插件:minibuffer,和Taglist,两个都很好用,没有问题.然后我想方便autocompletion,于是又装了supertab,结果tab不出completion,很让人恼火.后来发现,我按照amix的装了一个snipMate的插件,与之冲突了.觉得我还是喜欢自己敲代码,就把snipMate删了.终于可以tabcompletion了.
作为IDE,最重要的是能够debug,然而我试了文中提到的Vimpdb,无论如何无法使其工作.首先是文档格式问题,我照着网上的使用dos2unix转换了两个文件,但是,之后,我试着debug这个插件,发现对我这个python菜鸟来说,太繁复了,不想浪费时间.顺便一提,这个插件的作者编码的习惯不好,缩进是用tab键而不是4空格.当我试图插入自己的代码时,总是报错,发现就是源于他使用的tab缩进导致的.用vim自带的retab解决问题.但是实在没心思再debug了.网上很多人也抱怨这个插件的.
于是google了,发现一些walkaround,试了几个,都不怎么好用.(Vimdebug...),
发现可行的办法是,直接使用pdb得了,然后在代码里添上pdb.set_trace()设定端点,然后pdb下调试.无可奈何阿.不过还是想偷点懒,找到别人的.vimrc(http://www.2maomao.com/blog/win32-vim-debug-python/),思路就是快捷添加set_trace(),或者快捷删除set_trace()取消端点,然后设定快捷运行程序启动pdb(:!python %),我略微修改了map,使用f2设断点,f3取消断点,f5运行,似乎找到了以前写c作业的感觉.
我发现作者写得时候或者po上网的时候,出现了一个bug:
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 :py SetBreakpoint()')

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 :py RemoveBreakpoints()')
vim.command( 'map :!python %')
EOF

其中,开头的i+=1(红色粗体)应该和后面一行对调,string的开始是从0开始,而不是1.总得来所,作者写得挺好的,也挺好用的,在此写过.
不过我觉得在gvim下pdb似乎会有点问题,其他buffer会不更新,僵在那.要么编辑就在gvim,debug还是在另开窗口在terminal下比较好.Debug似乎不是Vim的强项,首先他是个文本编辑器.
另外,推荐一下Vim配色,molokai,很有现代感,但是可能颜色太鲜艳.

沒有留言:

張貼留言