vim脚本编程展望

回忆

  • 上次我们彻底研究了vim高亮的原理
  • 各种语法项syntax item

    • 关键字keyword
    • 匹配模式match
    • 区域region
  • 定义好了之后还可以设置链接成组

    • hi def link javaComment Comment
  • 然后就可以在颜色文件中具体配色了

    • 比如murphy中对于Comment的定义
    • hi Comment ctermfg=yellow
  • 不同的语言可以有不同的语法定义
  • 其实,vim也是门语言
  • vimscript也是可以编程的
  • 怎么玩呢?

编写脚本

  • vi oeasy.vim
  • oeasy.vim中写下
  • echo "hello vim script"
  • :w
  • :source %

  • 这就是vim程序的编写和运行的基本方法
  • vim既是编辑器,也是解释器
  • 不过现在vim9script要有一个比较具大的改变
  • 这个改编还要从2014年说起

分支

  • 缘起
  • 2014年vim还处于7.4版
  • Thiago de Arruda为Vim提交了一个补丁,以引入多线程的功能
  • 不过最终没有采纳
  • 于是Thiago创建了一个分支NeoVim,并且筹集到了33万美元的资金
  • 2015年末,Thiago不再领导相关的工作
  • 而且neovim的社会化程度明显比vim高
  • 提交代码的人数多691个人
  • 而且每个人都提交好多代码
  • 不过其实问题也不少

老根的演化

  • vim这边
  • 基本上还是非常稳妥
  • 或者说比较缓慢的运动着
  • 基本上是brammool一个人的世界
  • 有其他的代码提供者
  • 但是都是非常少的代码量
  • 自从2018年开始,neovim的事情无疑刺激了brammool
  • github的提交变得非常活跃

  • 2016年9月12日,brammool提交了vim8
  • vim8支持了异步和timer

vim9

  • Bram Mool是真勤劳啊
  • 谁看得出这位61年出生的老大爷已经进入了花甲之年
  • vim9的项目已经成了只读的档案
  • 现在的新提交的东西都在vim里面
  • 不过我们可以从一些方面看到他对于vim9的企图心

vim9Script

  • 这个新的脚本要加速运行
  • 就要变更原来的一些模式

    • 函数的参数只是名字,而不是来自于字典的东西,类似a:000列表之类的
    • 本地变量不再放在一个字典里
    • 异常处理的细节
  • 速度能有多快呢?

  • 感觉已经是脚本语言的极限了
  • 据说函数是要编译成本地的指令的
  • 而且要义无反顾地做一个不向前兼容的vim9script!!!
  • 而且可以使用类库
  • 总之,我们现在的脚本可能会发生改变
  • 我们还是等vim9script发布出来之后再讲吧

预告

  • 关于vim9现在有个预告

  • 我感觉这脚本离不开vim
  • 而且一定可以很方便地使用缓存buf、寄存器reg、标签tab之类的东西
  • 双方已经上场对战
  • 也许会杀出个第三方比如SpaceVim之类的
  • 本教程先告一段落

总结

  • vim历史悠久
  • neovim前来挑战
  • vim及时调整
  • vim9script令人期待
  • 到底什么时候更新
  • 要等vim9script出来
  • 之后再说!

oeasy教您玩转vim - 91 - # vim脚本编程展望的更多相关文章

  1. oeasy教您玩转vim - 56 - # 字符可视化模式

    ​ 可视化编辑 回忆上节课内容 我们学习了关于模式匹配中使用参数 单个参数 :%s/<h2>\(.*\)</h2>/ - \1/g 多个参数 :%s/<img src=\ ...

  2. oeasy教您玩转vim - 57 - # 行可视化

    ​ 可视化编辑 回忆上节课内容 上次我们了解到可视模式 其实可视化对应三种子模式 字符可视模式 v 行可视模式 大写V 块可视模式ctrl+v 我们先来了解字符可视化模式 快捷键 v 可配合各种mot ...

  3. oeasy教您玩转vim - 53 - # 批量替换

    查找细节 回忆上节课内容 我们温习了关于搜索的相关内容 /正向,?反向 n保持方向,N改变方向 可以设置 是否忽略大写小写 是否从头开始查找 是否高亮显示 还有一些正则表达式的使用方法 行头行尾 ^$ ...

  4. oeasy教您玩转linux010203显示logo

    我们来回顾一下 上一部分我们都讲了什么?

  5. oeasy 教您玩转linux010101查看内核uname

    linux([?l?n?ks]) 是什么????? 咱们这次讲点什么呢?这次咱们讲讲这个 linux([?l?n?ks]),什么是 linux([?l?n?ks])呢?这linux([?l?n?ks] ...

  6. oeasy教您玩转linux010202软件包管理apt

    顾一下 上一部分我们都讲了什么?

  7. oeasy教您玩转linux010201持续输出yes

    我们来回顾一下 上一部分我们都讲了什么?

  8. oeasy教您玩转linux010108到底哪个which

    到底哪个which 回忆上次内容 我们上次讲了查找命令位置whereis 我想找到whereis的位置怎么办?

  9. oeasy教您玩转python - 006 - # hello world

    ​ Hello World! 回忆上次内容 python3 的程序是一个 5.3M 的可执行文件 python3 里面全都是 cpu 指令 可以执行的那种指令 我们可以把指令对应的汇编找到 objdu ...

  10. oeasy教您玩转linux-010110内容回顾

    我们来回顾一下 我们都讲了什么?

随机推荐

  1. Java RMI遇到的Connection refused to Host: 127.x.x.x/192.x.x.x/10.x.x.x问题解决方法

    问题故障解决记录 -- Java RMI Connection refused to host: x.x.x.x .... 在学习JavaRMI时,我遇到了以下情况 问题原因:可能大家的host是10 ...

  2. .net程序员学习java篇一(搭建SSM)

    一.安装IDE 相比于.net环境的一气呵成,java可能麻烦一点,这里记录下来,避免萌新踩坑 1.1安装JDK,这里不要玩什么花哨,老老实实选个大众版(Oracle JDK1.8x),设置环境变量, ...

  3. Vue cli之单文件组件

    组件有两种:脚本化组件.单文件组件 脚本化组件的缺点: html代码是作为js的字符串进行编写,所以组装和开发的时候不易理解,而且没有高亮效果. 脚本化组件用在小项目中非常合适,但是复杂的大项目中,如 ...

  4. 文字转语音 - 搭建微软tts整合web服务提供api接口(免费)

    微软tts是业界公认文字转语音效果最佳本文使用docker搭建微软tts服务并提供api接口对外提供服务对接官方免费在线体验接口,搭建后可免费进行调用使用,不保证永久稳定可用 调用方式url:http ...

  5. 【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)

    在使用App Service服务部署业务应用,因为有些第三方的接口需要调用者携带TLS/SSL证书(X509 Certificate),在官方文档中介绍了两种方式在代码中使用证书: 1) 直接使用证书 ...

  6. scala的基本语法

    区分常量和变量 常量 变量 写一行代码,写多行代码,终端代码 数据类型 byte char short int long float double boolean  数据类型与java相似,但与jav ...

  7. System.lineSeparator()行分隔符的用法

    System.lineSeparator()具体含义 从JDK的源码中,可以看出:它是从JDK1.7之后开始有的这个方法. 在UNIX系统下,System.lineSeparator()方法返回&qu ...

  8. C# .NET Framework EXCEL NPOI EOF in header

    实例化时异常: EOF in header 错误代码: try { workBook = new HSSFWorkbook(file); } catch { try { workBook = new ...

  9. 微信实名认证申请单报错:请求中含有未在API文档中定义的参数

    完整错误: {"code":"PARAM_ERROR","detail":{"location":null," ...

  10. Java反射获取字段的属性值及对比两个对象的属性值null差异赋值,递归算法查找

    package com.example.demo; import java.lang.reflect.Field; /** * 需求描述:同一类的不同对象,如果某个字段的null则从另外的一个对象中赋 ...