使用python开发vim插件及心得分享

vim有各种强大的插件,这不仅归功于其提供的用来编写插件的脚本语言vimL,还得益于它良好的接口实现,从而支持python等语言编写插件。当vim编译时带有+python特性时就能使用python2.x编写插件,+python3则支持python3.x,可以使用vim --version来查看vim的编译特性。

要使用python接口,可以用:h python来查看vim提供的帮助文档,本文做一个简单的介绍。我们都知道在vim里可以执行bash命令,只需要:!command即可,那么vim里可以执行python语句吗?当然可以了,vim那么强大!不是吗,是吗?!

vim中执行python命令

在vim中可以使用py[thon] {stmt}来执行python语句{stmt},你可以用:python print "Hello World!"来验证一下。

只能执行一条语句,没什么用,不是吗?所以有更加强大的接口,语法如下:

py[thon] << {endmarker}
{script}
{endmarker}

这样我们就可以执行python脚本{script}中的内容了。{endmarker}是一个标记符号,可以是任何内容,不过{endmarker}后面不能有任何的空白字符。看一个简单的例子,假设下面代码保存为script_demo.vim:

function! Foo()python << EOFclass Foo_demo:    def __init__(self):        print 'Foo_demo init'Foo_demo()EOFendfunction

那么在vim中我们先用:source path_to_script/script_demo.vim来加载脚本,然后就可以用:call Foo()来运行python脚本了,整个过程如图所示:

此外,我们还可以将python脚本放到一个单独的.py文件中,然后用pyf[ile] {file}来运行python文件中的程序,要注意这里pyf[ile]后面的所有参数被看做是一个文件的名字。

vim模块

我们已经可以在vim中执行python命令了,但是python怎么获取vim中的一些信息呢?比如说我想知道vim当前缓冲区一共有多少行内容,然后获取最后一行的内容,用python该怎么做呢?

于是vim提供了一个python模块,有趣的是模块名字就叫做vim,我们可以用它来获取vim编辑器里面的所有信息。上面问题用以下python脚本就可以解决了:

function! Bar()python << EOFimport vimcur_buf = vim.current.bufferprint "Lines: {0}".format(len(cur_buf))print "Contents: {0}".format(cur_buf[-1])EOFendfunction

你可以自己加载脚本运行一下见证奇迹!上面代码出现了vim.current.buffer,想必你已经从名字猜到了它的意思了,不过还是来详细看下吧:

vim模块中的常量

vim.buffers: 用来访问vim中缓冲区的列表对象,可以进行如下操作:

:py b = vim.buffers[i]    # Indexing (read-only):py b in vim.buffers      # Membership test:py n = len(vim.buffers)  # Number of elements:py for b in vim.buffers: # Iterating over buffer list

vim.windows: 用来访问vim中窗口的列表对象,和vim.buffers支持的操作基本相。

vim.current: 用来访问vim中当前位置的各种信息,比如:

vim.current.line
vim.current.buffer
vim.current.window
vim.current.tabpage
vim.current.range

vim.vvars: 类似字典的对象,用来存储global(g:)变量或者vim(v:)变量。

还有其他的一些常量,这里不做叙述。注意这里的常量并不是真正意义上的常量,你可以重新给他们赋值。但是我们应该避免这样做,因为这样会丢失该常量引用的值。现在为止我们已经能获取vim中数据,然后用python来对其进行操作,似乎完美了。

不过vim并没有止步于此,它可是Stronger than Stronger!因为我们可以在python里使用vim强大的命令集,这样就可以用python写一些常用的批处理插件,看下面简单的例子:

function! Del(number)python << EOFimport vimnum = vim.eval("a:number")vim.command("normal gg{0}dd".format(num))vim.command("w")EOFendfunction

可以调用上面函数Del(n)用来删除当前缓冲区前n行的内容(只是示例而已,现实中别这么做!)上面用到了eval和command函数,如下:

vim模块中两个主要的方法

vim.command(str): 执行vim中的命令str(ex-mode,命令模式下的命令),返回值为None,比如:

:py vim.command("%s/aaa/bbb/g")

也可以用vim.command("normal "+str)来执行normal模式下的命令,比如说用以下命令删除当前行的内容:

:py vim.command("normal "+'dd')

vim.eval(str): 用vim内部的解释器来计算str中的内容,返回值可以是字符串、字典、或者列表,比如计算12+12的值:

:py print vim.eval("12+12")

将返回结算结果24。

前面的Del函数还提供了一个number参数,在vimL里面可以通过let arg=a:number来使用,在python中通过vim.eval("a:number")来使用。也可以通过参数位置来访问,比如let arg=a:0或者是vim.eval("a:0")。我们可以使用"..."来代替命名参数来定义一个能接收任意数量参数的函数,不过这样只能通过位置来访问。

vim模块还提供了一个异常处理对象vim.error,使用vim模块时一旦出现错误,将会触发一个vim.error异常,简单的例子如下:

try:    vim.command("put a")except vim.error:    # nothing in register a

vim模块提供的对象

到这里你基本能用python来对缓冲区进行基本的操作,比如删除行或者是在指定行添加内容等。不过在缓冲区添加内容会很不pythoner,因为你得使用command来调用vim的i/I/a/A命令。好在有更科学的方式,那就是利用vim模块提供的对象来进行操作,看下面简单的例子:

function! Append()python << EOFimport vimcur_buf = vim.current.bufferlens = len(cur_buf)cur_buf.append('" Demo', lens)EOFendfunction

Append函数在当前缓冲区的结尾添加注释内容" Demo,缓冲区对象是怎么一会儿事呢?

缓冲区对象

vim模块提供了缓冲区对象来让我们对缓冲区进行操作,该对象有两个只读属性name和number,name为当前缓冲区文件的名称(包含绝对路径),number为缓冲区的数量。还有一个bool属性valid,用来标识相关缓冲区是否被擦除。

缓冲区对象有以下几种方法:

b.append(str): 在当前行的下面插入新的行,内容为str;b.append(str, n): 在第n行的下面插入新的行,内容为str;b.append(list)
b.append(list, n): 插入多行到缓冲区中;b.range(s,e): 返回一个range对象表示缓冲区中s到e行的内容。

注意使用append添加新行str时,str中一定不能包含换行符"\n"。str结尾可以有"\n",但会被忽略掉。

缓冲区对象的range方法会返回一个range对象来代表部分的缓冲区内容,那么range对象又有那些属性以及方法呢? 其实在操作上range对象和缓冲区对象基本相同,除了range对象的操作均是在指定的区域上。range对象有两个属性start和end,分别是range对象的起始和结尾行。它的方法有r.append(str),r.append(str, n)和r.append(list),r.append(list, n)。

我们可以通过vim.windows来获取vim中的窗口对象,我们只能通过窗口对象的属性来对其进行操作,因为它没有提供方法或者其他接口来操作。其中只读属性有buffer、number、tabpage等,读写属性有cursor、height、width、valid等。具体可以查看帮助:h python-window

(0)

相关推荐

  • ruby开发vim插件小结

    在开始编写插件之前,你需要确认 Vim 是否支持 Ruby,通过以下命令来判别: $ vim --version | grep +ruby 如果输出为空,则表示你当前的vim不支持Ruby,需要重新编译一下,并启用对Ruby的支持. 顺便说下我当前的环境是: vim 7.4 ruby 2.1.0 环境检查没有问题那么就开始吧. 在~/.vim/plugin目录下创建一个 demo.vim 文件. 在开头写上以下代码: if !has('ruby') echo "Error: Required v

  • Python 自动补全(vim)

    一.vim python自动补全插件:pydiction 可以实现下面python代码的自动补全: 1.简单python关键词补全 2.python 函数补全带括号 3.python 模块补全 4.python 模块内函数,变量补全 5.from module import sub-module 补全 想为vim启动自动补全需要下载插件,地址如下: http://vim.sourceforge.net/scripts/script.php?script_id=850 https://github

  • PHP语法自动检查的Vim插件

    由于最近写PHP比较多,偶尔手误少写个分号之类的语法错误难免,一般的检查方式是回到命令行运行 php -l ,或者升级一下直接在Vim里运行 :!php -l % ,或者再将此绑定为快捷键,如 :map <F5> :!php -l %<CR> ,每当按F5便可立即执行语法检查.但还是觉得略有不爽,因为很多IDE是实时检查的,语法错误会提示在代码行的旁边.虽然实时检查未必有必要,但自动检查要比手动检查方便的多,比如在php文件保存时自动执行检查. 于是写了这个 phpcheck.vi

  • Android中vim编辑器进阶的使用介绍

    1. 移动指令    (1). h j k l, 方向键,记忆技巧:左右方向的是最左边和最右边的,j向下打了个勾,所以是向下键,剩下的k就是向上的键了.    (2). b, before,上一个单词(词首)           w, word,下一个单词(词首)           e,  end,下一个单词(词尾)    注意这些小写的命令由字母,点,数字,下划线划分,还有这三个对应的大写字母的命令,B,W,E,类似的意思,但是是以空格区分移动的.总而言之,大写的移动范围要大.    (3)

  • linux系统中使用Vim删除偶数行或者奇数行

    删除偶数行的方法如下: :g/^/+1 d 上面用到了:gbobal命令,gbobal命令格式如下: :[range]global/{pattern}/{command} global命令实际上是分成两步执行:首先扫描[range]指定范围内的所有行,给匹配{pattern}的行打上标记:然后依次对打有标记的行执行{command}命令,如果被标记的行在对之前匹配行的命令操作中被删除.移动或合并,则其标记自动消失,而不对该行执行{command}命令.{command}可以是一个ex命令,也可以

  • 手把手教你将Vim改装成一个IDE编程环境(图文) 吴垠

    By: 吴垠 Date: 2007-09-07 Version: 0.5 Email: lazy.fox.wu#gmail.com Homepage: http://blog.csdn.net/wooin Copyright: 该文章版权由吴垠和他可爱的老婆小包子所有.可在非商业目的下任意传播和复制.对于商业目的下对本文的任何行为需经作者同意. 联系方式:lazy.fox.wu#gmail.com 1 写在前面 Linux下编程一直被诟病的一点是: 没有一个好用的IDE, 但是听说Linux牛人

  • VIM中设置php自动缩进为4个空格的方法详解

    代码自然少不了文本编辑利器vim,自动缩进是用制表符的,即便自己删掉制表符改成4个空格,也会在下一层次缩进中继续用制表符,这就造成了空格和制表符混用 可以修改.etc/vimrc的信息: 其中相关变量含义:     变量名     缩写      含义 (no)autoindent  ai   自动缩进,即为新行自动添加与当前行同等的缩进. (no)cindent     ci   类似C语言程序的缩进 (no)smartindent si   基于autoindent的一些改进      变量

  • Windows下利用Gvim写PHP产生中文乱码问题解决方法

    首先:找出乱码产生的原因. 一直以为是浏览器的原因,结果我在chrome,firefox,IE9里面都出现了乱码,所以浏览器的因素可以排除.为了验证我猜测是Gvim的原因, 我用记事本(note)简单写了一个php文件 复制代码 代码如下: <?php echo "你好"; echo "世界"; ?> 结果没有出现乱码,所以问题就出在Gvim上,这个结论水到渠成. 于是,开始研究Gvim的配置文件(_vimrc), 现在给大家看一下我产生乱码之前的配置(

  • Vim进行文件目录操作小结

    一.当前文件名 我们知道Vim有48个寄存器,其中%只读寄存器中保存着当前文件路径. 例如在/home/harttle/下打开src/main.cpp,我们打印%的值: :echo @% " 文件路径 src/main.cpp 通过关键字展开可得到绝对路径.所在目录等信息: :echo expand('%:t') " 文件名 main.cpp :echo expand('%:p') " 绝对路径 /home/harttle/src/main.cpp :echo expand(

  • 使用python开发vim插件及心得分享

    vim有各种强大的插件,这不仅归功于其提供的用来编写插件的脚本语言vimL,还得益于它良好的接口实现,从而支持python等语言编写插件.当vim编译时带有+python特性时就能使用python2.x编写插件,+python3则支持python3.x,可以使用vim --version来查看vim的编译特性. 要使用python接口,可以用:h python来查看vim提供的帮助文档,本文做一个简单的介绍.我们都知道在vim里可以执行bash命令,只需要:!command即可,那么vim里可以

  • 基于Python开发chrome插件的方法分析

    本文实例讲述了基于Python开发chrome插件的方法.分享给大家供大家参考,具体如下: 谷歌Chrome插件是使用HTML.JavaScript和CSS编写的.如果你之前从来没有写过Chrome插件,我建议你读一下这个.在这篇教程中,我们将教你如何使用Python代替JavaScript. 创建一个谷歌Chrome插件 首先,我们必须创建一个清单文件:manifest.json. { "manifest_version": 2, "name": "Py

  • 基于twbsPagination.js分页插件使用心得(分享)

    项目中之前需要分页插件,以前用的都是单纯叫做pagenation.js的插件,但是这次集成的时候,项目组一个孩纸用了这个插件,结合网上的例子琢磨了一把.其实大致流程都是相同的,主要将我在用这个分页插件的一些心得分享出来: 1.分页插件引入html中需要: bootstrap.css 分页插件js 自己写的分页的样式css[如果不用,也可以直接用bootstrap所带的分页css.] 使用jquery可以引入jquery.js html中: <script type="text/javasc

  • 使用mint-ui开发项目的一些心得(分享)

    Mint-ui: 1.Cell 开发过程中,有时需要修改mt-cell自带的icon和value的标签样式,这时我们可以在<mt-cell></mt-cell>内新添如下标签进行改写: <si-cell class="user-cell item-cell" title="当前产品" to="/selectproduct" is-link> <i class="siiconfont siicon

  • 使用Python编写vim插件的简单示例

    Vim 插件是一个 .vim 的脚本文件,定义了函数.映射.语法规则和命令,可用于操作窗口.缓冲以及行.一般一个插件包含了命令定义和事件钩子.当使用 Python 编写 vim 插件时,函数外面是使用 VimL 编写,尽管 VimL 学起来很快,但 Python 更加灵活,例如可以用 urllib/httplib/simplejson 来访问某些 Web 服务,这也是为什么很多需要访问 Web 服务的插件都是使用 VimL + Python 编写的原因. 在开始编写插件之前,你需要确认 Vim

  • 详解如何使用Python编写vim插件

    前言 vim是个伟大的编辑器,不仅在于她特立独行的编辑方式,还在于她强大的扩展能力.然而,vim自身用于写插件的语言vimL功能有很大的局限性,实现功能复杂的插件往往力不从心,而且运行效率也不高.幸好,vim早就想到了这一点,她提供了很多外部语言接口,比如Python,ruby,lua,Perl等,可以很方便的编写vim插件.本文主要介绍如何使用Python编写vim插件. 准备工作 1. 编译vim,使vim支持Python 在编译之前,configure的时候加上--enable-pytho

  • 利用Vscode进行Python开发环境配置的步骤

    前言 Vscode是是一个强大的跨平台工具,我自己电脑是mac,公司电脑是win而且是内部环境,导致公司安装软件很费劲.好在vscode许多插件能直接离线安装,省去了很多麻烦. Vscode用来写python其实并不算太友好,它不像Pycharm那样将所有事情都做好,你只需要敲代码就可以.初次使用Vscode可能会对一堆配置文件感到头大,其实仔细阅读官方设置文档,能解决大部分问题.但是官方文档也有说不清的地方,所以在此分享下我自己用Vscode配置Python开发环境的一些心得. 插件 首先,你

  • Python开发的实用计算器完整实例

    本文实例讲述了Python开发的实用计算器.分享给大家供大家参考,具体如下: 实现功能:图形界面PyQt,输入框,+,-,*,/ :乘方 ,开方 ,取余,清零. 1. Python代码: #!/usr/bin/env python # -*- coding: utf-8 -*- ''' Author : Mr.LiuYC Created on 2014-09-30 E-Mail : liuyanchen0725@gmail.com Introduction: 简易计算器 实现图形界面PyQt,输

  • 教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码

    一.Python下载安装 1.Python官方下载地址:https://www.python.org/downloads 官方下载速度太慢,你可以到公众号"Python客栈"回复"python"下载,里面包括python2与python3所有版本,速度非常快 二.安装Sublime Text 3 Sublime Text 3官方下载地址:http://www.sublimetext.com/3 1.双击下载的.exe文件安装,安装路径不要有中文目录 2.安装Subl

随机推荐