自写vim插件ldoc.vim,提供智能的lua注释代码补全

	LDoc是一个Lua的文档生成工具,详细介绍见,LDoc的Github主页,但是在vim中手写注释较为复杂,然后看了下vim script,自己写了一款vim插件,用于自动生成模块注释,类型注释和函数注释,方便开发。将此文件命名为ldoc.vim放在~/.vim/plugin目录下
	使用:将光标移动到需要注释的当前行,然后在命令模式下,输入LdocM,LdocT,LdocF分别进行模块注释,类型注释和函数注释,也可通过map自行映射快捷键
  1. 关于vim script的参考文档  http://vimdoc.sourceforge.net/htmldoc/usr_41.html
  1. 关于ldoc的介绍 http://keplerproject.github.io/luadoc/manual.html
" http://vimdoc.sourceforge.net/htmldoc/usr_41.html

"""""""""""""""""""""""""""""
" 工具函数
"""""""""""""""""""""""""""""
function! s:warnMsg(msg)
	echohl WarningMsg
	echo a:msg
	echohl None
endfunction

" 插件重复性加载的冲突检测
if exists("loaded_ldoc_ddc")
	call s:warnMsg("Ldoc Already Loaded!")
	finish
endif
let loaded_ldoc_ddc = 1

"""""""""""""""""""""""""""""
" 全局注释变量
"""""""""""""""""""""""""""""
if !exists("g:ldoc_startBeginCommentTag")
	let g:ldoc_startBeginCommentTag = "----------------------------------------"
endif
if !exists("g:ldoc_startEndCommentTag")
	let g:ldoc_startEndCommentTag   = "----------------------------------------"
endif
if !exists("g:ldoc_startNoteCommentTag")
	let g:ldoc_startNoteCommentTag = "--- "
endif
if !exists("g:ldoc_startFlagCommentTag")
	let g:ldoc_startFlagCommentTag = "-- "
endif

"""""""""""""""""""""""""""""
" 全局标记状态变量
"""""""""""""""""""""""""""""
if !exists("g:ldoc_flagAuthor")
	let g:ldoc_flagAuthor = "@author "
endif
if !exists("g:ldoc_flagType")
	let g:ldoc_flagType = "@type "
endif
if !exists("g:ldoc_flagParam")
	let g:ldoc_flagParam = "@param "
endif
if !exists("g:ldoc_flagReturn")
	let g:ldoc_flagReturn = "@return "
endif

"""""""""""""""""""""""""""""
" 写入函数
" 详细参见append函数,参数2可直接传入列表
"""""""""""""""""""""""""""""
function! s:writeToNextLine(str)
	call append(line("."), a:str)
endfunction
function! s:writeToPrevLine(str)
	call append(line(".")-1, a:str)
endfunction

"""""""""""""""""""""""""""""
" 模块的注释
"""""""""""""""""""""""""""""
function! <SID>ldoc_moduleComment()
	if !exists("g:ldoc_authorName")
		let g:ldoc_authorName = input("输入作者名:")
	endif
	let l:moduleDesc = input("输入模块的简单说明(可直接回车,稍后填写):")
	mark l
	let l:writeText = [g:ldoc_startBeginCommentTag]
	let l:str = g:ldoc_startNoteCommentTag
	if(strlen(l:moduleDesc) == 0)
		mark m
	else
		let l:str = l:str . l:moduleDesc
	endif
	call add(l:writeText, l:str)
	call add(l:writeText, g:ldoc_startFlagCommentTag . g:ldoc_flagAuthor . g:ldoc_authorName)
	call add(l:writeText, g:ldoc_startEndCommentTag)
	call s:writeToPrevLine(l:writeText)
	if(strlen(l:moduleDesc) == 0)
		exec "normal 'm"
	else
		exec "normal 'l"
	endif
endfunction

"""""""""""""""""""""""""""""
" 类型的注释
"""""""""""""""""""""""""""""
function! <SID>ldoc_typeComment()
	let l:curLineStr = getline(line("."))
	let l:typeNameList = matchlist(l:curLineStr, 'local[ \t]\+\([a-zA-Z0-9_]\+\)[ \t]\+')
	if(len(l:typeNameList) < 2)
		call s:warnMsg("获取type失败,call [email protected]")
		return
	endif
	let l:typeName = l:typeNameList[1]
	let l:typeDesc = input("输入类型的简单说明(可直接回车,稍后填写):")
	mark l
	let l:writeText = []
	let l:str = g:ldoc_startNoteCommentTag
	if(strlen(l:typeDesc) == 0)
		mark m
	else
		let l:str = l:str . l:typeDesc
	endif
	call add(l:writeText, l:str)
	call add(l:writeText, g:ldoc_startFlagCommentTag . g:ldoc_flagType . l:typeName)
	call s:writeToPrevLine(l:writeText)
	if(strlen(l:typeDesc) == 0)
		exec "normal 'm"
	else
		exec "normal 'l"
	endif
endfunction

"""""""""""""""""""""""""""""
" 函数的注释
"""""""""""""""""""""""""""""
function! <SID>ldoc_functionComment()
	let l:curLineStr = getline(line("."))
	let l:paramList = matchlist(l:curLineStr, 'function[ \t]\+\([a-zA-Z0-9_.:]\+\)[ \t]*(\([a-zA-Z0-9_, \t\.]*\))')
	if(len(l:paramList) >= 2)
	else
		let l:paramList = matchlist(l:curLineStr, '\([a-zA-Z0-9_]\+\)[ \t]*=[ \t]*function[ \t]*(\([a-zA-Z0-9_, \t\.]*\))')
		if(len(l:paramList) < 2)
			call s:warnMsg("获取函数失败,call [email protected]")
			return
		endif
	endif
	let l:funcName = l:paramList[1]
	if(len(l:paramList) > 3)
		let l:paramList = split(l:paramList[2], '[ \t]*,[ \t]*')
		let l:paramList2 = []
		for l:ele in l:paramList
			call add(l:paramList2, substitute(l:ele, '[ \t]+', "", ""))
		endfor
	endif
	mark l
	let l:funcDesc = input("输入函数[" . l:funcName . "]的简单说明(可直接回车,稍后填写):")
	let l:writeText = []
	let l:str = g:ldoc_startNoteCommentTag
	if(strlen(l:funcDesc) == 0)
		mark m
	else
		let l:str = l:str . l:funcDesc
	endif
	call add(l:writeText, l:str)
	for l:ele in l:paramList2
		let l:str = g:ldoc_startFlagCommentTag . g:ldoc_flagParam . l:ele
		let l:paramDesc = input("输入参数[" . l:ele . "]的简单说明:")
		if(strlen(l:paramDesc) > 0)
			let l:str = l:str . "\t" . l:paramDesc
		endif
		call add(l:writeText, l:str)
	endfor
	call s:writeToPrevLine(l:writeText)
	if(strlen(l:funcDesc) == 0)
		exec "normal 'm"
	else
		exec "normal 'l"
	endif
endfunction

"""""""""""""""""""""""""""""
" 快捷键映射
"""""""""""""""""""""""""""""
command! -nargs=0 LdocM :call <SID>ldoc_moduleComment()
command! -nargs=0 LdocT :call <SID>ldoc_typeComment()
command! -nargs=0 LdocF :call <SID>ldoc_functionComment()
时间: 2024-10-03 22:37:11

自写vim插件ldoc.vim,提供智能的lua注释代码补全的相关文章

Windows 10环境安装VIM代码补全插件YouCompleteMe

Windows 10环境安装VIM代码补全插件YouCompleteMe 折腾一周也没搞定Windows下安装VIM代码补全插件YouCompleteMe,今天在家折腾一天总算搞定了.关键问题是在于Python环境:必须确保环境变量Path里只有一个python.exe. ycmd是client-server架构.ycmd本身是server,可以为多种客户端所用,如VIM/YouComplete,emacs/emacs-ycmd等.服务端有不同引擎,如clang补全c-familiy语言,其他引

史上最强大的 Vim 代码补全引擎:YouCompleteMe

引言 自己之前Vim的代码补全插件都是使用 ctags + autotag + taglist + omnicppcompele 的组合,而且很多时候都没有提示或提示补全,而且每次打开一个新文件文件都需要创建一个 ctag 标签库,代码补全才能正能工作,十分的繁琐蛋疼.当时我就在想,既然源代码都有了,难道就没有一个 Vim 插件能的通过已有的源代码,实时构建语法书来提供代码补全提示吗?通过一番搜索,终于发现了她--YouCompleteMe,看了介绍,我开始迫不及待的试用了,顿时感觉从小米加步枪

你知道为什么Xcode6中Swift没有智能提示和自己主动补全功能吗 ?

长沙戴维营教育将为你解开这个巨大的谜团大BUG! http://www.ubuntucollege.cn/course/29/learn#lesson/354   注冊登录后课时6为你解决问题. 戴维营教育-Swift语言中文教程更新中 http://blog.diveinedu.net/category/ios_8_development/ 戴维营教育-Swift语言的github翻译项目地址: https://github.com/DiveinEdu/swift-language-in-ch

插件 FuzzyAutocomplete 代码补全支持模糊查询

https://github.com/FuzzyAutocomplete/FuzzyAutocompletePlugin 代码补全时可以不用从头开始敲,只要记得某个特定词汇就能匹配到. 并且对于项目中有好几种前缀的比如我们以前有的事MT前缀有的是MTB前缀,这种就算你前缀敲漏了只要后面对了也能匹配的到. 当然也有弊端就是你敲一个很普通的方法下面都会匹配一大长串,看着有点冗余而且xcode会比较卡,并且敲出来是好好地如果你想用delete一个个字符往回删就可能会出现xcode,crash了(也许是

LiteIDE 在 Windows 下为 Go 语言添加智能提示代码补全

本文以 Windows 7 64 位为环境,go1.4.2.windows-amd64 和 liteidex27.2.1.windows-qt5 为例. 成功搭建开发环境后,发现 LiteIDE 没有代码智能提示,这极为不方便啊~ 在 Github nfs/gocode 下载 gocode 源代码,重新编译成 exe 文件,覆盖 LiteIDE 的就行. 1,将下载的 gocode-master 解压,我放在了 C:\ 根目录下. 解压后内容如图 1 所示: 图 1 nfs/gocode 内容

typeahead 表单,为用户提供提示或数据。自动补全typeahead.js

typeahead.js功能强但不支持响应式 官网:https://twitter.github.io/typeahead.js/ 例子:https://twitter.github.io/typeahead.js/examples/ 引用: <script src="https://twitter.github.io/typeahead.js/releases/latest/typeahead.bundle.js"></script> <link hre

Fedora 27安装vim插件YouCompleteMe

1. YouCompleteMe是一款强大的Vim插件,它可以实现代码的自动补全,跳转到定义等功能,并且支持java, python, go, c家族等多种语言. 网址: https://github.com/Valloric/YouCompleteMe 2. 其github的网站上详细地给出了安装该插件的步骤,但是由于该插件所依赖的软件和库比较多,稍有出入就会出错,所以该插件也被称为史上最难安装VIM插件.经过了一天在CentOS6.8系统上痛苦的折磨之后,我终于放弃了CentOS6.8,转投

vim插件详细安装过程

1 写在前面   Linux下编程一直被诟病的一点是: 没有一个好用的IDE, 但是听说Linux牛人, 黑客之类的也都不用IDE. 但是对我等从Windows平台转移过来的Coder来说, 一个好用的IDE是何等的重要啊, 估计很多人就是卡在这个门槛上了, "工欲善其事, 必先利其器"嘛, 我想如果有一个很好用的IDE, 那些Linux牛人也会欢迎的. 这都是劳动人民的美好愿望罢了, 我今天教大家把gvim改装成一个简易IDE, 说它"简易"是界面上看起来&quo

vim插件和配置

vim插件和配置 插件 pathogen 可以方便地管理vim插件 在没有pathogen的情况下,vim插件的文件全部都放在.vim目录,卸载插件很麻烦,pathogen可以将不同的插件放在一个单独的目录下,安装插件只需要将插件的文件夹复制到制定文件夹(bundle)内,卸载插件时只需要删除文件夹,方便好用. 以下插件都可以采用“下载zip包到vundle文件夹,解压zip包”的方法进行安装 下载及安装https://github.com/tpope/vim-pathogen nerdtree