位置: 编程技术 - 正文

详解如何使用Python编写vim插件(用pyth)

编辑:rootadmin

推荐整理分享详解如何使用Python编写vim插件(用pyth),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:py怎么使用,pypi怎么用,py怎么使用,详解如何使用pcem安装windows 98 csdn,详解如何使用pcem安装windows 98 csdn,pypi怎么用,pypy如何使用,详解如何使用pcem安装windows 98 csdn,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

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

准备工作

1. 编译vim,使vim支持Python

在编译之前,configure的时候加上--enable-pythoninterp和--enable-python3interp选项,使之分别支持Python2和Python3 编译好之后,可以通过vim --version | grep +python来查看是否已经支持Python,结果中应该包含+python和 +python3,当然也可以编译成只支持Python2或Python3。

现在好多平台都有直接编译好的版本,已经包含Python支持,直接下载就可以了:

Windows:可以在这里下载。 Mac OS:可以直接brew install vim来安装。 Linux:也有快捷的安装方式,就不赘言了。

2. 如何让Python能正常工作

虽然vim已经支持Python,但是可能:echo has("python")或:echo has("python3")的结果仍是0,说明Python还不能正常工作。 此时需要检查:

系统上是否装了Python&#; Python是位还是位跟vim是否匹配&#; Python的版本跟编译时的版本是否一致(编译时的版本可以使用:version查看) 通过pythondll和pythonthreedll来分别指定Python2和Python3所使用的动态库。

例如,可以在vimrc里添加

经此4步,%能让Python工作起来,剩下的1%就看人品了。

补充一点:

对于neovim,执行

就可以添加Python2和Python3的支持,具体参见:h provider-python。

从hello world开始

在命令行窗口执行:pyx print("hello world!"),输出“hello world!”,说明Python工作正常,此时我们已经可以使用Python来作为vim的EX命令了。

操作vim像vimL一样容易

怎么用Python来访问vim的信息以及操作vim呢?很简单,vim的Python接口提供了一个叫vim的模块(module)。vim模块是Python和vim沟通的桥梁,通过它,Python可以访问vim的一切信息以及操作vim,就像使用vimL一样。所以写脚本,首先要import vim。

vim模块

vim模块提供了两个非常有用的函数接口:

vim.command(str)

执行vim中的命令str(ex-mode),返回值为None,例如:

vim.eval(str)

求vim表达式str的值,(什么是vim表达式,参见:h expr),返回结果类型为:

string: 如果vim表达式的值的类型是string或number list:如果vim表达式的值的类型是一个vim list(:h list) dictionary:如果vim表达式的值的类型是一个vim dictionary(:h dict)

例如:

vim模块还提供了一些有用的对象:

Tabpage对象(:h python-tabpage) 一个Tabpage对象对应vim的一个Tabpage。 Window对象(:h python-window) 一个Window对象对应vim的一个Window。 Buffer对象(:h python-buffer) 一个Buffer对象对应vim的一个buffer,Buffer对象提供了一些属性和方法,可以很方便操作buffer。

例如 (假定b是当前的buffer) :

vim.current对象(:h python-current)

vim.current对象提供了一些属性,可以方便的访问“当前”的vim对象

属性 含义 类型 vim.current.line The current line (RW) String vim.current.buffer The current buffer (RW) Buffer vim.current.window The current window (RW) Window vim.current.tabpage The current tab page (RW) TabPage vim.current.range The current line range (RO) Range

python访问vim中的变量

访问vim中的变量,可以通过前面介绍的vim.eval(str)来访问,例如:

但是, 还有更pythonic的方法:

预定义vim变量(v:var)

可以通过vim.vvars来访问预定义vim变量,vim.vvars是个类似Dictionary的对象。例如,访问v:version:

全局变量(g:var)

详解如何使用Python编写vim插件(用pyth)

可以通过vim.vars来访问全局变量,vim.vars也是个类似Dictionary的对象。例如,改变全局变量g:global_var的值:

tabpage变量(t:var)

例如:

window变量(w:var)

例如:

buffer变量(b:var)

例如:

python访问vim中的选项(options)

访问vim中的选项,可以通过前面介绍的vim.command(str)和vim.eval(str)来访问,例如:

当然, 还有更pythonic的方法:

全局选项设置(:h python-options)

例如:

注意:如果是window-local或者buffer-local选项,此种方法会报KeyError异常。对于window-local和buffer-local选项,请往下看。

window-local选项设置

例如:

buffer-local选项设置

例如:

两种方式写vim插件

内嵌式

{script}中的内容为Python代码,{endmarker}是一个标记符号,可以是任何字符串,不过{endmarker}前面不能有任何的空白字符,也就是要顶格写。

例如,写一个函数,打印出当前buffer所有的行(Demo.vim):

运行:source %查看结果。

独立式

把Python代码写到*.py中,vimL只用来定义全局变量、map、command等,LeaderF就是采用这种方式。个人更喜欢这种方式,可以把全部精力集中在写Python代码上。

异步

多线程

可以通过Python的threading模块来实现多线程。但是,线程里面只能实现与vim无关的逻辑,任何试图在线程里面操作vim的行为都可能(也许用“肯定会”更合适)导致vim崩溃,甚至包括只读一个vim选项。虽然如此,也比vimL好多了,毕竟聊胜于无。

subprocess

可以通过Python的subprocess模块来调用外部命令。

例如:

也就是说,从支持Python起,vim就已经支持异步了(虽然直到vim7.4才基本没有bug),Neovim所增加的异步功能,对用Python写插件的小伙伴来说,没有任何吸引力。好多Neovim粉竟以引入异步(job)而引以为傲,它什么时候能引入真正的多线程支持我才会服它。

案例

著名的补全插件YCM和模糊查找神器LeaderF都是使用Python编写的。

缺陷

由于GIL的原因,Python线程无法并行处理;而vim又不支持Python的进程( return line[::-1]

总结

以上只是简单的介绍,更详细的资料可以参考:h python。希望对大家的学习有所帮助,也希望大家多多支持积木网。

JSONLINT:python的json数据验证库实例解析 JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,易于人阅读和编写。JSON函数使用JSON函数需要导入json库:importjson。函数描述json.dumps将Python对象编

基于Python函数的作用域规则和闭包(详解) 作用域规则命名空间是从名称到对象的映射,Python中主要是通过字典实现的,主要有以下几个命名空间:内置命名空间,包含一些内置函数和内置异常

对变量赋值的理解--Pyton中让两个值互换的实现方法 #Pyton中让两个值互换的实现方法#方法一:可以理解为相当于是同时赋值a=5b=4a,b=b,aprint(a,b)#方法二:可以理解为拿箱子过程c=d=e=c#定义第三个人e,将箱

标签: 用pyth

本文链接地址:https://www.jiuchutong.com/biancheng/375459.html 转载请保留说明!

上一篇:从头学Python之编写可执行的.py文件(编程python怎么学)

下一篇:JSONLINT:python的json数据验证库实例解析

  • 机票抵扣进项税怎么填申报表
  • 未达起征点的增值税怎么账务处理
  • 独资企业和公司的优缺点
  • 暂估入库发票回收怎么办
  • 自然人税收管理系统怎么申报个税
  • 作为一个财务 月末要做什么
  • 计提贷款损失准备金遵循以下原则
  • 企业收到供货单位提供的材料,如其价款大于
  • 融资租赁开始日最低租赁付款额
  • 批发零售企业用什么软件好
  • 营改增后营业外收入交增值税吗?
  • 手撕税票去哪可以弄到
  • 如何冲销账面上的资金
  • 哪些外籍个人应在中国缴纳个税?
  • 建筑行业外经证办理步骤
  • 合作经营收入分成发票税务名称怎么填
  • 定金转为货款如何表述
  • 企业的营业外收入包括
  • 合同资产和工程存货的区别
  • 工程发票预交税金规定
  • win11怎么取消开机启动项
  • 收到地税退税会计分录
  • 合同的情势变更是什么
  • 技术合同指什么
  • qdcsfs.exe - qdcsfs是什么进程 有何作用
  • 股权转让协议解除返还股权优先权
  • 农场新区
  • 销售多余材料计入什么
  • 进口增值税的账务处理
  • 赔偿金和违约金有什么区别
  • PHP:imagecolorset()的用法_GD库图像处理函数
  • 董事费如何计算个人所得税
  • 相见恨晚求下联
  • 滑模控制理论与应用研究pdf
  • ip和以太网的区别
  • js 字符串 中 字符位置
  • 残保金工资标准
  • 销售自用的小汽车赚钱吗
  • 审核出错问题在谁
  • 公司账户收款退回怎么查
  • SQLserver数据库的while附近有语法错误,应为AS
  • 开业前需要支出什么费用
  • 一般纳税人年收入500万交多少税
  • 计提法定盈余公积是什么意思
  • 深圳增值税普通发票和专用发票的区别
  • 固定资产正常报废与非正常报废的会计处理基本相同
  • 待抵扣进项税计入其他应付账款吗
  • 疫情防控期间临时性工作补助申请
  • 税收优惠退回的税金怎么入账
  • 一般纳税人只有销项没有进项
  • 房屋租赁产生的税费叫什么
  • 银行承兑汇票进行贴现的会计分录
  • 出售无形资产净损失
  • 兼职人员属于雇佣人吗
  • 其他综合收益转出
  • 发票红冲后原票是什么状态
  • 联营企业和子公司哪个好
  • 汽车租赁公司成本
  • 现金流水账怎么做表格
  • 冲销以前年度多计提的折旧
  • 复式记账法的特点不包括
  • sql多表关联修改操作
  • sql中where语句的写法
  • win9怎么升级win10
  • Vista技巧:何在Vista上运行不兼容的旧版本软件
  • win7如何新建用户
  • linux的问题
  • windowsxp教程
  • linux统计代码行数过滤空行
  • 苹果mac系统关机怎么关
  • cocos2dx运行原理
  • linux中shell脚本编写
  • 怎么学node.js
  • 细说javascript
  • javascript总结笔记
  • 用javascript
  • jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
  • Android中使用HttpURLConnection和HttpClient实现GET和POST请求访问网络
  • 深入python3
  • 公务员车补缴个税吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设