广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解如何使用Python编写vim插件
  • 488
分享到

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

如何使用详解插件 2022-06-04 19:06:23 488人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

前言 vim是个伟大的编辑器,不仅在于她特立独行的编辑方式,还在于她强大的扩展能力。然而,vim自身用于写插件的语言vimL功能有很大的局限性,实现功能复杂的插件往往力不从心,而且运行效率也不高。幸好,vi

前言

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是32位还是64位跟vim是否匹配? Python的版本跟编译时的版本是否一致(编译时的版本可以使用:version查看) 通过pythondll和pythonthreedll来分别指定Python2和Python3所使用的动态库。

例如,可以在vimrc里添加


set pythondll=/Users/yggdroot/.python2.7.6/lib/libpython2.7.so

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

补充一点:

对于neovim,执行


pip2 install --user --upgrade neovim
pip3 install --user --upgrade 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,例如:


:py vim.command("%s/s+$//g")
:py vim.command("set shiftwidth=4")
:py vim.command("nORMal! dd")

vim.eval(str)

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

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

例如:


:py sw = vim.eval("&shiftwidth")
:py print vim.eval("expand('%:p')")
:py print vim.eval("@a")

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) :


:py print b.name   # write the buffer file name
:py b[0] = "hello!!!"  # replace the top line
:py b[:] = None    # delete the whole buffer
:py del b[:]    # delete the whole buffer
:py b[0:0] = [ "a line" ] # add a line at the top
:py del b[2]    # delete a line (the third)
:py b.append("bottom")  # add a line at the bottom
:py n = len(b)    # number of lines
:py (row,col) = b.mark('a') # named mark
:py r = b.range(1,5)  # a sub-range of the buffer
:py b.vars["foo"] = "bar" # assign b:foo variable
:py b.options["ff"] = "dos" # set fileformat
:py del b.options["ar"]  # same as :set autoread<

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)来访问,例如:


:py print vim.eval("v:version")

但是, 还有更pythonic的方法:

预定义vim变量(v:var)

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


:py print vim.vvars["version"]

全局变量(g:var)

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


:py vim.vars["global_var"] = 123

tabpage变量(t:var)

例如:


:py vim.current.tabpage.vars["var"] = "Tabpage"

window变量(w:var)

例如:


:py vim.current.window.vars["var"] = "Window"

buffer变量(b:var)

例如:


:py vim.current.buffer.vars["var"] = "Buffer"

python访问vim中的选项(options)

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


:py vim.command("set shiftwidth=4")
:py print vim.eval("&shiftwidth")

当然, 还有更pythonic的方法:

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

例如:


:py vim.options["autochdir"] = True

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

window-local选项设置

例如:


:py vim.current.window.options["number"] = True

buffer-local选项设置

例如:


:py vim.current.buffer.options["shiftwidth"] = 4

两种方式写vim插件

内嵌式


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

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

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


function! Demo()
py << EOF
import vim
for line in vim.current.buffer:
 print line
EOF
endfunction
call Demo()

运行:source %查看结果。

独立式

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

异步

多线程

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

subprocess

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

例如:


:py import subprocess
:py print subprocess.Popen("ls -l", shell=True, stdout=subprocess.PIPE).stdout.read()

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

案例

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

缺陷

由于GIL的原因,Python线程无法并行处理;而vim又不支持Python的进程(https://GitHub.com/vim/vim/issues/906),计算密集型任务想利用多核来提高性能已不可能。

奇技淫巧

把buffer中所有单词首字母变为大写字母


:%pydo return line.title()

把buffer中所有的行镜像显示

例如,把


vim is very useful
123 456 789
abc def ghi
who am I

变为


lufesu yrev si miv
987 654 321
ihg fed cba
I ma ohw

可以执行此命令::%pydo return line[::-1]

总结

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

--结束END--

本文标题: 详解如何使用Python编写vim插件

本文链接: https://www.lsjlt.com/news/15827.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解如何使用Python编写vim插件
    前言 vim是个伟大的编辑器,不仅在于她特立独行的编辑方式,还在于她强大的扩展能力。然而,vim自身用于写插件的语言vimL功能有很大的局限性,实现功能复杂的插件往往力不从心,而且运行效率也不高。幸好,vi...
    99+
    2022-06-04
    如何使用 详解 插件
  • SQLMAP插件tamper编写与使用详解
    目录一、SQLMAP插件tamper简介二、SQLMAP插件tamper使用三、SQLMAP插件tamper编写今天继续给大家介绍渗透测试相关知识,本文主要内容是SQLMAP插件tamper编写与使用。 免责声明:本文所...
    99+
    2022-08-26
  • 如何使用Vim编写和调试Python代码
    如何使用Vim编写和调试Python代码 要想在Ubuntu下使用VIM编写和调试Python代码,请下安装如下的链接进行配置: https://segmentfault.com/a/1190000003962806   ...
    99+
    2023-01-31
    如何使用 代码 Vim
  • 如何使用V8编写C++插件
    本篇内容介绍了“如何使用V8编写C++插件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!写个测试例子const { De...
    99+
    2023-06-15
  • 如何使用Linux系统Vim编辑器来安装YouCompleteMe插件
    本篇内容主要讲解“如何使用Linux系统Vim编辑器来安装YouCompleteMe插件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Linux系统Vim编辑器来安装YouComplet...
    99+
    2023-06-12
  • 在Linux系统中使用Vim读写远程文件的命令详解
    设定vim的工作方式(临时)  :set (模式信息)  :set nu — 显示行号  :set nonu — 取消行号  :set mouse=a — 设定鼠标可用  :set cursorline — 设定显...
    99+
    2022-06-03
    linux使用vim读写远程文件 linux 读写远程文件
  • 用python编写一个小程序,如何用python编写软件
    大家好,给大家分享一下用python编写一个小程序,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 1、python可以写手机应用程序吗? 我想有人曲解意思了,人家说用python开发渣蔽一个手机app,不是说用手机敲写py...
    99+
    2023-10-22
    python
  • 图文详解Python如何导入自己编写的py文件
    目录一. 想要实现的效果二. 实现的方法三. 进阶用法四. 使用_init_.py控制导入某文件夹时执行的操作总结一. 想要实现的效果 新建文件夹将自编模块集中管理 可在其它py文件...
    99+
    2022-11-12
  • 如何通过VSCode RTOS插件使用Python为物联网系统编写程序
    本篇文章给大家分享的是有关如何通过VSCode RTOS插件使用Python为物联网系统编写程序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。RTOS 之类的实时嵌入式操作系统...
    99+
    2023-06-16
  • Python中PyDev插件如何使用
    Python中PyDev插件如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。验证是否成功安装 PyDev如何才能验证 Eclipse Update Manager 是否已...
    99+
    2023-06-17
  • 如何使用ES6写全屏滚动插件
    这篇文章主要为大家展示了“如何使用ES6写全屏滚动插件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用ES6写全屏滚动插件”这篇文章吧。1)前面的话现在已...
    99+
    2022-10-19
  • python 详解如何写flask文件下载接口
    简述 写一个简单的flask文件下载接口。 依赖 flask、gevent 代码 不废话上代码。 #!/usr/bin/env python3 # -*- coding: utf...
    99+
    2022-11-12
  • 如何使用Python编写npm load?
    Node.js是一个非常流行的JavaScript运行时环境,而npm则是Node.js的包管理器。它允许开发人员轻松地共享和复用代码,使得构建Web应用程序变得更加容易和高效。但是,有时候在使用npm时会遇到一些问题,例如加载时间过长或...
    99+
    2023-06-20
    教程 npm load
  • 如何编写Shell脚本使Nagios插件监控程序资源占用
    本篇内容主要讲解“如何编写Shell脚本使Nagios插件监控程序资源占用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何编写Shell脚本使Nagios插件监控程序资源占用”吧!一、shel...
    99+
    2023-06-09
  • 如何使用Python编写小游戏?
    大家好,我是沐尘而生,如果你是一个热爱编程的小伙伴,又想尝试游戏开发,那么这篇文章一定能满足你的好奇心。不废话,让我们马上进入Python游戏开发的精彩世界吧! Python游戏开发的魅力 编写小游...
    99+
    2023-08-31
    python pygame 开发语言
  • 如何在Django文件中使用Python编写高效算法?
    Django是一个流行的Python Web框架,它提供了许多有用的工具和库,使得Web开发变得更加容易。在使用Django开发Web应用程序时,我们经常需要编写算法来处理数据。在本文中,我们将探讨如何在Django文件中使用Python编...
    99+
    2023-06-20
    文件 django 编程算法
  • 如何使用Python编写算法来操作对象文件?
    Python是一种高级编程语言,它可以用于各种目的,包括创建和操作对象文件。对象文件是一种二进制文件,其中包含用于编译程序的目标代码。Python提供了许多库和函数,可以轻松地读取、写入和操作对象文件。在本文中,我们将介绍如何使用Pyth...
    99+
    2023-07-30
    对象 文件 编程算法
  • 如何在 leetcode 上使用 Python 编写文件操作算法?
    Leetcode 是一个非常流行的在线编程练习网站,拥有各种难度的算法问题。Python 作为一种流行的编程语言,也是 leetcode 上最受欢迎的编程语言之一。在 leetcode 上编写文件操作算法,可以帮助我们更好地了解 Pyth...
    99+
    2023-07-23
    编程算法 leetcode 文件
  • 你知道如何用Python编写Unix接口吗?学习笔记详解!
    Python是一种强大的编程语言,它可以用于编写各种类型的应用程序。在Unix系统中,Python也是非常有用的一种语言,因为它可以用于编写Unix接口。在本篇文章中,我们将学习如何使用Python编写Unix接口。 首先,让我们了解Uni...
    99+
    2023-10-15
    unix 学习笔记 接口
  • 如何使用Python编写实时接口?
    当今时代,实时接口已成为许多应用程序和服务的重要组成部分。实时接口能够让应用程序在与用户交互时更加迅速地响应,提供更好的用户体验。Python 是一种流行的编程语言,也是编写实时接口的一种强大工具。在本文中,我们将介绍如何使用 Python...
    99+
    2023-08-20
    文件 实时 接口
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作