自寫vim插件ldoc.vim,提供智能的lua注釋代碼補全
來源:程序員人生 發布時間:2015-01-20 08:34:00 閱讀次數:3529次
LDoc是1個Lua的文檔生成工具,詳細介紹見,LDoc的Github主頁,但是在vim中手寫注釋較為復雜,然后看了下vim script,自己寫了1款vim插件,用于自動生成模塊注釋,類型注釋和函數注釋,方便開發。將此文件命名為ldoc.vim放在~/.vim/plugin目錄下
使用:將光標移動到需要注釋確當前行,然后在命令模式下,輸入LdocM,LdocT,LdocF分別進行模塊注釋,類型注釋和函數注釋,也可通過map自行映照快捷鍵- 關于vim script的參考文檔 http://vimdoc.sourceforge.net/htmldoc/usr_41.html
- 關于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(".")⑴, 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:markJump = 0
let l:str = g:ldoc_startNoteCommentTag
if(strlen(l:moduleDesc) == 0)
let l:markJump = 1
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(l:markJump == 1)
exec "normal " . (line(".") - len(l:writeText) + 1) . "G$"
else
exec "normal 'l"
endif
endfunction
"""""""""""""""""""""""""""""
" 類型的注釋
"""""""""""""""""""""""""""""
function! <SID>ldoc_typeComment()
let l:curLineStr = getline(line("."))
let l:typeNameList = matchlist(l:curLineStr, 'local[ ]+([a-zA-Z0⑼_]+)[ ]+')
if(len(l:typeNameList) < 2)
call s:warnMsg("獲得type失敗,call jncpp@qq.com")
return
endif
let l:typeName = l:typeNameList[1]
let l:typeDesc = input("輸入類型的簡單說明(可直接回車,稍后填寫):")
mark l
let l:writeText = []
let l:markJump = 0
let l:str = g:ldoc_startNoteCommentTag
if(strlen(l:typeDesc) == 0)
let l:markJump = 1
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(l:markJump == 1)
exec "normal " . (line(".") - len(l:writeText)) . "G$"
else
exec "normal 'l"
endif
endfunction
"""""""""""""""""""""""""""""
" 函數的注釋
"""""""""""""""""""""""""""""
function! <SID>ldoc_functionComment()
let l:curLineStr = getline(line("."))
let l:paramList = matchlist(l:curLineStr, 'function[ ]+([a-zA-Z0⑼_.:]+)[ ]*(([a-zA-Z0⑼_, .]*))')
if(len(l:paramList) >= 2)
else
let l:paramList = matchlist(l:curLineStr, '([a-zA-Z0⑼_]+)[ ]*=[ ]*function[ ]*(([a-zA-Z0⑼_, .]*))')
if(len(l:paramList) < 2)
call s:warnMsg("獲得函數失敗,call jncpp@qq.com")
return
endif
endif
let l:funcName = l:paramList[1]
if(len(l:paramList) > 3)
let l:paramList = split(l:paramList[2], '[ ]*,[ ]*')
let l:paramList2 = []
for l:ele in l:paramList
call add(l:paramList2, substitute(l:ele, '[ ]+', "", ""))
endfor
endif
mark l
let l:funcDesc = input("輸入函數[" . l:funcName . "]的簡單說明(可直接回車,稍后填寫):")
let l:writeText = []
let l:str = g:ldoc_startNoteCommentTag
let l:markJump = 0
if(strlen(l:funcDesc) == 0)
let l:markJump = 1
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 . " " . l:paramDesc
endif
call add(l:writeText, l:str)
endfor
call s:writeToPrevLine(l:writeText)
if(l:markJump == 1)
exec "normal " . (line(".") - len(l:writeText)) . "G$"
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()
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈