Skip to content

Commit 3d30d88

Browse files
committed
Add << foldable_groups option for here document
It's hard to enumerate every case, so just separate to valid/invalid section, see example file for detail.
1 parent 1930020 commit 3d30d88

4 files changed

Lines changed: 253 additions & 9 deletions

File tree

doc/ft-ruby-syntax.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ value is space-separated keywords, known keywords were:
6262
/ Regexp
6363
string String and shell command output (surrounded by ', ", `)
6464
: Symbol
65+
<< Here documents
6566

6667
5. Reducing expensive operations *ruby_no_expensive*
6768

etc/examples/generators/syntax/percent_generator.rb

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,87 @@
282282

283283

284284

285+
# heredoc {{{
286+
# Here Documents
287+
if arg == 'heredoc'
288+
puts "\n# Begin of valid cases {{{\n\n"
289+
290+
%w(' " `).unshift('').each do |quote|
291+
puts <<-END.gsub(/^\s{6}/, '')
292+
<<#{quote}_LABEL#{quote}.?!, foo
293+
bar baz
294+
_LABEL
295+
\n
296+
297+
<<-#{quote}_LABEL#{quote}.?!, foo
298+
bar baz
299+
_LABEL
300+
301+
302+
END
303+
end
304+
305+
puts "# }}} End of valid cases'\n\n"
306+
307+
308+
puts "\n# Begin of INVALID cases {{{\n\n"
309+
310+
# NOTE: for simplification, omit test for different quotes " ' `,
311+
# they are all invalid anyway
312+
313+
%w(class ::).each do |s|
314+
puts <<-END.gsub(/^\s{6}/, '')
315+
#{s}\n <<LABEL
316+
foo
317+
LABEL
318+
319+
320+
END
321+
end
322+
323+
%Q_]})\"'._.split(//).each do |s|
324+
puts <<-END.gsub(/^\s{4}/, '')
325+
#{s} <<LABEL
326+
foo
327+
LABEL
328+
#{" #{s} # close to ensure next case clean" if %w(' ").include?(s)}
329+
330+
END
331+
end
332+
333+
%w(09 aZ _w).each do |s|
334+
puts <<-END.gsub(/^\s{6}/, '')
335+
#{s}<<LABEL
336+
foo
337+
LABEL
338+
339+
340+
END
341+
end
342+
343+
%w(' " `).unshift('').each do |quote|
344+
puts <<-END.gsub(/^\s{6}/, '')
345+
<<LABEL foo<<#{quote}_bar
346+
baz
347+
LABEL
348+
#{" #{quote} # close to ensure next case clean" if %w(' ").include?(quote)}
349+
\n
350+
351+
<<LABEL foo<<-#{quote}_bar
352+
baz
353+
LABEL
354+
#{" #{quote} # close to ensure next case clean" if %w(' ").include?(quote)}
355+
356+
357+
END
358+
end
359+
360+
puts "# }}} End of INVALID cases'\n\n"
361+
end
362+
# }}}
363+
364+
365+
285366
puts "#\svim:foldmethod=syntax"
286367

287368

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
# Generated by `./etc/examples/generators/syntax/percent_generator.rb heredoc > etc/examples/syntax/percent/heredoc.rb`
2+
3+
4+
# Begin of valid cases {{{
5+
6+
<<_LABEL.?!, foo
7+
bar baz
8+
_LABEL
9+
10+
<<-_LABEL.?!, foo
11+
bar baz
12+
_LABEL
13+
14+
15+
<<'_LABEL'.?!, foo
16+
bar baz
17+
_LABEL
18+
19+
<<-'_LABEL'.?!, foo
20+
bar baz
21+
_LABEL
22+
23+
24+
<<"_LABEL".?!, foo
25+
bar baz
26+
_LABEL
27+
28+
<<-"_LABEL".?!, foo
29+
bar baz
30+
_LABEL
31+
32+
33+
<<`_LABEL`.?!, foo
34+
bar baz
35+
_LABEL
36+
37+
<<-`_LABEL`.?!, foo
38+
bar baz
39+
_LABEL
40+
41+
42+
# }}} End of valid cases'
43+
44+
45+
# Begin of INVALID cases {{{
46+
47+
class
48+
<<LABEL
49+
foo
50+
LABEL
51+
52+
53+
::
54+
<<LABEL
55+
foo
56+
LABEL
57+
58+
59+
] <<LABEL
60+
foo
61+
LABEL
62+
63+
64+
} <<LABEL
65+
foo
66+
LABEL
67+
68+
69+
) <<LABEL
70+
foo
71+
LABEL
72+
73+
74+
" <<LABEL
75+
foo
76+
LABEL
77+
" # close to ensure next case clean
78+
79+
' <<LABEL
80+
foo
81+
LABEL
82+
' # close to ensure next case clean
83+
84+
. <<LABEL
85+
foo
86+
LABEL
87+
88+
89+
09<<LABEL
90+
foo
91+
LABEL
92+
93+
94+
aZ<<LABEL
95+
foo
96+
LABEL
97+
98+
99+
_w<<LABEL
100+
foo
101+
LABEL
102+
103+
104+
<<LABEL foo<<_bar
105+
baz
106+
LABEL
107+
108+
109+
<<LABEL foo<<-_bar
110+
baz
111+
LABEL
112+
113+
114+
115+
<<LABEL foo<<'_bar
116+
baz
117+
LABEL
118+
' # close to ensure next case clean
119+
120+
<<LABEL foo<<-'_bar
121+
baz
122+
LABEL
123+
' # close to ensure next case clean
124+
125+
126+
<<LABEL foo<<"_bar
127+
baz
128+
LABEL
129+
" # close to ensure next case clean
130+
131+
<<LABEL foo<<-"_bar
132+
baz
133+
LABEL
134+
" # close to ensure next case clean
135+
136+
137+
<<LABEL foo<<`_bar
138+
baz
139+
LABEL
140+
141+
142+
<<LABEL foo<<-`_bar
143+
baz
144+
LABEL
145+
146+
147+
148+
# }}} End of INVALID cases'
149+
150+
# vim:foldmethod=syntax

syntax/ruby.vim

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -273,15 +273,27 @@ syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*
273273
syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs'\%([^']*\)'+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
274274
syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs`\%([^`]*\)`+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
275275

276-
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend
277-
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<"\z([^"]*\)"\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend
278-
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<'\z([^']*\)'\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc fold keepend
279-
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<`\z([^`]*\)`\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend
280-
281-
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
282-
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-"\z([^"]*\)"\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
283-
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-'\z([^']*\)'\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart fold keepend
284-
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-`\z([^`]*\)`\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
276+
if s:foldable('<<')
277+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend
278+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<"\z([^"]*\)"\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend
279+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<'\z([^']*\)'\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc fold keepend
280+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<`\z([^`]*\)`\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend
281+
282+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
283+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-"\z([^"]*\)"\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
284+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-'\z([^']*\)'\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart fold keepend
285+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-`\z([^`]*\)`\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
286+
else
287+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial keepend
288+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<"\z([^"]*\)"\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial keepend
289+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<'\z([^']*\)'\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc keepend
290+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<`\z([^`]*\)`\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial keepend
291+
292+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
293+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-"\z([^"]*\)"\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
294+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-'\z([^']*\)'\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart keepend
295+
syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<-`\z([^`]*\)`\ze\%(.*<<-\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
296+
endif
285297

286298
if exists('main_syntax') && main_syntax == 'eruby'
287299
let b:ruby_no_expensive = 1

0 commit comments

Comments
 (0)