`
jzhihui
  • 浏览: 268131 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Windows下vimerl的配置以及扩展

阅读更多

 

最近开始学习Erlang,一方面出于对其主要语言特征(高并发)的兴趣,另一方面,当前项目的压力测试希望用Tsunghttp://tsung.erlang-projects.org/,基于Erlang,很好的压力测试工具)来做,而当前Tsung的协议支持还不能满足我们的要求(XMPP over Websocket),所以希望对其进行扩展(下一篇会讲到Tsung的具体扩展实现)。当然,学习一门语言就需要一个简单方便的工具来进行一些简单的实验。一开始试用了下Erlidehttp://erlide.org/),但是配起来后,发现保存文件的时候有时候不会自动编译,然后运行一次程序会开一个新的Erlang交互进程,总觉得不太舒服,就放弃了。然后,对vim也挺有兴趣的,就开始配置使用vimerlhttps://github.com/jimenezrick/vimerl)。

 

为了方便,直接下了个Window版的vim,装好后安装vim-pathogen(方便管理vim插件的工具,https://github.com/tpope/vim-pathogen),按vim-pathogen的说明,在vimfilesWindows下)目录下新建了个bundle目录,然后git clone https://github.com/jimenezrick/vimerl。新建个简单的Erlang文件,修改,保存...

… Windows下的cmd窗口一闪而过,也不知道发生什么事情,也不太了解vim的插件工作机制,可一有点是好的,就是有vimerl的源代码,然后就开始苦逼的开始研究它的代码,经过各种调试(对一个从没接触vim脚本,也没写过Erlang程序的苦逼程序员来说,这个时间稍微有点长),最后问题定位在保存文件后,调用外部程序来编译Erlang文件的命令上,源代码如下(vimerl\compiler\erlang.vim):

[1]    execute "setlocal makeprg=" . s:erlang_check_file . "\\ \%"

其中s:erlang_check_file=vimerl\compiler\erlang_check.erl,看了下这个文件的内容:调用Erlangcompile:file来编译一个Erlang源代码文件,并返回编译结果。上面那条命令的主要作用MS就是想调用Erlang的编译器来编译当前的文件,并把结果反馈回vim,但是没有成功。但是,在上条命令的上面有一条类似的命令:

[2]    setlocal makeprg=escript\ -s\ %%代表当前文件)

先不管其它的,看看这个escript程序是干什么的,Google后了解到,这个程序提供的功能跟Linux下的bash一样,可以执行一个标记为Erlang Script(通过#!/usr/bin/env escript来实现,具体可查看vimerl\compiler\erlang_check.erl)的文件。那么命令[1]的目的就是想通过escript程序来执行erlang_check.erl来编译程序,但在Windows下调用没有成功(在Linux下,这个应该不会是问题),问题查明后,修改也就很简单了:

[3]    execute "setlocal makeprg=" . "escript.exe\\ " . s:erlang_check_file . "\\ \%"

修改后,再保存,有编译错误时,可正确在vim的状态栏提示,OK

 

         再看一下,发现vimerl还有自动补全的功能,输入Erlang模块名后(erlang:lists:的形式),按Ctrl+X+O后,会出现提出列表。不过这个功能需要先安装Erlangman文档,从官网下载后安装。再打开一个Erlang源文件,按下Ctrl+X+O… ,也有问题,不过这次的错误比较明显,找不到grep程序: vimerl\autoload\erlang_complete.vimWindow下当然没有grep程序,不过还好有个Window下的开源Grep实现(http://gnuwin32.sourceforge.net/packages/grep.htm),下载安装后,再修改vimerl中相应的参数(let g:erlang_completion_grep = 'Grep'),不过这样还不是不能正常工作,主要是vimerl中使用grep的主要目的是从Erlangman文件中搜索函数定义,但使用的匹配模式是类似/man?/lists.?/(熟悉Linux的都应该知道man文档一般会有好几个目录,以数字区分,比如man1,man2等等,而同一个函数也会有类似的形式lists.1lists.2,当然这里的lists代表Erlang里的模块)的形式,在Linux下,这种模式可以 正确的工作,但是在Windows下,这种形式无法工作,会提示/man?/文件不存在的错误。其实也就是说Windows下的Grep不能递归匹配,那怎么解决呢,只有先找到man的正确目录,在调用Grep去匹配,这样就需要一个类似Linuxfind命令的程序来找到正确的man目录。还好,有个Windows版的findutilshttp://gnuwin32.sourceforge.net/packages/findutils.htm),安装后,再按上面的思路修改erlang_complete.vim相关实现(代码见后面说明),再试,终于OK

 

         功能是好了,不过进行自动补全时,对同一个模块,如果重新打开一个Erlang源文件,vimerl会重新进行匹配,在Linux下问题可能不是很大,但在Windows下,那个cmd窗口每次就不停的弹出,一般一个模块有多少个函数就弹多少次(Linux下没有这个问题,在cmd命令下使用vim也不会有这个问题),多少让人有点烦恼;而且每次打开一个新文件,都重新查找同一个模块的匹配,从速度上来说,也无法忍受。要加快速度,最简单的办法就是加缓存:一个模块在第一次匹配后,将匹配结果缓存到磁盘,并且在打开一个Erlang源文件时,从磁盘加载缓存的匹配结果,这样,在下一次匹配同一个模块时,就直接从缓存里匹配。

加快匹配速度后,还有一个问题,就是在没有Erlang模块名做前缀的情况下,vimerl会尝试从当前模块,或者同一目录下的其它模块匹配函数名(本地函数)。用过Eclipse的同学都知道,这时候,我可能想输入的并不是当前模块(或者同一目录下的其它模块内)的函数名,可能想输入一个内置函数名(ErlangBIFs)或者也有可能只是想输入一个模块名。

有了这些想法就着手实现,缓存放在vimerl\autoload\ erlang_index中,每一行对应一个模块中的函数列表:模块名为键,函数列表为值。在保存一个Erlang源文件编译时,会先加载缓存,然后从缓存中匹配。在加载缓存时,会自动生成一个以module为键,所有已缓存的模块名列表为值的对象,在进行本地函数名(不带模块名的形式)匹配时,先按照默认的方式匹配,再匹配模块名,然后再匹配BIFs,最后将三者的结果都加入到匹配结果列表中。

         总体的实现就是这样的,上述的修改和扩展都可以在我的github上找到(https://github.com/onlychoice/vimerl/tree/win-vimerl )找到,欢迎有兴趣的同学下载试用,有什么问题可以留言讨论。

 

 

PS:有了这些功能后,编辑小的Erlang程序应该够了,但是如果要管理一个稍微有点规模的工程,可能就有点不太方便,后续可能会实现这方面的功能。

0
0
分享到:
评论

相关推荐

    Erlang Editor plugin for QtCreator-开源

    !!!!!!!!!项目已移至 https://sourceforge.net/projects/erlangmodeforqtcreator/ Erlang 编辑器插件 ==================== 插件用于QtCreator 编辑 Erlang 源文件 功能: - 缩进(基于 vimerl ...

    Crawlee - 一个用于 Python 的网页抓取和浏览器自动化库,用于构建可靠的爬虫 提取 AI、LLM、RAG 或 GPT 的数据 从网站下载 HTML、PDF、JPG、PNG

    Web scraping and browser automation librarylee 涵盖了端到端的抓取和爬取,并帮助您快速构建可靠的爬取工具。 Crawlee for Python 向早期采用者开放!即使使用默认配置,您的爬虫程序看起来也几乎像人类一样,并且不会受到现代机器人保护的监视。Crawlee 为您提供了工具,让您可以抓取网络上的链接、抓取数据并以机器可读的格式持久存储数据,而无需担心技术细节。而且,由于配置选项丰富,如果默认设置不适用,您可以调整 Crawlee 的几乎任何方面以满足您的项目需求。在Crawlee 项目网站上查看完整的文档、指南和示例我们还有一个 TypeScript 实现的 Crawlee,您可以探索并利用它来完成您的项目。请访问我们的 GitHub 存储库,获取有关GitHub 上 JS/TS 的 Crawlee 的更多信息。安装我们建议您访问Crawlee 文档中的简介教程以获取更多信息。Crawlee 可作为crawleePyPI 软件包使用。核心功能包含在基础软件包中,其他功能作为可选附加功能提供,以最大限度地减少软件包大小和依赖项。要安装

    用AWLUM进行灰色编码2^2n-QAM调制的精确率Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    Simple Run Blocker -应用上锁工具

    Simple Run Blocker -应用上锁工具

    基于springboot的库存管理系统的设计与实现

    基于springboot+vue的网上零食销售商城。适用于计算机类毕业设计,课程设计参考与学习用途。 系统设计考虑了企业在库存管理中的各种需求,提供了包括用户管理、商品管理、库存监控、订单处理、数据分析、客户关系维护以及系统安全与配置在内的核心功能模块。用户管理模块支持用户信息的增删改查以及角色和权限的分配,确保了系统的安全性和多级管理的便捷性。商品管理模块允许轻松录入和更新商品信息,自动化记录库存变动,为库存优化提供了数据支持。订单管理模块覆盖了订单的整个生命周期,从创建到发货再到退货,每个环节都得到了精细化管理。报表统计模块通过生成各类报表,为决策提供了数据支撑。客户管理模块则侧重于维护客户信息和购买历史,以便更好地服务客户。最后,系统设置模块允许管理员根据业务需求调整系统参数。整个系统的设计旨在帮助企业提升库存管理的效率和精确度。本文研究成果为企业提供了一套完备的库存管理解决方案。 关键词: 库存管理;Spring Boot;Vue.js;系统设计;数据库

    java面向对象 - 类与对象.doc

    java面向对象 - 类与对象 在Java编程语言中,面向对象编程(OOP)是一个核心概念。它强调以对象作为程序的基本单位,并将相关的数据和功能封装在对象中。类和对象是Java OOP的两个关键组成部分。 ### 类(Class) 类是一个模板或蓝图,它定义了对象的属性和行为。我们可以将类视为对象的类型或种类。通过类,我们可以创建(实例化)具有特定属性和行为的对象。 类的组成部分通常包括: 1. **成员变量**(属性):用于存储对象的状态或数据。 2. **方法**(行为):定义了对象可以执行的操作或功能。 3. **构造方法**:一种特殊类型的方法,用于在创建对象时初始化其状态。 4. **块**(如静态块、实例初始化块):用于执行类级别的初始化代码。 5. **嵌套类**:一个类可以包含其他类,这被称为嵌套或内部类。 ### 对象(Object) 对象是类的实例。它是根据类模板创建的具体实体,具有自己的状态和行为。每个对象都是其类的一个唯一实例,可以访问其类中定义的属性和方法。 创建对象的过程通常涉及以下几个步骤: 1. **声明**:指定对象的类型(即其所属的类

    雷达阵列天线的方向图,有结果截图,适合于初学者matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    Notepad-v2.20工具,是替代Notepad++的首选工具

    Notepad-v2.20工具,是替代Notepad++的首选工具

    项目管理软考基础知识点和冲刺要点.pdf

    项目管理软考基础知识点和冲刺要点

    月色场景嫦娥弹琴flash动画.zip

    月色场景嫦娥弹琴flash动画.zip

    具有恒定相对挥发度的标准双组分蒸馏塔模型 matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    ECharts柱状图-极坐标系下的堆叠柱状图2.rar

    图表效果及代码实现讲解链接:https://blog.csdn.net/zhangjiujiu/article/details/143997013

    原生js模仿新浪微博发布评论代码.rar

    原生js模仿新浪微博发布评论代码.rar

    重力排水罐物质平衡模型及实验结果 matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    音频过滤器 GUI Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    商务喷气机的 μ-合成自动着陆控制器Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    宏观数经济学期末考试试卷解析-经济管理-教学资料

    内容概要:本文档提供了对外经济贸易大学20XX-20XX学年第X学期《宏观经济学》期末考试的试卷,涵盖了单项选择题、名词解释、简答题和论述题,旨在测试学生对宏观经济学基础知识和理论的理解及应用能力。试题内容涉及国内生产总值、边际消费倾向、通货膨胀、财政政策、货币政策等多个概念及其政策意义。 适合人群:对外经济贸易大学或类似院校的学生,尤其是修读《宏观经济学》课程的学生,教师也可作为教学参考资料。 使用场景及目标:①帮助学生全面掌握《宏观经济学》的基础知识点,为考试复习做准备;②教师可用作课堂教学材料或考试命题的参考;③研究机构研究人员可借鉴试卷内容进行相关课题研究。 其他说明:试卷难度适中,题目覆盖面广,既考查学生的记忆能力,也强调理解和分析能力。

    数据库基本内容讲解和操作

    数据库基本内容讲解和操作

    计算机二级考试选择题练习模拟题70道及答案.doc

    计算机二级考试选择题练习模拟题70道及答案 所看及所得 内容有生成式AI自动出题并解析答案 欢迎爱学习的朋友下载

    c++语言编程用遗传算法解决背包问题的源代码

    背包问题的求解。本资源是c++语言编程用遗传算法解决背包问题的源代码。代码可以自己设置物品的数量、种群的大小。进化次数、交叉概率、变异概率等参数。背包问题是给定一组物品,每个物品都有一个重量和一个价值,确定在不超过背包最大载重量的情况下,应该选择哪些物品,使得这些物品的总价值最大。

Global site tag (gtag.js) - Google Analytics