runtime(lua): Improve 'include' and make '*expr' functions script-local
- Prevent 'include' from matching variable assignments as calls to require() and others. - Use script-local functions for 'includeexpr' and 'foldexpr'. - Formatting fixes. closes: #16746 Signed-off-by: Doug Kearns <dougkearns@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
60bd140256
commit
0b8205484b
@ -6,7 +6,7 @@
|
|||||||
" C.D. MacEachern <craig.daniel.maceachern@gmail.com>
|
" C.D. MacEachern <craig.daniel.maceachern@gmail.com>
|
||||||
" Tyler Miller <tmillr@proton.me>
|
" Tyler Miller <tmillr@proton.me>
|
||||||
" Phạm Bình An <phambinhanctb2004@gmail.com>
|
" Phạm Bình An <phambinhanctb2004@gmail.com>
|
||||||
" Last Change: 2025 Feb 25
|
" Last Change: 2025 Feb 27
|
||||||
|
|
||||||
if exists("b:did_ftplugin")
|
if exists("b:did_ftplugin")
|
||||||
finish
|
finish
|
||||||
@ -32,11 +32,11 @@ setlocal formatoptions-=t formatoptions+=croql
|
|||||||
|
|
||||||
let &l:define = '\<function\|\<local\%(\s\+function\)\='
|
let &l:define = '\<function\|\<local\%(\s\+function\)\='
|
||||||
|
|
||||||
let &l:include = '\v<((do|load)file|require)[^''"]*[''"]\zs[^''"]+'
|
let &l:include = '\<\%(\%(do\|load\)file\|require\)\s*('
|
||||||
setlocal includeexpr=LuaInclude(v:fname)
|
setlocal includeexpr=s:LuaInclude(v:fname)
|
||||||
setlocal suffixesadd=.lua
|
setlocal suffixesadd=.lua
|
||||||
|
|
||||||
let b:undo_ftplugin = "setlocal cms< com< def< fo< inc< inex< sua<"
|
let b:undo_ftplugin = "setl cms< com< def< fo< inc< inex< sua<"
|
||||||
|
|
||||||
if exists("loaded_matchit") && !exists("b:match_words")
|
if exists("loaded_matchit") && !exists("b:match_words")
|
||||||
let b:match_ignorecase = 0
|
let b:match_ignorecase = 0
|
||||||
@ -61,20 +61,31 @@ endif
|
|||||||
|
|
||||||
if has("folding") && get(g:, "lua_folding", 0)
|
if has("folding") && get(g:, "lua_folding", 0)
|
||||||
setlocal foldmethod=expr
|
setlocal foldmethod=expr
|
||||||
setlocal foldexpr=LuaFold(v:lnum)
|
setlocal foldexpr=s:LuaFold(v:lnum)
|
||||||
let b:lua_lasttick = -1
|
let b:lua_lasttick = -1
|
||||||
let b:undo_ftplugin ..= "|setl foldexpr< foldmethod< | unlet! b:lua_lasttick b:lua_foldlists"
|
let b:undo_ftplugin ..= " | setl foldexpr< foldmethod< | unlet! b:lua_lasttick b:lua_foldlists"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
" The rest of the file needs to be :sourced only once per Vim session
|
" The rest of the file needs to be :sourced only once per Vim session
|
||||||
if exists('s:loaded_lua') || &cp
|
if exists("s:loaded_lua") || &cp
|
||||||
let &cpo = s:cpo_save
|
let &cpo = s:cpo_save
|
||||||
unlet s:cpo_save
|
unlet s:cpo_save
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
let s:loaded_lua = 1
|
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 = [
|
let s:patterns = [
|
||||||
\ ['do', 'end'],
|
\ ['do', 'end'],
|
||||||
\ ['if\s+.+\s+then', 'end'],
|
\ ['if\s+.+\s+then', 'end'],
|
||||||
@ -86,47 +97,35 @@ let s:patterns = [
|
|||||||
\ ['local\s+function\s+.+', 'end'],
|
\ ['local\s+function\s+.+', 'end'],
|
||||||
\ ]
|
\ ]
|
||||||
|
|
||||||
function LuaInclude(fname) abort
|
function s:LuaFold(lnum) 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
|
|
||||||
|
|
||||||
function LuaFold(lnum) abort
|
|
||||||
if b:lua_lasttick == b:changedtick
|
if b:lua_lasttick == b:changedtick
|
||||||
return b:lua_foldlists[a:lnum-1]
|
return b:lua_foldlists[a:lnum - 1]
|
||||||
endif
|
endif
|
||||||
let b:lua_lasttick = b:changedtick
|
let b:lua_lasttick = b:changedtick
|
||||||
|
|
||||||
let b:lua_foldlists = []
|
let b:lua_foldlists = []
|
||||||
let foldlist = []
|
let foldlist = []
|
||||||
let buf = getline(1, '$')
|
let buf = getline(1, "$")
|
||||||
for line in buf
|
for line in buf
|
||||||
for t in s:patterns
|
for t in s:patterns
|
||||||
let tagopen = '\v^\s*'..t[0]..'\s*$'
|
let tagopen = '\v^\s*' .. t[0] ..'\s*$'
|
||||||
let tagclose = '\v^\s*'..t[1]..'\s*$'
|
let tagclose = '\v^\s*' .. t[1] ..'\s*$'
|
||||||
if line =~# tagopen
|
if line =~# tagopen
|
||||||
call add(foldlist, t)
|
call add(foldlist, t)
|
||||||
break
|
break
|
||||||
elseif line =~# tagclose
|
elseif line =~# tagclose
|
||||||
if len(foldlist) > 0 && line =~# foldlist[-1][1]
|
if len(foldlist) > 0 && line =~# foldlist[-1][1]
|
||||||
call remove(foldlist, -1)
|
call remove(foldlist, -1)
|
||||||
else
|
else
|
||||||
let foldlist = []
|
let foldlist = []
|
||||||
endif
|
endif
|
||||||
break
|
break
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
call add(b:lua_foldlists, len(foldlist))
|
call add(b:lua_foldlists, len(foldlist))
|
||||||
endfor
|
endfor
|
||||||
|
|
||||||
return lua_foldlists[a:lnum-1]
|
return lua_foldlists[a:lnum - 1]
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
let &cpo = s:cpo_save
|
let &cpo = s:cpo_save
|
||||||
|
|||||||
Reference in New Issue
Block a user