免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7321 | 回复: 6
打印 上一主题 下一主题

[其他] 贡献一段开发 erlang 时会用到的 vim 脚本 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-12 13:09 |只看该作者 |倒序浏览
这个脚本是我自己写的,已经用了有些年头了,不过过去只支持 Perl 和 C。最近在看 ejabberd,
就稍微改了改,让它也支持 erlang。

这个脚本的唯一功能,
就是当你在 vim 里面按 K 键(帮助键)的时候,可以将帮助内容放在独立的 buffer 里面显示,并且语法高亮(可惜 man 格式的语法高亮少的可怜,谁给推荐一个好的,pod 就好多了)

对于使用 vim7 的朋友,你还可以用 gK 命令(先按 g 再按 K),把帮助在新标签中显示。
我平时是根据内容长短 K 和 gK 都用的,你到底喜欢用 K 还是 gK 就看你的喜好了。

用法:
把光标移到想要查看帮助的函数名(对于C/Perl来说)或者模块名(对于 Perl/Erlang 来说)上面,
然后按 K,就可以了。

对于 Erlang 来说,如果光标是在 module:method 这样的代码上的话,还可以自动定位到方法。
对于 Perl 来说,如果光标是在 Module::Name->method 这样的代码上的话,还可以自动定位到方法。


  1. function! HelpHelper( where )
  2.     " 先拿下光标下的文字
  3.     let l:word = expand( "<cWORD>" )

  4.     " 再取出疑似函数名/模块名的部分和疑似方法的部分
  5.     let l:lists = matchlist( l:word, "\\([_a-zA-Z0-9:]\\+\\)\\(->\\([_a-zA-Z0-9]\\+\\)\\)\\?" )

  6.     let l:name = l:lists[1]
  7.     let l:method = l:lists[3]

  8.     let l:progList = []

  9.     if &ft == "perl"
  10.         if match( l:name, "::" ) != -1
  11.             " 函数里是不可能有 :: 的,不用想了,一定是模块
  12.             let l:progList += [ [ "perldoc -u ", "pod" ] ]
  13.         elseif strlen( l:method )
  14.             " 有方法的,一定是模块了
  15.             let l:progList += [ [ "perldoc -u ", "pod" ] ]
  16.         elseif match( l:name, "[A-Z]" ) != -1
  17.             " 有大写字母,那一定是模块了,Perl buildin 函数的名称全都是小写字母的
  18.             let l:progList += [ [ "perldoc -u ", "pod" ] ]
  19.         else
  20.             " 剩下的,有可能是函数,也有可能是模块,
  21.             " 但是考虑到这样的模块较少,因此先优先查函数
  22.             let l:progList += [ [ "perldoc -u -f ", "pod" ], [ "perldoc -u ", "pod" ] ]
  23.         endif
  24.     endif

  25.     if &ft == "erlang"
  26.         if match( l:name, ":" ) != -1
  27.             " erlang 的模块方法
  28.             let l:progList += [ [ "PAGER=\"col -b\" erl -man ", "man" ] ]
  29.             let l:lists = matchlist( l:name, "\\([_a-zA-Z0-9:]\\+\\):\\([_a-zA-Z0-9]\\+\\)" )
  30.             let l:name = l:lists[1]
  31.             let l:method = l:lists[2]
  32.         endif
  33.     endif

  34.     let l:progList += [ [ "PAGER=\"col -b\" man 3 ", "man" ] ]
  35.     let l:progList += [ [ "PAGER=\"col -b\" man 2 ", "man" ] ]
  36.     let l:progList += [ [ "PAGER=\"col -b\" man ", "man" ] ]

  37.     let l:found = 0
  38.     " 下面调用外部命令,取帮助信息
  39.     for l:prog in l:progList
  40.         let l:progName = l:prog[0]
  41.         let l:fileType = l:prog[1]
  42.         let l:cmd = l:progName . l:name
  43.         let l:lines = system( l:cmd )
  44.         if !v:shell_error
  45.             if a:where ==? "inNewTab"
  46.                 tabe
  47.             elseif a:where ==? "Vertical"
  48.                 rightbelow new
  49.             else
  50.                 above new
  51.             endif
  52.             set buftype=nofile
  53.             set ts=8
  54.             execute "set ft=" . l:fileType
  55.             call append( 0, split( l:lines, "\n" ) )
  56.             normal gg
  57.             if strlen(l:method)
  58.                 if l:fileType == "pod"
  59.                     call search( "\\(=item\\d*\\s\\+\\)\\@<=" . l:method . "\\>" )
  60.                 elseif l:fileType == "man"
  61.                     call search( "\\(^\\s\\+\\)\\@<=" . l:method . "\\>" )
  62.                 endif
  63.             endif
  64.             let l:found = 1
  65.             break
  66.         endif
  67.     endfor

  68.     if !l:found
  69.         echohl ErrorMsg | echomsg "没有帮助信息。" | echohl None
  70.     endif

  71. endfunction

  72. autocmd BufNewFile,BufRead *.hrl set ft=erlang
  73. autocmd FileType c,perl,erlang nmap <silent> K :call HelpHelper( "" )<CR>
  74. autocmd FileType c,perl,erlang nmap <silent> gK :call HelpHelper( "InNewTab" )<CR>
复制代码

代码写的不好,但是应该好用,我一直都在用,凑合着使吧。

论坛徽章:
0
2 [报告]
发表于 2008-09-12 13:24 |只看该作者
很好很强大。

论坛徽章:
0
3 [报告]
发表于 2008-09-12 18:50 |只看该作者
我现在用 EMACS 了,比较省心点。

论坛徽章:
0
4 [报告]
发表于 2008-09-12 18:52 |只看该作者
自从用了iphone和psp以后,我就觉得,一个东西如果需要大量定制,那他就不是一个好的产品。

论坛徽章:
0
5 [报告]
发表于 2008-09-12 18:56 |只看该作者
自从玩了魔兽世界以后,我就愿意使用鼠标了,所以用鼠标切窗口看文档目前还能忍受。

论坛徽章:
0
6 [报告]
发表于 2008-09-13 01:53 |只看该作者
原帖由 formalin14 于 2008-9-12 18:52 发表
自从用了iphone和psp以后,我就觉得,一个东西如果需要大量定制,那他就不是一个好的产品。

错 去定制的是程序员
erlang开发出的交换机 你甚至不知道是erlang写的
如果是程序员 定制就没啥可说的了
当然vs不需要定制

只是玩法不同而已

论坛徽章:
0
7 [报告]
发表于 2012-05-08 13:30 |只看该作者
感谢法老 已经用上了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP