Lines Matching refs:s
51 let s:cpo_save = &cpo
58 let s:syng_string =
62 let s:syng_stringdoc = s:syng_string + ['Documentation']
65 let s:syng_strcom = s:syng_stringdoc + [
82 let s:skip_expr =
83 … \ 'index(map('.string(s:syng_strcom).',"hlID(''ruby''.v:val)"), synID(line("."),col("."),1)) >= 0'
86 let s:ruby_indent_keywords =
87 \ '^\s*\zs\<\%(module\|class\|if\|for' .
89 \ '\|\%(\K\k*[!?]\?\s\+\)\=def\):\@!\>' .
90 \ '\|\%([=,*/%+-]\|<<\|>>\|:\s\)\s*\zs' .
94 let s:ruby_deindent_keywords =
95 \ '^\s*\zs\<\%(ensure\|else\|rescue\|elsif\|when\|end\):\@!\>'
98 "let s:end_start_regex = '\%(^\|[^.]\)\<\%(module\|class\|def\|if\|for\|while\|until\|case\|unless\…
100 let s:end_start_regex =
101 \ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' .
103 \ '\|\%(\K\k*[!?]\?\s\+\)\=def\):\@!\>' .
107 let s:end_middle_regex = '\<\%(ensure\|else\|\%(\%(^\|;\)\s*\)\@<=\<rescue:\@!\>\|when\|elsif\):\@!…
110 let s:end_end_regex = '\%(^\|[^.:@$]\)\@<=\<end:\@!\>'
113 let s:end_skip_expr = s:skip_expr .
115 \ ' && getline(".") =~ "^\\s*\\<\\(while\\|until\\|for\\):\\@!\\>")'
118 let s:non_bracket_continuation_regex =
119 … \ '\%([\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|:\@<![^[:alnum:]:][|&?]\|||\|&&\)\s*\%(#.*\)\=$'
122 let s:continuation_regex =
123 …\ '\%(%\@<![({[\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|:\@<![^[:alnum:]:][|&?]\|||\|&&\)\s*\%(#.…
126 let s:continuable_regex =
127 \ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' .
131 let s:bracket_continuation_regex = '%\@<!\%([({[]\)\s*\%(#.*\)\=$'
134 let s:dot_continuation_regex = '%\@<!\.\s*\%(#.*\)\=$'
137 let s:backslash_continuation_regex = '%\@<!\\\s*$'
140 let s:bracket_switch_continuation_regex = '^\([^(]\+\zs).\+\)\+'.s:continuation_regex
143 let s:splat_regex = '[[,(]\s*\*\s*\%(#.*\)\=$'
146 let s:access_modifier_regex = '\C^\s*\%(public\|protected\|private\)\s*\%(#.*\)\=$'
149 let s:indent_access_modifier_regex = '\C^\s*\%(protected\|private\)\s*\%(#.*\)\=$'
153 " Note that there's a slight problem with this regex and s:continuation_regex.
160 let s:block_regex =
161 \ '\%(\<do:\@!\>\|%\@<!{\)\s*\%(|[^|]*|\)\=\s*\%(#.*\)\=$'
163 let s:block_continuation_regex = '^\s*[^])}\t ].*'.s:block_regex
165 " Regex that describes a leading operator (only a method call's dot for now)
166 let s:leading_operator_regex = '^\s*\%(&\=\.\)'
194 \ 's:AccessModifier',
195 \ 's:ClosingBracketOnEmptyLine',
196 \ 's:BlockComment',
197 \ 's:DeindentingKeyword',
198 \ 's:MultilineStringOrLineComment',
199 \ 's:ClosingHeredocDelimiter',
200 \ 's:LeadingOperator',
216 " Special case: we don't need the real s:PrevNonBlankNonString for an empty
220 \ 's:EmptyInsideString',
234 let indent_info.plnum = s:PrevNonBlankNonString(indent_info.clnum - 1)
238 \ 's:StartOfFile',
239 \ 's:AfterAccessModifier',
240 \ 's:ContinuedLine',
241 \ 's:AfterBlockOpening',
242 \ 's:AfterHangingSplat',
243 \ 's:AfterUnbalancedBracket',
244 \ 's:AfterLeadingOperator',
245 \ 's:AfterEndKeyword',
246 \ 's:AfterIndentKeyword',
262 \ 's:PreviousNotMSL',
263 \ 's:IndentingKeywordInMSL',
264 \ 's:ContinuedHangingOperator',
267 " Most Significant line based on the previous one -- in case it's a
269 let indent_info.plnum_msl = s:GetMSL(indent_info.plnum)
283 " By default, just return the previous line's indent
291 function! s:AccessModifier(cline_info) abort
297 if s:Match(info.clnum, s:access_modifier_regex)
298 let class_lnum = s:FindContainingClass()
304 if s:Match(info.clnum, s:access_modifier_regex)
305 let class_lnum = s:FindContainingClass()
315 function! s:ClosingBracketOnEmptyLine(cline_info) abort
320 " others we indent to the containing line's MSL's level. Return -1 if fail.
321 let col = matchend(info.cline, '^\s*[]})]')
323 if col > 0 && !s:IsInStringOrComment(info.clnum, col)
328 if searchpair(escape(bracket_pair[0], '\['), '', bracket_pair[1], 'bW', s:skip_expr) > 0
338 let ind = indent(s:GetMSL(line('.')))
348 function! s:BlockComment(cline_info) abort
350 if match(a:cline_info.cline, '^\s*\%(=begin\|=end\)$') != -1
356 function! s:DeindentingKeyword(cline_info) abort
361 if s:Match(info.clnum, s:ruby_deindent_keywords)
364 if searchpair(s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'bW',
365 \ s:end_skip_expr) > 0
366 let msl = s:GetMSL(line('.'))
369 if s:IsAssignment(line, col('.')) &&
382 elseif getline(msl) =~ '=\s*\(#.*\)\=$'
397 function! s:MultilineStringOrLineComment(cline_info) abort
401 if s:IsInStringOrDocumentation(info.clnum, matchend(info.cline, '^\s*') + 1)
407 function! s:ClosingHeredocDelimiter(cline_info) abort
412 if info.cline =~ '^\k\+\s*$'
413 \ && s:IsInStringDelimiter(info.clnum, 1)
421 function! s:LeadingOperator(cline_info) abort
423 if s:Match(a:cline_info.clnum, s:leading_operator_regex)
424 return indent(s:GetMSL(a:cline_info.clnum)) + a:cline_info.sw
429 function! s:EmptyInsideString(pline_info) abort
431 " too), use the previous line's indent
437 if info.cline =~ '^\s*$'
438 \ && s:IsInStringOrComment(plnum, 1)
439 \ && s:IsInStringOrComment(plnum, strlen(pline))
445 function! s:StartOfFile(pline_info) abort
453 function! s:AfterAccessModifier(pline_info) abort
459 if s:Match(info.plnum, s:indent_access_modifier_regex)
465 if s:Match(info.plnum, s:access_modifier_regex)
479 function! s:ContinuedLine(pline_info) abort
482 let col = s:Match(info.plnum, s:ruby_indent_keywords)
483 if s:Match(info.plnum, s:continuable_regex) &&
484 \ s:Match(info.plnum, s:continuation_regex)
485 if col > 0 && s:IsAssignment(info.pline, col)
494 let ind = indent(s:GetMSL(info.plnum))
501 function! s:AfterBlockOpening(pline_info) abort
505 if s:Match(info.plnum, s:block_regex)
510 let plnum_msl = s:GetMSL(info.plnum)
512 if getline(plnum_msl) =~ '=\s*\(#.*\)\=$'
527 function! s:AfterLeadingOperator(pline_info) abort
528 " If the previous line started with a leading operator, use its MSL's level
530 if s:Match(a:pline_info.plnum, s:leading_operator_regex)
531 return indent(s:GetMSL(a:pline_info.plnum))
536 function! s:AfterHangingSplat(pline_info) abort
540 if info.pline =~ s:splat_regex
546 function! s:AfterUnbalancedBracket(pline_info) abort
555 if info.pline =~ '[[({]' || info.pline =~ '[])}]\s*\%(#.*\)\=$'
556 let [opening, closing] = s:ExtraBrackets(info.plnum)
561 elseif opening.type == '(' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0
575 if s:Match(line('.'), s:ruby_indent_keywords)
578 return indent(s:GetMSL(line('.')))
588 function! s:AfterEndKeyword(pline_info) abort
590 " If the previous line ended with an "end", match that "end"s beginning's
592 let col = s:Match(info.plnum, '\%(^\|[^.:@$]\)\<end\>\s*\%(#.*\)\=$')
595 if searchpair(s:end_start_regex, '', s:end_end_regex, 'bW',
596 \ s:end_skip_expr) > 0
599 let msl = s:GetMSL(n)
609 function! s:AfterIndentKeyword(pline_info) abort
611 let col = s:Match(info.plnum, s:ruby_indent_keywords)
619 if s:Match(info.plnum, s:end_end_regex)
621 elseif s:IsAssignment(info.pline, col)
636 function! s:PreviousNotMSL(msl_info) abort
642 if s:Match(info.plnum, s:bracket_switch_continuation_regex)
646 elseif s:Match(info.plnum, s:non_bracket_continuation_regex)
654 function! s:IndentingKeywordInMSL(msl_info) abort
659 let col = s:Match(info.plnum_msl, s:ruby_indent_keywords)
662 if s:Match(info.plnum_msl, s:end_end_regex)
664 elseif s:IsAssignment(getline(info.plnum_msl), col)
678 function! s:ContinuedHangingOperator(msl_info) abort
683 …if s:Match(info.plnum_msl, s:non_bracket_continuation_regex) && !s:Match(info.plnum_msl, '^\s*\([\…
698 function! s:IsInRubyGroup(groups, lnum, col) abort
704 function! s:IsInStringOrComment(lnum, col) abort
705 return s:IsInRubyGroup(s:syng_strcom, a:lnum, a:col)
709 function! s:IsInString(lnum, col) abort
710 return s:IsInRubyGroup(s:syng_string, a:lnum, a:col)
714 function! s:IsInStringOrDocumentation(lnum, col) abort
715 return s:IsInRubyGroup(s:syng_stringdoc, a:lnum, a:col)
719 function! s:IsInStringDelimiter(lnum, col) abort
720 return s:IsInRubyGroup(
726 function! s:IsAssignment(str, pos) abort
727 return strpart(a:str, 0, a:pos - 1) =~ '=\s*$'
731 function! s:PrevNonBlankNonString(lnum) abort
746 elseif !in_block && line !~ '^\s*#.*$' && !(s:IsInStringOrComment(lnum, 1)
747 \ && s:IsInStringOrComment(lnum, strlen(line)))
756 function! s:GetMSL(lnum) abort
759 let lnum = s:PrevNonBlankNonString(a:lnum - 1)
765 if !s:Match(msl, s:backslash_continuation_regex) &&
766 \ s:Match(lnum, s:backslash_continuation_regex)
768 " does, look for that line's msl
775 elseif s:Match(msl, s:leading_operator_regex)
779 elseif s:Match(lnum, s:splat_regex)
780 " If the above line looks like the "*" of a splat, use the current one's
789 elseif s:Match(lnum, s:non_bracket_continuation_regex) &&
790 \ s:Match(msl, s:non_bracket_continuation_regex)
800 elseif s:Match(lnum, s:dot_continuation_regex) &&
801 \ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex))
812 elseif s:Match(lnum, s:non_bracket_continuation_regex) &&
813 \ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex))
824 elseif s:Match(lnum, s:bracket_continuation_regex) &&
825 \ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex))
827 " block-starter), use the current one's and stop here
834 elseif s:Match(lnum, s:block_regex) &&
835 \ !s:Match(msl, s:continuation_regex) &&
836 \ !s:Match(msl, s:block_continuation_regex)
846 let col = match(line, s:continuation_regex) + 1
847 if (col > 0 && !s:IsInStringOrComment(lnum, col))
848 \ || s:IsInString(lnum, strlen(line))
855 let lnum = s:PrevNonBlankNonString(lnum - 1)
861 function! s:ExtraBrackets(lnum) abort
872 if !s:IsInStringOrComment(a:lnum, pos + 1)
923 function! s:Match(lnum, regex) abort
928 while offset > -1 && s:IsInStringOrComment(a:lnum, col)
940 " Locates the containing class/module's definition line, ignoring nested classes
943 function! s:FindContainingClass() abort
946 while searchpair(s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'bW',
947 \ s:end_skip_expr) > 0
961 let &cpo = s:cpo_save
962 unlet s:cpo_save