vim中的python

1. 判断vim支持python

要判断你的vim是否支持python,可以执行下面命令:

1
$ vim --version | grep python

如果显示的结果中有 +python 的话,你的vim已经支持python,
如果没有的话,你需要重新编译vim,在windows中可以使用下面的命令行,

1
nmake -f Make_mvc.mak FEATURES=huge PYTHON=D:\Python27 PYTHON_VER=27 GUI=yes IME=yes

2. 为什么需要编译支持python的vim

主要的理由有两个,

  1. 可以使用python写的vim插件。
  2. vim 7.4 以后对python的支持进行了增强。

有很多不错的vim 插件,这里给大家推荐一个python-mode, 非常不错。https://github.com/klen/python-mode

vim 7.4 以后对python的支持进行了增强,这个是广大vim注册用户(捐钱的用户)呼声最
高的需求,原话为,

add integration with Python instead of inventing more Vim script

确实现在已经有太多的vim脚本了。vim的主页上的完整需求列表; http://www.vim.org/sponsor/vote_results.php

add IDE features (debugger integration, shell window)

这个是排行老二的需求,不知道什么时侯能实现,期待中…

3. 一些应用举例

3.1 python commands

1
:[range]py[thon] {stmt}

这个命令比较简单,详细解释如下:

range 是标准的vim的range 熟悉vim替换命令的同学应该都不会陌生。range的作用的是指
定python命令影响哪些行,写法为 [行号,行号],比如 1,2 影响第一行和第二行,1,$
影响整个文件。[] 的意思是这个range是可选的默认将影响整个文件。

py[thon]的意思为,python 是命令的全写,可以简写为py。

{stmt} python 语句

可以写上下面命令,输出 Hello

1
:python print "Hello python"

数学不好的同学可以像我一样使用

1
:py print 1+1

将显示结果2 :)

1
2
3
:[range]py[thon] << {endmarker}
{script}
{endmarker}

上面是这个命令是第二种用法,可以直接写python,相当爽,写法很象cat 命令

1
2
3
cat > /tmp/xx << EOF
....
EOF

想用vim查询天气的同学可以参考一下,github上的这个脚本 https://raw.github.com/liqunli/vim-plugin-dev/master/dairy.vim

3.2 pydo

这个命令的格式为, :[range]pydo {body}

vim 中有一个定义好的函数,这个命令将利用这个函数做一些事情

1
2
def _vim_pydo(line, linenr):
{body}

pydo 这个命令同样是以行为单位的,range的用法和上面说的一样。 line 是原始的行,
linenr 是 line number (行号)。大家可以猜一下下面命令的意思,

1
:pydo if line: return "%4d: %s" % (linenr, line)

显示结果大致是这样, 直接用这个文件测试了一下,

1
2
3
4
5
6
55: 将显示结果2  :)


58: :[range]py[thon] << {endmarker}
59: {script}
60: {endmarker}

没有指定range,默认为整个文件,”%4d: %s” % (linenr, line) 这句的意思是,
在每行前加行号,不足4位的数字的用空格补齐

在早些时侯,vim命令要实现这个的效果,需要写一行诡异的命令,

1
:%s/^/\=printf('%4d: ', line('.'))

挑战太大,vim 还专门写了一篇wiki http://vim.wikia.com/wiki/Insert_line_numbers

3.3 pyfile

这条命令的格式为,:[range]pyf[ile] {file}

可以直接使用python 文件,不需要一句一句的输入python 语句了。

1
2
3
4
5
:python from vim import *
:python from string import upper
:python current.line = upper(current.line)
:python print "Hello"
:python str = current.buffer[42]

3.4 python3

命令的格式和python是一样的,不过需要开启 +python3

3.5 vim的python 接口

这个不属于这个小文章的想说的了,写了这成vim的manual了,可以直接参看:
http://vimhelp.appspot.com/if_pyth.txt.html#python-vim

4. 最后

为了避免vim和emacs的圣战,hx 和 lzx等emacs党,可以直接忽视此文 :)

5. 参考资料

http://vimhelp.appspot.com/if_pyth.txt.html


vim中的python
http://usmacd.com/cn/vim_python/
Author
henices
Posted on
September 6, 2013
Licensed under