- 论坛徽章:
- 1
|
这个脚本是我自己写的,已经用了有些年头了,不过过去只支持 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 这样的代码上的话,还可以自动定位到方法。
- function! HelpHelper( where )
- " 先拿下光标下的文字
- let l:word = expand( "<cWORD>" )
- " 再取出疑似函数名/模块名的部分和疑似方法的部分
- let l:lists = matchlist( l:word, "\\([_a-zA-Z0-9:]\\+\\)\\(->\\([_a-zA-Z0-9]\\+\\)\\)\\?" )
- let l:name = l:lists[1]
- let l:method = l:lists[3]
- let l:progList = []
- if &ft == "perl"
- if match( l:name, "::" ) != -1
- " 函数里是不可能有 :: 的,不用想了,一定是模块
- let l:progList += [ [ "perldoc -u ", "pod" ] ]
- elseif strlen( l:method )
- " 有方法的,一定是模块了
- let l:progList += [ [ "perldoc -u ", "pod" ] ]
- elseif match( l:name, "[A-Z]" ) != -1
- " 有大写字母,那一定是模块了,Perl buildin 函数的名称全都是小写字母的
- let l:progList += [ [ "perldoc -u ", "pod" ] ]
- else
- " 剩下的,有可能是函数,也有可能是模块,
- " 但是考虑到这样的模块较少,因此先优先查函数
- let l:progList += [ [ "perldoc -u -f ", "pod" ], [ "perldoc -u ", "pod" ] ]
- endif
- endif
- if &ft == "erlang"
- if match( l:name, ":" ) != -1
- " erlang 的模块方法
- let l:progList += [ [ "PAGER=\"col -b\" erl -man ", "man" ] ]
- let l:lists = matchlist( l:name, "\\([_a-zA-Z0-9:]\\+\\):\\([_a-zA-Z0-9]\\+\\)" )
- let l:name = l:lists[1]
- let l:method = l:lists[2]
- endif
- endif
- let l:progList += [ [ "PAGER=\"col -b\" man 3 ", "man" ] ]
- let l:progList += [ [ "PAGER=\"col -b\" man 2 ", "man" ] ]
- let l:progList += [ [ "PAGER=\"col -b\" man ", "man" ] ]
- let l:found = 0
- " 下面调用外部命令,取帮助信息
- for l:prog in l:progList
- let l:progName = l:prog[0]
- let l:fileType = l:prog[1]
- let l:cmd = l:progName . l:name
- let l:lines = system( l:cmd )
- if !v:shell_error
- if a:where ==? "inNewTab"
- tabe
- elseif a:where ==? "Vertical"
- rightbelow new
- else
- above new
- endif
- set buftype=nofile
- set ts=8
- execute "set ft=" . l:fileType
- call append( 0, split( l:lines, "\n" ) )
- normal gg
- if strlen(l:method)
- if l:fileType == "pod"
- call search( "\\(=item\\d*\\s\\+\\)\\@<=" . l:method . "\\>" )
- elseif l:fileType == "man"
- call search( "\\(^\\s\\+\\)\\@<=" . l:method . "\\>" )
- endif
- endif
- let l:found = 1
- break
- endif
- endfor
- if !l:found
- echohl ErrorMsg | echomsg "没有帮助信息。" | echohl None
- endif
- endfunction
- autocmd BufNewFile,BufRead *.hrl set ft=erlang
- autocmd FileType c,perl,erlang nmap <silent> K :call HelpHelper( "" )<CR>
- autocmd FileType c,perl,erlang nmap <silent> gK :call HelpHelper( "InNewTab" )<CR>
复制代码
代码写的不好,但是应该好用,我一直都在用,凑合着使吧。 |
|