Skip to content

Commit 0b82054

Browse files
dkearnschrisbra
authored andcommitted
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>
1 parent 60bd140 commit 0b82054

1 file changed

Lines changed: 33 additions & 34 deletions

File tree

runtime/ftplugin/lua.vim

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
" C.D. MacEachern <craig.daniel.maceachern@gmail.com>
77
" Tyler Miller <tmillr@proton.me>
88
" Phạm Bình An <phambinhanctb2004@gmail.com>
9-
" Last Change: 2025 Feb 25
9+
" Last Change: 2025 Feb 27
1010

1111
if exists("b:did_ftplugin")
1212
finish
@@ -32,11 +32,11 @@ setlocal formatoptions-=t formatoptions+=croql
3232

3333
let &l:define = '\<function\|\<local\%(\s\+function\)\='
3434

35-
let &l:include = '\v<((do|load)file|require)[^''"]*[''"]\zs[^''"]+'
36-
setlocal includeexpr=LuaInclude(v:fname)
35+
let &l:include = '\<\%(\%(do\|load\)file\|require\)\s*('
36+
setlocal includeexpr=s:LuaInclude(v:fname)
3737
setlocal suffixesadd=.lua
3838

39-
let b:undo_ftplugin = "setlocal cms< com< def< fo< inc< inex< sua<"
39+
let b:undo_ftplugin = "setl cms< com< def< fo< inc< inex< sua<"
4040

4141
if exists("loaded_matchit") && !exists("b:match_words")
4242
let b:match_ignorecase = 0
@@ -61,20 +61,31 @@ endif
6161

6262
if has("folding") && get(g:, "lua_folding", 0)
6363
setlocal foldmethod=expr
64-
setlocal foldexpr=LuaFold(v:lnum)
64+
setlocal foldexpr=s:LuaFold(v:lnum)
6565
let b:lua_lasttick = -1
66-
let b:undo_ftplugin ..= "|setl foldexpr< foldmethod< | unlet! b:lua_lasttick b:lua_foldlists"
66+
let b:undo_ftplugin ..= " | setl foldexpr< foldmethod< | unlet! b:lua_lasttick b:lua_foldlists"
6767
endif
6868

69-
7069
" The rest of the file needs to be :sourced only once per Vim session
71-
if exists('s:loaded_lua') || &cp
70+
if exists("s:loaded_lua") || &cp
7271
let &cpo = s:cpo_save
7372
unlet s:cpo_save
7473
finish
7574
endif
7675
let s:loaded_lua = 1
7776

77+
function s:LuaInclude(fname) abort
78+
let lua_ver = str2float(printf("%d.%02d", g:lua_version, g:lua_subversion))
79+
let fname = tr(a:fname, '.', '/')
80+
let paths = lua_ver >= 5.03 ? [fname .. ".lua", fname .. "/init.lua"] : [fname .. ".lua"]
81+
for path in paths
82+
if filereadable(path)
83+
return path
84+
endif
85+
endfor
86+
return fname
87+
endfunction
88+
7889
let s:patterns = [
7990
\ ['do', 'end'],
8091
\ ['if\s+.+\s+then', 'end'],
@@ -86,47 +97,35 @@ let s:patterns = [
8697
\ ['local\s+function\s+.+', 'end'],
8798
\ ]
8899

89-
function LuaInclude(fname) abort
90-
let lua_ver = str2float(printf("%d.%02d", g:lua_version, g:lua_subversion))
91-
let fname = tr(a:fname, '.', '/')
92-
let paths = lua_ver >= 5.03 ? [ fname.'.lua', fname.'/init.lua' ] : [ fname.'.lua' ]
93-
for path in paths
94-
if filereadable(path)
95-
return path
96-
endif
97-
endfor
98-
return fname
99-
endfunction
100-
101-
function LuaFold(lnum) abort
100+
function s:LuaFold(lnum) abort
102101
if b:lua_lasttick == b:changedtick
103-
return b:lua_foldlists[a:lnum-1]
102+
return b:lua_foldlists[a:lnum - 1]
104103
endif
105104
let b:lua_lasttick = b:changedtick
106105

107106
let b:lua_foldlists = []
108107
let foldlist = []
109-
let buf = getline(1, '$')
108+
let buf = getline(1, "$")
110109
for line in buf
111110
for t in s:patterns
112-
let tagopen = '\v^\s*'..t[0]..'\s*$'
113-
let tagclose = '\v^\s*'..t[1]..'\s*$'
111+
let tagopen = '\v^\s*' .. t[0] ..'\s*$'
112+
let tagclose = '\v^\s*' .. t[1] ..'\s*$'
114113
if line =~# tagopen
115-
call add(foldlist, t)
116-
break
114+
call add(foldlist, t)
115+
break
117116
elseif line =~# tagclose
118-
if len(foldlist) > 0 && line =~# foldlist[-1][1]
119-
call remove(foldlist, -1)
120-
else
121-
let foldlist = []
122-
endif
123-
break
117+
if len(foldlist) > 0 && line =~# foldlist[-1][1]
118+
call remove(foldlist, -1)
119+
else
120+
let foldlist = []
121+
endif
122+
break
124123
endif
125124
endfor
126125
call add(b:lua_foldlists, len(foldlist))
127126
endfor
128127

129-
return lua_foldlists[a:lnum-1]
128+
return lua_foldlists[a:lnum - 1]
130129
endfunction
131130

132131
let &cpo = s:cpo_save

0 commit comments

Comments
 (0)