开发者社区> lusing> 正文

Vim技能修炼教程(12) - Vim的脚本语言支持

简介: 用python和ruby写vim扩展的方法
+关注继续查看

Vim的脚本语言支持

本节开始,我们正式接触vimscript这门古老的脚本语言。
首先要说明,vim支持的扩展语言很多,比如python, python3, ruby, lua,tcl等常见脚本语言都有很好的支持。既可以支持脚本内嵌在.vimrc中,也可以执行python等脚本语言的文件。
运行:version命令就可以看到当前的vim发行版本持哪些扩展语言:

VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Jun 22 2017 03:02:45)
MacOS X (unix) version
Included patches: 1-648
Compiled by travis@Traviss-Mac-712.local
Huge version with MacVim GUI.  Features included (+) or not (-):
+acl             +cmdline_compl   +digraphs        +folding         +lambda          +mouse           +multi_lang      +profile         +statusline      +timers          +wildignore
+arabic          +cmdline_hist    +dnd             -footer          +langmap         +mouseshape      -mzscheme        +python/dyn      -sun_workshop    +title           +wildmenu
+autocmd         +cmdline_info    -ebcdic          +fork()          +libcall         +mouse_dec       +netbeans_intg   +python3/dyn     +syntax          +toolbar         +windows
+balloon_eval    +comments        +emacs_tags      +fullscreen      +linebreak       -mouse_gpm       +num64           +quickfix        +tag_binary      +transparency    +writebackup
+browse          +conceal         +eval            -gettext         +lispindent      -mouse_jsbterm   +odbeditor       +reltime         +tag_old_static  +user_commands   -X11
++builtin_terms  +cryptv          +ex_extra        -hangul_input    +listcmds        +mouse_netterm   +packages        +rightleft       -tag_any_white   +vertsplit       -xfontset
+byte_offset     +cscope          +extra_search    +iconv           +localmap        +mouse_sgr       +path_extra      +ruby/dyn        -tcl             +virtualedit     +xim
+channel         +cursorbind      +farsi           +insert_expand   +lua/dyn         -mouse_sysmouse  +perl/dyn        +scrollbind      +termguicolors   +visual          -xpm
+cindent         +cursorshape     +file_in_path    +job             +menu            +mouse_urxvt     +persistent_undo +signs           +terminfo        +visualextra     -xsmp
+clientserver    +dialog_con_gui  +find_in_path    +jumplist        +mksession       +mouse_xterm     +postscript      +smartindent     +termresponse    +viminfo         -xterm_clipboard
+clipboard       +diff            +float           +keymap          +modify_fname    +multi_byte      +printer         +startuptime     +textobjects     +vreplace        -xterm_save

比如我用的macVim,就支持python, python3, ruby, lua, perl等但是不支持tcl.

但是,不管是什么样的vim版本,都一定支持vimscript。我们先看看各种语言的用法,最后还是得学习vimscript

Python语言编写vim插件

:python命令的用法

单行语句可以使用 :python {单行语句}的格式
多行语句使用

:python << EOF
多行python语句
EOF

也可以将python代码写到文件,然后通过:pyfile命令来加载。

首先需要引入vim包:

        :python import vim

执行ex命令

通过vim.command函数执行ex命令:

        :py vim.command(cmd)            # execute an Ex command

例:

:py vim.command(":normal! 2j")

这个大家已经很熟悉了,模拟正常模式下的2个j.

窗口相关

  • vim.current.window: 获取当前窗口
  • vim.windows[n]:获取第n个窗口
        :py w = vim.windows[n]          # gets window "n"
        :py cw = vim.current.window     # gets the current window

获取窗口对象之后,就可以针对窗口进行操作:

  • height属性是窗口高度
  • width: 宽度
  • cursor属性设置光标在窗口中位置
  • buffer: 窗口中的缓冲区
        :py w.height = lines            # sets the window height
        :py w.cursor = (row, col)       # sets the window cursor position
        :py pos = w.cursor              # gets a tuple (row, col)

缓冲区相关

所有的文本都是跟缓冲区相关的。

  • vim.current.buffer可获取当前缓冲区
  • vim.buffers[n] : 获取第n号缓冲区
        :py b = vim.buffers[n]          # gets buffer "n"
        :py cb = vim.current.buffer     # gets the current buffer

获取缓冲区之后,我们就可以对文本进行操作了。

  • name: 缓冲区名字,一般就跟文件名一样
  • append: 添加行
  • mark: 标记一块
  • range: 获取一个范围

缓冲区获取以后,就可以当成数组一样的访问,去处理其中的文本。
如下面的例子:

        :py name = b.name               # gets the buffer file name
        :py line = b[n]                 # gets a line from the buffer
        :py lines = b[n:m]              # gets a list of lines
        :py num = len(b)                # gets the number of lines
        :py b[n] = str                  # sets a line in the buffer
        :py b[n:m] = [str1, str2, str3] # sets a number of lines at once
        :py del b[n]                    # deletes a line
        :py del b[n:m]                  # deletes a number of lines
        :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

current对象

对于大部分情况,我们所操作的都是当前对象:

  • vim.current.line: 当前行
  • vim.current.buffer 当前缓冲区
  • vim.current.window 当前窗口
  • vim.currrent.range 当前选中的范围

python3

python 3.x的支持是另外一个不同的模块。其用法和python基本一致。

ruby语言编写vim插件

来上个例子:

  :ruby print VIM::Window.count 

执行ex命令

        VIM.command(cmd)                      # execute an Ex command

窗口相关

        num = VIM::Window.count               # gets the number of windows
        w = VIM::Window[n]                    # gets window "n"
        cw = VIM::Window.current              # gets the current window
        w.height = lines                      # sets the window height
        w.cursor = [row, col]                 # sets the window cursor position
        pos = w.cursor                        # gets an array [row, col]

缓冲区相关

        num = VIM::Buffer.count               # gets the number of buffers
        b = VIM::Buffer[n]                    # gets buffer "n"
        cb = VIM::Buffer.current              # gets the current buffer
        name = b.name                         # gets the buffer file name
        line = b[n]                           # gets a line from the buffer
        num = b.count                         # gets the number of lines
        b[n] = str                            # sets a line in the buffer
        b.delete(n)                           # deletes a line
        b.append(n, str)                      # appends a line after n
        line = VIM::Buffer.current.line       # gets the current line
        num = VIM::Buffer.current.line_number # gets the current line number
        VIM::Buffer.current.line = "test"     # sets the current line number

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
怎么设置阿里云ECS自定义脚本?
ECS自定义脚本即用户数据是ECS为用户所提供的一种自定义实例启动行为的能力。用户可以在购买实例时输入自定义脚本设置自己的用户数据。用户自定义的脚本通常会在实例购买完成后被执行。 用户数据可以解决很多问题。
1571 0
Spring 5.0.3.RELEASE中的 Kotlin 语言等支持
Spring 5.0.3.RELEASE中的 Kotlin 语言支持 https://docs.spring.io/spring/docs/current/spring-framework-reference/languages.html 返回目录 1. Kotlin Kotlin是静态类型语言定位的JVM(以及其他平台),它允许写简洁而优雅的代码,同时提供很好 的互操作性与Java编写的现有的库。
1177 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
20924 0
+关注
lusing
刘子瑛,阿里系统框架专家。工作十余年,一直对新编程语言、新开发方法、数学与算法相关和并发等相关领域保持浓厚的兴趣。乐于通过技术分享促进新技术。
181
文章
60
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载