File: lua.vim

package info (click to toggle)
vim 2%3A9.1.1882-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 92,504 kB
  • sloc: ansic: 432,444; cpp: 6,371; makefile: 4,596; sh: 2,387; java: 2,312; xml: 2,099; python: 1,559; perl: 1,419; awk: 730; lisp: 501; cs: 458; objc: 369; sed: 8; csh: 6
file content (190 lines) | stat: -rw-r--r-- 4,879 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
" Vim 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 Vim Project update 'path' setting #17267

if exists("b:did_ftplugin")
  finish
endif
let b:did_ftplugin = 1

" keep in sync with syntax/lua.vim
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&vim

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 Vim 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('vim9script')
  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

" vim: nowrap sw=2 sts=2 ts=8 noet: