免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: OwnWaterloo
打印 上一主题 下一主题

你的vim支持external scripting engines吗? [复制链接]

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
21 [报告]
发表于 2010-02-10 18:34 |只看该作者
本帖最后由 starwing83 于 2010-02-10 18:51 编辑

恩……没办法啊,现在就是带着镣铐在跳舞,心里想着这个用python写好简单,可是就是没办法……对了你会那些脚本语言?有个问题看看你用别的脚本语言怎么写~~~问题是这样的,给出一个字符串,要parse它。用C当然就是栈和getchar的事儿,但是如果你在脚本语言这么做,就会效率极其低下,目前用得是一个特别复杂的正则表达式加上split搞定的,不知道你有没有什么好办法……

语法是这样的:
template = meta*
meta = (/${(w+)?[?~]?\d+[:.*]}/ | /$\d+/ | /./ | /`.*`)

其中${}的表示形式要求支持递归,可以用反斜线来转义$和}。生成一颗tag树就可以了。并给出$\d+所在的位置和数字值。$\d+形式是一个placeholder,意思是它和对应的tag的文本要一样,`.*`是即时执行的代码,要包含在树里面

比如下面的template:
for (${1:i} = ${2:0}; ${31 <= ${4:len}}; ${5:++}$1)${?6:{${7:/* coding... */}\}}

要得到下面的结果:
[tag0 'for (', [tag1 'i'], ' = ', [tag2 '0], '; ', [tag3 [placeholder 1], ' <= ', [tag4 'len'], '; ', [tag5 '++'], [placeholder 1], ')', [hidetag6 '{', [tag 7 '/* coding,,,*/'], '}']]

上面的表示形式,内部怎么表示无所谓,只要能parse出一个程序能识别的结构就可以了。这个结构就是补全时动态操作的基本数据结构(目前用的是一颗多叉树,每个节点一个list保存children的index-node,然后由index保持位置信息,由index指向的entity保存id的顺序,文本,插入位置和内部包含的和需要维护的所有数据的index信息)。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
22 [报告]
发表于 2010-02-10 18:43 |只看该作者
另外,无论用什么编程都是“带着镣铐跳舞”吧?毕竟时空矛盾是不好解决的,现在又掺杂进了人力和机器时间的均衡,反正矛盾总会是越来越多的。

论坛徽章:
0
23 [报告]
发表于 2010-02-10 22:10 |只看该作者
这家伙居然写了这么多字。。。

论坛徽章:
0
24 [报告]
发表于 2010-02-10 22:32 |只看该作者
本帖最后由 DQP 于 2010-02-10 22:51 编辑

{:3_183:}

论坛徽章:
0
25 [报告]
发表于 2010-02-10 23:21 |只看该作者
emacs 有 server 模式,开启时,除了第一次,之后的并不慢。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
26 [报告]
发表于 2010-02-11 17:17 |只看该作者
本帖最后由 OwnWaterloo 于 2010-02-11 17:18 编辑

回复 21# starwing83

我也就会玩C/C++……  偶尔会被它们玩……
其他语言基本都是被玩……


关于那个parse。

1. 效率不够测过没?

不知道有没有现存的, 使用脚本语言实现的编译器? 可以用它们来测试一下速度, 看是否真的慢得受不了? (毕竟人输入的速度对计算机来说是相当慢的……)

如果是的话……  那用C扩展那种脚本语言的库咯? 实现高效一些的stack —— 这样以后开发其他的东西, 也可以用这个stack?
或者, 直接扩展那语言……


2. 可不可以换一种思路?
不是去解析整个源文件, 然后得到它的结构; 而是一边编写, 一边将源文件填充到正确的结构?
这样可能只需要解析一些keyword, 而且输入也很省力~

比如监视用户的输入, 当他输入一个完整的for 时, 将源文件填充到:
for ( 1 ; 2 ; 3 )
   4
的样子。

括号和分号是自己填充的, 所以知道位置, 也就不需要解析。
然后让插入符跳转到1的位置, 当用户在这里输入字符时, 后面的 ";" ";"  ")" 位置也相应后移。
用户输入完1后, 通过某种方式, 跳到2去继续输入,  类似的, 将后面的 ";" ")" 也相应的后移。


如果源文件一开始就不是空白的……   直接使用现有的工具? cscope?
或者用C写这么一个工具……

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
27 [报告]
发表于 2010-02-13 14:40 |只看该作者
恩,来回应你一下:

1. 的确慢,因为在开了Decho以后,我自己的代码parse居然都需要花几分钟时间……因为VimL就是一个完全的模拟解释型语言,不慢是不可能的,优化有两条路:尽量使用内置函数而不是自己实现功能(哪怕是十分间接的使用都好),或者降低算法的时间复杂度。

2. 不行,template是放在一个snippet文件里面的,里面可能有N+1条,必须分析成初始数据以供用户使用,虽然可以写一个单独的工具parsesnippet文件到Vim认识的格式,可是部署发布到调试patch都不容易。

3. C不行。不是做不到,是Vim的硬伤,Vim调用libcall只能返回数字和字符串,而且无法和任何Vim内部元素交互,等于就是一shell。写单独工具上面已经分析了……

目前的实现已经很优了(自认为),就算如此也写了143行(单纯的核心)……而且不知道一大堆反向互联的引用会不会造成垃圾回收困难……哎,给Vim写东西真是累,现在在学习perl,权当逃避,不过perl学完了还是得硬上……

论坛徽章:
0
28 [报告]
发表于 2010-03-09 11:03 |只看该作者
以前一直用vim的perl interface的,后来发现,与其用vim做ui,不如直接用浏览器做ui算了
其实一直期待vim的lua interface,其他所有语言都太庞大了...
不过这个lua interface到现在都没有进入vim正式代码库...

vim还有mzScheme的interface,就是不会用...

论坛徽章:
0
29 [报告]
发表于 2010-07-23 21:45 |只看该作者
原来写了没几天啊,怪不得处处装B呢?真是可笑,处处发水帖,垃圾,恶心也许不是你的错,但处处装B可就是你的不对了 啊

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
30 [报告]
发表于 2010-07-23 21:48 |只看该作者
回复 29# baixueer2012

骚包, 爷学1天也顶你学一辈子。
你继续把我的帖顶起来好了, 让大家多多认识你这个骚货。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP