diff options
Diffstat (limited to 'mnv/runtime/ftplugin/lua.mnv')
| -rw-r--r-- | mnv/runtime/ftplugin/lua.mnv | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/mnv/runtime/ftplugin/lua.mnv b/mnv/runtime/ftplugin/lua.mnv new file mode 100644 index 0000000000..776b8a4d54 --- /dev/null +++ b/mnv/runtime/ftplugin/lua.mnv @@ -0,0 +1,190 @@ +" MNV filetype plugin file. + +" Language: Lua +" Maintainer: Doug Kearns <dougkearns@gmail.com> +" Previous Maintainer: Max Ischenko <mfi@ukr.net> +" Contributor: Dorai Sitaram <ds26@gte.com> +" C.D. MacEachern <craig.daniel.maceachern@gmail.com> +" Tyler Miller <tmillr@proton.me> +" Phạm Bình An <phambinhanctb2004@gmail.com> +" @konfekt +" Last Change: 2025 Apr 04 +" 2025 May 06 by MNV Project update 'path' setting #17267 + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +" keep in sync with syntax/lua.mnv +if !exists("lua_version") + " Default is lua 5.3 + let lua_version = 5 + let lua_subversion = 3 +elseif !exists("lua_subversion") + " lua_version exists, but lua_subversion doesn't. In this case set it to 0 + let lua_subversion = 0 +endif + +let s:cpo_save = &cpo +set cpo&mnv + +setlocal comments=:---,:-- +setlocal commentstring=--\ %s +setlocal formatoptions-=t formatoptions+=croql +setlocal path-=. " Lua doesn't support importing module in path related to current file like JS + +let &l:define = '\<function\|\<local\%(\s\+function\)\=' + +let &l:include = '\<\%(\%(do\|load\)file\|require\)\s*(' +setlocal includeexpr=s:LuaInclude(v:fname) +setlocal suffixesadd=.lua + +let b:undo_ftplugin = "setl cms< com< def< fo< inc< inex< sua< pa<" + +if exists("loaded_matchit") && !exists("b:match_words") + let b:match_ignorecase = 0 + let b:match_words = + \ '\<\%(do\|function\|if\)\>:' .. + \ '\<\%(return\|else\|elseif\)\>:' .. + \ '\<end\>,' .. + \ '\<repeat\>:\<until\>,' .. + \ '\%(--\)\=\[\(=*\)\[:]\1]' + let b:undo_ftplugin ..= " | unlet! b:match_words b:match_ignorecase" +endif + +if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") + let b:browsefilter = "Lua Source Files (*.lua)\t*.lua\n" + if has("win32") + let b:browsefilter ..= "All Files (*.*)\t*\n" + else + let b:browsefilter ..= "All Files (*)\t*\n" + endif + let b:undo_ftplugin ..= " | unlet! b:browsefilter" +endif + +if has("folding") && get(g:, "lua_folding", 0) + setlocal foldmethod=expr + setlocal foldexpr=s:LuaFold() + let b:lua_lasttick = -1 + let b:undo_ftplugin ..= " | setl foldexpr< foldmethod< | unlet! b:lua_lasttick b:lua_foldlists" +endif + +" The rest of the file needs to be :sourced only once per MNV session +if exists("s:loaded_lua") || &cp + let &cpo = s:cpo_save + unlet s:cpo_save + finish +endif +let s:loaded_lua = 1 + +function s:LuaInclude(fname) abort + let lua_ver = str2float(printf("%d.%02d", g:lua_version, g:lua_subversion)) + let fname = tr(a:fname, '.', '/') + let paths = lua_ver >= 5.03 ? [fname .. ".lua", fname .. "/init.lua"] : [fname .. ".lua"] + for path in paths + if filereadable(path) + return path + endif + endfor + return fname +endfunction + +let s:patterns = [ + \ ['do', 'end'], + \ ['if\s+.+\s+then', 'end'], + \ ['repeat', 'until\s+.+'], + \ ['for\s+.+\s+do', 'end'], + \ ['while\s+.+\s+do', 'end'], + \ ['function.+', 'end'], + \ ['return\s+function.+', 'end'], + \ ['local\s+function\s+.+', 'end'], + \ ] + +function s:LuaFold() abort + if b:lua_lasttick == b:changedtick + return b:lua_foldlists[v:lnum - 1] + endif + let b:lua_lasttick = b:changedtick + + let b:lua_foldlists = [] + let foldlist = [] + let buf = getline(1, "$") + for line in buf + for t in s:patterns + let open = 0 + let end = 0 + let tagopen = '\v^\s*' .. t[0] ..'\s*$' + let tagend = '\v^\s*' .. t[1] ..'\s*$' + if line =~# tagopen + call add(foldlist, t) + let open = 1 + break + elseif line =~# tagend + if len(foldlist) > 0 && line =~# foldlist[-1][1] + call remove(foldlist, -1) + let end = 1 + else + let foldlist = [] + endif + break + endif + endfor + let prefix = "" + if open == 1 | let prefix = ">" | endif + if end == 1 | let prefix = "<" | endif + let b:lua_foldlists += [prefix..(len(foldlist) + end)] + endfor + + return b:lua_foldlists[v:lnum - 1] +endfunction + +if !has('mnv9script') + let &cpo = s:cpo_save + unlet s:cpo_save + + finish +endif + +delfunction! s:LuaFold +def s:LuaFold(): string + if b:lua_lasttick == b:changedtick + return b:lua_foldlists[v:lnum - 1] + endif + b:lua_lasttick = b:changedtick + + b:lua_foldlists = [] + var foldlist = [] + var buf = getline(1, "$") + for line in buf + var open = 0 + var end = 0 + for t in patterns + var tagopen = '\v^\s*' .. t[0] .. '\s*$' + var tagend = '\v^\s*' .. t[1] .. '\s*$' + if line =~# tagopen + add(foldlist, t) + open = 1 + break + elseif line =~# tagend + if len(foldlist) > 0 && line =~# foldlist[-1][1] + end = 1 + remove(foldlist, -1) + else + foldlist = [] + endif + break + endif + endfor + var prefix = "" + if open == 1 | prefix = ">" | endif + if end == 1 | prefix = "<" | endif + b:lua_foldlists += [prefix .. (len(foldlist) + end)] + endfor + return b:lua_foldlists[v:lnum - 1] +enddef + +let &cpo = s:cpo_save +unlet s:cpo_save + +" mnv: nowrap sw=2 sts=2 ts=8 noet: |
