LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2529|回复: 4

让windows中的gvim也能"K"键显示函数帮助(原创,欢迎交流)

[复制链接]
发表于 2003-9-26 22:25:30 | 显示全部楼层 |阅读模式
让windows中的gvim也能"K"键显示函数帮助(原创,欢迎交流)

大家都晓得,在unix环境下面用vim写程序,碰到不确定的函数或者命令什么的,
在命令模式下,函数名上按"K"键,就可显示该函数的man pages,只要man里面
有他的帮助。但是也有兄弟在windows环境下面用gvim的,就享受不到这些便利
了,不过不要紧,利用vim+tags的强大功能,偶们可以发扬diy精神,定制一把
自己的“在线帮助系统”^_^

下面以gvim6.2为例,偶们给他家上glibc的帮助……在制作过程中,我们需要
用到一些gnu工具(主要是grep跟sort,这些都有dos版本),我是在cygwin环境
下完成的。当然,如果你有非凡的耐心,也可以纯粹用文本编辑器完成整个工作。

首先到gnu.org下载一份最新的libc manual,为了便于在vi里显示,我们要文本
格式的那个。
瞄一眼这个manual,偶们可以发现,在这份manual里面,每一个函数的说明,都是
以“ - Function:”开头的行,标准文档就是好,格式满标准,有利于俺们改造,
^_^。
我们可以用grep,把具有这些特征的行提取出来,存为一个单独的文件。
grep '^ - Functions:' libc.txt > func_list.txt
得到一个如下格式的文件:
……
- Function: int mallopt (int PARAM, int VALUE)
- Function: enum mcheck_status mprobe (void *POINTER)
- Function: int posix_memalign (void **MEMPTR, size_t ALIGNMENT,
……
check一下,看看有没有不小心多出来的不是函数说明的行,看起来好像没有,
那就可以继续下一步,把这个文件改造成vim可以认识的tag文件。
我们先来看一个tag文件的例子,了解一下tag文件的格式——那就是vim62/doc
目录下的tags:
……
'autoindent'        options.txt        /*'autoindent'*
'autoprint'        vi_diff.txt        /*'autoprint'*
'autoread'        options.txt        /*'autoread'*
'autosave'        todo.txt        /*'autosave'*/
……
这是这个tag文件的一部分,我们随便找一个单词,比如autoprint,在上面按"K"
,结果出现了什么?gvim在顶部开了一个window,显示出如下行:
autoprint (ap)                boolean        (default on)                *'autoprint'* *'ap'*
这就是在vim自带的帮助文件todo.txt中对autoprint命令的解释!
了解到这一点,我们就很容易理解到tag文件格式的含义了,其实tag文件中的
每一行由三个部分组成,中间用tab键格开
<标记><tab><需要查找的文件><tab><vim中的查找命令>
刚才用grep提取出来的那些行,就是需要查找的内容。
比如我们要查找acos这个函数,就要把
- Function: double acos (double X)
acos - Function: double acos (double X)
这一行改成下面这个样子:
acos        libc.txt        /- Function: double acos (double X)
怎么改呢?相信稍有vi使用经验的朋友都不难解决:
首先跳到这一行(假设从该行的上一行开始):j
然后跳到该行行首:0
跳过" - Function: double " : 5w
拷贝函数名"acos"粘贴到行首 :yw0p
但是,假如函数的反回类型不只一个word,例如"char * strerror (int ERRNUM)"
我们也yw那不是只考到一个"*"吗?所以还得变通一下,考到左边的括号"("为止
才算考完,这样会在前面多出一个星号,后面多出一个括号,不过不要紧,只怕
少不怕多,删除总比插入容易……
然后继续,在后面insert插入"        libc.txt        /"
这样,一行合乎要求的tag就作出来了——一行作出来了,整篇还会远嘛?
剩下的工作可以交给sed,写一个循环,but我们假设现在在windows上面没有sed,
不过不要紧,我们可以把以上步骤录制成一个宏a:
qaj05wyf(0pa        libc.txt        /<esc>q
然后不是由1200多行嘛?我们可以执行这个宏1200次——光标停在第一行上,键入
1200<shift+@>a,唰……好壮观,一点都不比写循环差.
然后开始干掉多余的括号 :%s/(        /        /g
嘿嘿嘿,再就是开头多出来的那些返回类型,依次
如果是"*"开头的就:%s/^ \* //g
其他的如double, struct之类如法炮制,然后检查一下有没有漏网之鱼……
嗯,没有了,一份合适的tag文件就生成了!
我们把libc.txt放到vim62/doc目录下,把新生成的这个func_list帖到原来
doc目录下的tags后面,然后重新打开gvim,键入一个函数名,测试一下……
嘿嘿,会弹出一个错误,说tag文件没有排序,不过不理它,gvim还是可以找到
正确的帮助
如果你看这个错误不爽,手上又有sort这个gnu工具,那就给他排下序吧:
sort tags > tag1 && mv tag1 tags
搞定,一切ok,举一反三,我们还可以用这种方法作出其他语言的帮助,甚至
可以用来查词典
如果其他兄弟有更好的方法,欢迎交流

                      苍紫_乱(dazed_camel) 2003.9.26
 楼主| 发表于 2003-9-26 22:27:42 | 显示全部楼层
ft,没有禁止笑脸,有一个 :% 变成红脸了, 汗,怎么改回来?
发表于 2003-9-26 22:40:26 | 显示全部楼层
点帖子左下角的修改试试(那个有一支笔的)
 楼主| 发表于 2003-9-27 09:28:28 | 显示全部楼层

哦,谢谢斑竹

另: 补充,如果没有grep跟sort这两个工具:
grep也可以用gvim本身实现这一功能,就是查找/^ - Function:然后复制粘贴到文件顶部或者尾部,也做成宏,最后再把顶部或者尾部这一大坨拷出来存为func_list.txt。
至于排序嘛,既然用windows,office总是要有的,把这一坨tags导入一个excel表,排序,再导出,祈祷它不要改变你的文件格式……
真是麻烦哪……
 楼主| 发表于 2003-9-27 11:49:58 | 显示全部楼层
俺的排过序的tags,把libc.txt跟它一起考到vim62/doc目录下就可以用了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表