blob: e3bb3a5ddf04b522ff1844a4eaa56a0e16035c49 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim filetype plugin file.
Christian Brabandt2ffb4d02025-04-07 14:07:28 +02002
3" Language: Lua
4" Maintainer: Doug Kearns <dougkearns@gmail.com>
5" Previous Maintainer: Max Ischenko <mfi@ukr.net>
6" Contributor: Dorai Sitaram <ds26@gte.com>
7" C.D. MacEachern <craig.daniel.maceachern@gmail.com>
8" Tyler Miller <tmillr@proton.me>
9" Phm Bình An <phambinhanctb2004@gmail.com>
10" @konfekt
11" Last Change: 2025 Apr 04
Phạm Bình An0fb6cea2025-05-06 18:08:38 +020012" 2025 May 06 by Vim Project update 'path' setting #17267
Bram Moolenaar071d4272004-06-13 20:20:40 +000013
Bram Moolenaar071d4272004-06-13 20:20:40 +000014if exists("b:did_ftplugin")
15 finish
16endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000017let b:did_ftplugin = 1
18
brianhuster00a00f52025-02-25 20:22:18 +010019" keep in sync with syntax/lua.vim
20if !exists("lua_version")
21 " Default is lua 5.3
22 let lua_version = 5
23 let lua_subversion = 3
24elseif !exists("lua_subversion")
25 " lua_version exists, but lua_subversion doesn't. In this case set it to 0
26 let lua_subversion = 0
27endif
28
Bram Moolenaarf1568ec2011-12-14 21:17:39 +010029let s:cpo_save = &cpo
30set cpo&vim
31
Bram Moolenaar71badf92023-04-22 22:40:14 +010032setlocal comments=:---,:--
Bram Moolenaar71b6d332022-09-10 13:13:14 +010033setlocal commentstring=--\ %s
Bram Moolenaar519cc552021-11-16 19:18:26 +000034setlocal formatoptions-=t formatoptions+=croql
Phạm Bình An0fb6cea2025-05-06 18:08:38 +020035setlocal path-=. " Lua doesn't support importing module in path related to current file like JS
Bram Moolenaar071d4272004-06-13 20:20:40 +000036
Bram Moolenaar71b6d332022-09-10 13:13:14 +010037let &l:define = '\<function\|\<local\%(\s\+function\)\='
38
Doug Kearns0b820542025-02-27 19:17:33 +010039let &l:include = '\<\%(\%(do\|load\)file\|require\)\s*('
40setlocal includeexpr=s:LuaInclude(v:fname)
Bram Moolenaar071d4272004-06-13 20:20:40 +000041setlocal suffixesadd=.lua
42
Phạm Bình An0fb6cea2025-05-06 18:08:38 +020043let b:undo_ftplugin = "setl cms< com< def< fo< inc< inex< sua< pa<"
Bram Moolenaar071d4272004-06-13 20:20:40 +000044
Bram Moolenaar519cc552021-11-16 19:18:26 +000045if exists("loaded_matchit") && !exists("b:match_words")
Bram Moolenaar071d4272004-06-13 20:20:40 +000046 let b:match_ignorecase = 0
47 let b:match_words =
Christian Brabandt2ffb4d02025-04-07 14:07:28 +020048 \ '\<\%(do\|function\|if\)\>:' ..
49 \ '\<\%(return\|else\|elseif\)\>:' ..
50 \ '\<end\>,' ..
51 \ '\<repeat\>:\<until\>,' ..
52 \ '\%(--\)\=\[\(=*\)\[:]\1]'
Bram Moolenaar71b6d332022-09-10 13:13:14 +010053 let b:undo_ftplugin ..= " | unlet! b:match_words b:match_ignorecase"
Bram Moolenaar519cc552021-11-16 19:18:26 +000054endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000055
Bram Moolenaar519cc552021-11-16 19:18:26 +000056if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
Doug Kearns93197fd2024-01-14 20:59:02 +010057 let b:browsefilter = "Lua Source Files (*.lua)\t*.lua\n"
58 if has("win32")
59 let b:browsefilter ..= "All Files (*.*)\t*\n"
60 else
61 let b:browsefilter ..= "All Files (*)\t*\n"
62 endif
Bram Moolenaar71b6d332022-09-10 13:13:14 +010063 let b:undo_ftplugin ..= " | unlet! b:browsefilter"
Bram Moolenaar519cc552021-11-16 19:18:26 +000064endif
Bram Moolenaarf1568ec2011-12-14 21:17:39 +010065
Ennofdfcce52024-12-03 22:23:48 +010066if has("folding") && get(g:, "lua_folding", 0)
67 setlocal foldmethod=expr
Konfekt00b927b2025-04-06 17:40:43 +020068 setlocal foldexpr=s:LuaFold()
Ennofdfcce52024-12-03 22:23:48 +010069 let b:lua_lasttick = -1
Doug Kearns0b820542025-02-27 19:17:33 +010070 let b:undo_ftplugin ..= " | setl foldexpr< foldmethod< | unlet! b:lua_lasttick b:lua_foldlists"
Ennofdfcce52024-12-03 22:23:48 +010071endif
72
Ennofdfcce52024-12-03 22:23:48 +010073" The rest of the file needs to be :sourced only once per Vim session
Doug Kearns0b820542025-02-27 19:17:33 +010074if exists("s:loaded_lua") || &cp
Ennofdfcce52024-12-03 22:23:48 +010075 let &cpo = s:cpo_save
76 unlet s:cpo_save
77 finish
78endif
79let s:loaded_lua = 1
80
Doug Kearns0b820542025-02-27 19:17:33 +010081function s:LuaInclude(fname) abort
82 let lua_ver = str2float(printf("%d.%02d", g:lua_version, g:lua_subversion))
83 let fname = tr(a:fname, '.', '/')
84 let paths = lua_ver >= 5.03 ? [fname .. ".lua", fname .. "/init.lua"] : [fname .. ".lua"]
85 for path in paths
86 if filereadable(path)
87 return path
88 endif
89 endfor
90 return fname
91endfunction
92
Ennofdfcce52024-12-03 22:23:48 +010093let s:patterns = [
Christian Brabandt2ffb4d02025-04-07 14:07:28 +020094 \ ['do', 'end'],
95 \ ['if\s+.+\s+then', 'end'],
96 \ ['repeat', 'until\s+.+'],
97 \ ['for\s+.+\s+do', 'end'],
98 \ ['while\s+.+\s+do', 'end'],
99 \ ['function.+', 'end'],
100 \ ['return\s+function.+', 'end'],
101 \ ['local\s+function\s+.+', 'end'],
102 \ ]
Ennofdfcce52024-12-03 22:23:48 +0100103
Konfekt00b927b2025-04-06 17:40:43 +0200104function s:LuaFold() abort
Ennofdfcce52024-12-03 22:23:48 +0100105 if b:lua_lasttick == b:changedtick
Konfekt00b927b2025-04-06 17:40:43 +0200106 return b:lua_foldlists[v:lnum - 1]
Ennofdfcce52024-12-03 22:23:48 +0100107 endif
108 let b:lua_lasttick = b:changedtick
109
110 let b:lua_foldlists = []
111 let foldlist = []
Doug Kearns0b820542025-02-27 19:17:33 +0100112 let buf = getline(1, "$")
Ennofdfcce52024-12-03 22:23:48 +0100113 for line in buf
114 for t in s:patterns
Konfekt00b927b2025-04-06 17:40:43 +0200115 let open = 0
116 let end = 0
Doug Kearns0b820542025-02-27 19:17:33 +0100117 let tagopen = '\v^\s*' .. t[0] ..'\s*$'
Konfekt00b927b2025-04-06 17:40:43 +0200118 let tagend = '\v^\s*' .. t[1] ..'\s*$'
Ennofdfcce52024-12-03 22:23:48 +0100119 if line =~# tagopen
Christian Brabandt2ffb4d02025-04-07 14:07:28 +0200120 call add(foldlist, t)
121 let open = 1
122 break
Konfekt00b927b2025-04-06 17:40:43 +0200123 elseif line =~# tagend
Christian Brabandt2ffb4d02025-04-07 14:07:28 +0200124 if len(foldlist) > 0 && line =~# foldlist[-1][1]
125 call remove(foldlist, -1)
126 let end = 1
127 else
128 let foldlist = []
129 endif
130 break
Ennofdfcce52024-12-03 22:23:48 +0100131 endif
132 endfor
Konfekt00b927b2025-04-06 17:40:43 +0200133 let prefix = ""
134 if open == 1 | let prefix = ">" | endif
135 if end == 1 | let prefix = "<" | endif
136 let b:lua_foldlists += [prefix..(len(foldlist) + end)]
Ennofdfcce52024-12-03 22:23:48 +0100137 endfor
138
Konfekt00b927b2025-04-06 17:40:43 +0200139 return b:lua_foldlists[v:lnum - 1]
Ennofdfcce52024-12-03 22:23:48 +0100140endfunction
141
Konfekt00b927b2025-04-06 17:40:43 +0200142if !has('vim9script')
143 let &cpo = s:cpo_save
144 unlet s:cpo_save
145
146 finish
147endif
148
149delfunction! s:LuaFold
150def s:LuaFold(): string
151 if b:lua_lasttick == b:changedtick
152 return b:lua_foldlists[v:lnum - 1]
153 endif
154 b:lua_lasttick = b:changedtick
155
156 b:lua_foldlists = []
157 var foldlist = []
158 var buf = getline(1, "$")
159 for line in buf
160 var open = 0
161 var end = 0
162 for t in patterns
163 var tagopen = '\v^\s*' .. t[0] .. '\s*$'
164 var tagend = '\v^\s*' .. t[1] .. '\s*$'
165 if line =~# tagopen
Christian Brabandt2ffb4d02025-04-07 14:07:28 +0200166 add(foldlist, t)
167 open = 1
168 break
Konfekt00b927b2025-04-06 17:40:43 +0200169 elseif line =~# tagend
Christian Brabandt2ffb4d02025-04-07 14:07:28 +0200170 if len(foldlist) > 0 && line =~# foldlist[-1][1]
171 end = 1
172 remove(foldlist, -1)
173 else
174 foldlist = []
175 endif
176 break
Konfekt00b927b2025-04-06 17:40:43 +0200177 endif
178 endfor
179 var prefix = ""
180 if open == 1 | prefix = ">" | endif
181 if end == 1 | prefix = "<" | endif
182 b:lua_foldlists += [prefix .. (len(foldlist) + end)]
183 endfor
184 return b:lua_foldlists[v:lnum - 1]
185enddef
186
Bram Moolenaarf1568ec2011-12-14 21:17:39 +0100187let &cpo = s:cpo_save
188unlet s:cpo_save
Christian Brabandt2ffb4d02025-04-07 14:07:28 +0200189
Bram Moolenaar71b6d332022-09-10 13:13:14 +0100190" vim: nowrap sw=2 sts=2 ts=8 noet: