mirror of
https://github.com/sheerun/vim-polyglot.git
synced 2025-11-15 23:13:50 -05:00
Update
This commit is contained in:
@@ -129,17 +129,17 @@ let s:access_modifier_regex = '\C^\s*\%(public\|protected\|private\)\s*\%(#.*\)\
|
||||
|
||||
" Check if the character at lnum:col is inside a string, comment, or is ascii.
|
||||
function s:IsInStringOrComment(lnum, col)
|
||||
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom
|
||||
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~# s:syng_strcom
|
||||
endfunction
|
||||
|
||||
" Check if the character at lnum:col is inside a string.
|
||||
function s:IsInString(lnum, col)
|
||||
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_string
|
||||
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~# s:syng_string
|
||||
endfunction
|
||||
|
||||
" Check if the character at lnum:col is inside a string or documentation.
|
||||
function s:IsInStringOrDocumentation(lnum, col)
|
||||
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_stringdoc
|
||||
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~# s:syng_stringdoc
|
||||
endfunction
|
||||
|
||||
" Check if the character at lnum:col is inside a string delimiter
|
||||
|
||||
@@ -36,6 +36,10 @@ if !exists('g:python_pep8_indent_multiline_string')
|
||||
let g:python_pep8_indent_multiline_string = 0
|
||||
endif
|
||||
|
||||
if !exists('g:python_pep8_indent_hang_closing')
|
||||
let g:python_pep8_indent_hang_closing = 0
|
||||
endif
|
||||
|
||||
let s:block_rules = {
|
||||
\ '^\s*elif\>': ['if', 'elif'],
|
||||
\ '^\s*except\>': ['try', 'except'],
|
||||
@@ -59,7 +63,7 @@ let s:stop_statement = '^\s*\(break\|continue\|raise\|return\|pass\)\>'
|
||||
" jedi* refers to syntax definitions from jedi-vim for call signatures, which
|
||||
" are inserted temporarily into the buffer.
|
||||
let s:skip_special_chars = 'synIDattr(synID(line("."), col("."), 0), "name") ' .
|
||||
\ '=~? "\\vstring|comment|jedi\\S"'
|
||||
\ '=~? "\\vstring|comment|^pythonbytes%(contents)=$|jedi\\S"'
|
||||
|
||||
let s:skip_after_opening_paren = 'synIDattr(synID(line("."), col("."), 0), "name") ' .
|
||||
\ '=~? "\\vcomment|jedi\\S"'
|
||||
@@ -90,14 +94,6 @@ else
|
||||
endfunction
|
||||
endif
|
||||
|
||||
function! s:pair_sort(x, y)
|
||||
if a:x[0] == a:y[0]
|
||||
return a:x[1] == a:y[1] ? 0 : a:x[1] > a:y[1] ? 1 : -1
|
||||
else
|
||||
return a:x[0] > a:y[0] ? 1 : -1
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" Find backwards the closest open parenthesis/bracket/brace.
|
||||
function! s:find_opening_paren(...)
|
||||
" optional arguments: line and column (defaults to 1) to search around
|
||||
@@ -144,27 +140,21 @@ endfunction
|
||||
" Find possible indent(s) of the block starter that matches the current line.
|
||||
function! s:find_start_of_block(lnum, types, multiple)
|
||||
let r = []
|
||||
let types = copy(a:types)
|
||||
let re = '\V\^\s\*\('.join(a:types, '\|').'\)\>'
|
||||
let lnum = a:lnum
|
||||
let last_indent = indent(lnum) + 1
|
||||
while lnum > 0 && last_indent > 0
|
||||
let indent = indent(lnum)
|
||||
if indent < last_indent
|
||||
for type in types
|
||||
let re = '\v^\s*'.type.'>'
|
||||
if getline(lnum) =~# re
|
||||
if !a:multiple
|
||||
return [indent]
|
||||
endif
|
||||
if index(r, indent) == -1
|
||||
let r += [indent]
|
||||
endif
|
||||
" Remove any handled type, e.g. 'if'.
|
||||
call remove(types, index(types, type))
|
||||
if getline(lnum) =~# re
|
||||
if !a:multiple
|
||||
return [indent]
|
||||
endif
|
||||
endfor
|
||||
let last_indent = indent(lnum)
|
||||
if index(r, indent) == -1
|
||||
let r += [indent]
|
||||
endif
|
||||
let last_indent = indent
|
||||
endif
|
||||
endif
|
||||
let lnum = prevnonblank(lnum - 1)
|
||||
endwhile
|
||||
@@ -205,8 +195,11 @@ function! s:indent_like_opening_paren(lnum)
|
||||
\ s:skip_after_opening_paren, paren_lnum, paren_col+1)
|
||||
let starts_with_closing_paren = getline(a:lnum) =~# '^\s*[])}]'
|
||||
|
||||
let hang_closing = get(b:, 'python_pep8_indent_hang_closing',
|
||||
\ get(g:, 'python_pep8_indent_hang_closing', 0))
|
||||
|
||||
if nothing_after_opening_paren
|
||||
if starts_with_closing_paren
|
||||
if starts_with_closing_paren && !hang_closing
|
||||
let res = base
|
||||
else
|
||||
let res = base + s:sw()
|
||||
@@ -220,10 +213,13 @@ function! s:indent_like_opening_paren(lnum)
|
||||
" indent further to distinguish the continuation line
|
||||
" from the next logical line.
|
||||
if text =~# b:control_statement && res == base + s:sw()
|
||||
return base + s:sw() * 2
|
||||
else
|
||||
return res
|
||||
" But only if not inside parens itself (Flake's E127).
|
||||
let [paren_lnum, _] = s:find_opening_paren(paren_lnum)
|
||||
if paren_lnum <= 0
|
||||
return res + s:sw()
|
||||
endif
|
||||
endif
|
||||
return res
|
||||
endfunction
|
||||
|
||||
" Match indent of first block of this type.
|
||||
@@ -337,11 +333,11 @@ endfunction
|
||||
" Is the syntax at lnum (and optionally cnum) a python string?
|
||||
function! s:is_python_string(lnum, ...)
|
||||
let line = getline(a:lnum)
|
||||
let linelen = len(line)
|
||||
if linelen < 1
|
||||
let linelen = 1
|
||||
if a:0
|
||||
let cols = type(a:1) != type([]) ? [a:1] : a:1
|
||||
else
|
||||
let cols = range(1, max([1, len(line)]))
|
||||
endif
|
||||
let cols = a:0 ? type(a:1) != type([]) ? [a:1] : a:1 : range(1, linelen)
|
||||
for cnum in cols
|
||||
if match(map(synstack(a:lnum, cnum),
|
||||
\ "synIDattr(v:val, 'name')"), 'python\S*String') == -1
|
||||
@@ -361,7 +357,7 @@ function! GetPythonPEPIndent(lnum)
|
||||
let prevline = getline(a:lnum-1)
|
||||
|
||||
" Multilinestrings: continous, docstring or starting.
|
||||
if s:is_python_string(a:lnum-1, len(prevline))
|
||||
if s:is_python_string(a:lnum-1, max([1, len(prevline)]))
|
||||
\ && (s:is_python_string(a:lnum, 1)
|
||||
\ || match(line, '^\%("""\|''''''\)') != -1)
|
||||
|
||||
@@ -379,8 +375,8 @@ function! GetPythonPEPIndent(lnum)
|
||||
endif
|
||||
|
||||
if s:is_python_string(a:lnum-1)
|
||||
" Previous line is (completely) a string.
|
||||
return indent(a:lnum-1)
|
||||
" Previous line is (completely) a string: keep current indent.
|
||||
return -1
|
||||
endif
|
||||
|
||||
if match(prevline, '^\s*\%("""\|''''''\)') != -1
|
||||
|
||||
@@ -6,7 +6,7 @@ endif
|
||||
let b:did_indent = 1
|
||||
|
||||
setlocal cindent
|
||||
setlocal cinoptions+=j1,J1
|
||||
setlocal cinoptions+=j1,J1,(2s,u2s,U1,m1,+2s
|
||||
|
||||
setlocal indentexpr=DartIndent()
|
||||
|
||||
|
||||
@@ -26,17 +26,6 @@ if exists("*GoIndent")
|
||||
finish
|
||||
endif
|
||||
|
||||
" use shiftwidth function only if it's available
|
||||
if exists('*shiftwidth')
|
||||
func s:sw()
|
||||
return shiftwidth()
|
||||
endfunc
|
||||
else
|
||||
func s:sw()
|
||||
return &sw
|
||||
endfunc
|
||||
endif
|
||||
|
||||
function! GoIndent(lnum)
|
||||
let prevlnum = prevnonblank(a:lnum-1)
|
||||
if prevlnum == 0
|
||||
@@ -51,19 +40,23 @@ function! GoIndent(lnum)
|
||||
|
||||
let ind = previ
|
||||
|
||||
if prevl =~ ' = `[^`]*$'
|
||||
" previous line started a multi-line raw string
|
||||
return 0
|
||||
endif
|
||||
if prevl =~ '[({]\s*$'
|
||||
" previous line opened a block
|
||||
let ind += s:sw()
|
||||
let ind += shiftwidth()
|
||||
endif
|
||||
if prevl =~# '^\s*\(case .*\|default\):$'
|
||||
" previous line is part of a switch statement
|
||||
let ind += s:sw()
|
||||
let ind += shiftwidth()
|
||||
endif
|
||||
" TODO: handle if the previous line is a label.
|
||||
|
||||
if thisl =~ '^\s*[)}]'
|
||||
" this line closed a block
|
||||
let ind -= s:sw()
|
||||
let ind -= shiftwidth()
|
||||
endif
|
||||
|
||||
" Colons are tricky.
|
||||
@@ -71,7 +64,7 @@ function! GoIndent(lnum)
|
||||
" We ignore trying to deal with jump labels because (a) they're rare, and
|
||||
" (b) they're hard to disambiguate from a composite literal key.
|
||||
if thisl =~# '^\s*\(case .*\|default\):$'
|
||||
let ind -= s:sw()
|
||||
let ind -= shiftwidth()
|
||||
endif
|
||||
|
||||
return ind
|
||||
|
||||
@@ -50,8 +50,9 @@ function GetJuliaNestingStruct(lnum, ...)
|
||||
let e = a:0 > 1 ? a:2 : -1
|
||||
let blocks_stack = []
|
||||
let num_closed_blocks = 0
|
||||
let tt = get(b:, 'julia_syntax_version', 10) == 6 ? '\|\%(\%(abstract\|primitive\)\s\+\)\@<!type' : ''
|
||||
while 1
|
||||
let fb = JuliaMatch(a:lnum, line, '@\@<!\<\%(if\|else\%(if\)\=\|while\|for\|try\|catch\|finally\|\%(staged\)\?function\|macro\|begin\|mutable\s\+struct\|\%(mutable\s\+\)\@<!struct\|\%(abstract\|primitive\)\s\+type\|\%(\%(abstract\|primitive\)\s\+\)\@<!type\|immutable\|let\|\%(bare\)\?module\|quote\|do\)\>', s, e)
|
||||
let fb = JuliaMatch(a:lnum, line, '@\@<!\<\%(if\|else\%(if\)\?\|while\|for\|try\|catch\|finally\|\%(staged\)\?function\|macro\|begin\|mutable\s\+struct\|\%(mutable\s\+\)\@<!struct\|\%(abstract\|primitive\)\s\+type\|immutable\|let\|\%(bare\)\?module\|quote\|do'.tt.'\)\>', s, e)
|
||||
let fe = JuliaMatch(a:lnum, line, '@\@<!\<end\>', s, e)
|
||||
|
||||
if fb < 0 && fe < 0
|
||||
@@ -133,7 +134,7 @@ function GetJuliaNestingStruct(lnum, ...)
|
||||
continue
|
||||
endif
|
||||
|
||||
let i = JuliaMatch(a:lnum, line, '@\@<!\<\%(while\|for\|\%(staged\)\?function\|macro\|begin\|\%(mutable\s\+\)\?struct\|\%(\%(abstract\|primitive\)\s\+\)\?type\|immutable\|let\|quote\|do\)\>', s)
|
||||
let i = JuliaMatch(a:lnum, line, '@\@<!\<\%(while\|for\|\%(staged\)\?function\|macro\|begin\|\%(mutable\s\+\)\?struct\|\%(abstract\|primitive\)\s\+type\|immutable\|let\|quote\|do'.tt.'\)\>', s)
|
||||
if i >= 0 && i == fb
|
||||
if match(line, '\C\<\%(mutable\|abstract\|primitive\)', i) != -1
|
||||
let s = i+11
|
||||
|
||||
@@ -7,15 +7,15 @@ setlocal indentexpr=GetMarkdownIndent()
|
||||
setlocal nolisp
|
||||
setlocal autoindent
|
||||
|
||||
" Automatically insert bullets
|
||||
setlocal formatoptions+=r
|
||||
" Do not automatically insert bullets when auto-wrapping with text-width
|
||||
setlocal formatoptions-=c
|
||||
" Accept various markers as bullets
|
||||
setlocal comments=b:*,b:+,b:-
|
||||
|
||||
" Automatically continue blockquote on line break
|
||||
setlocal comments+=b:>
|
||||
setlocal formatoptions+=r
|
||||
setlocal comments=b:>
|
||||
if get(g:, "vim_markdown_auto_insert_bullets", 1)
|
||||
" Do not automatically insert bullets when auto-wrapping with text-width
|
||||
setlocal formatoptions-=c
|
||||
" Accept various markers as bullets
|
||||
setlocal comments+=b:*,b:+,b:-
|
||||
endif
|
||||
|
||||
" Only define the function once
|
||||
if exists("*GetMarkdownIndent") | finish | endif
|
||||
|
||||
@@ -11,7 +11,7 @@ endif
|
||||
let b:did_indent = 1
|
||||
|
||||
setlocal indentexpr=GetNixIndent()
|
||||
setlocal indentkeys+=0=then,0=else,0=inherit,*<Return>
|
||||
setlocal indentkeys+=0=then,0=else,0=inherit,0=in,*<Return>
|
||||
|
||||
if exists("*GetNixIndent")
|
||||
finish
|
||||
@@ -21,8 +21,8 @@ let s:cpo_save = &cpo
|
||||
set cpo&vim
|
||||
|
||||
let s:skip_syntax = '\%(Comment\|String\)$'
|
||||
let s:binding_open = '\%(\<let\>\|{\)'
|
||||
let s:binding_close = '\%(\<in\>\|}\)'
|
||||
let s:binding_open = '\%(\<let\>\)'
|
||||
let s:binding_close = '\%(\<in\>\)'
|
||||
let s:block_open = '\%({\|[\)'
|
||||
let s:block_close = '\%(}\|]\)'
|
||||
|
||||
@@ -54,14 +54,6 @@ function! GetNixIndent()
|
||||
return indent(bslnum)
|
||||
endif
|
||||
|
||||
if last_line =~ ';$'
|
||||
let bslnum = searchpair(s:binding_open, '', s:binding_close, 'bnW',
|
||||
\ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "StringSpecial$"')
|
||||
if bslnum != 0
|
||||
let ind = indent(bslnum) + &sw
|
||||
endif
|
||||
endif
|
||||
|
||||
if last_line =~ s:block_open . '\s*$'
|
||||
let ind += &sw
|
||||
endif
|
||||
@@ -78,7 +70,7 @@ function! GetNixIndent()
|
||||
let ind += &sw
|
||||
endif
|
||||
|
||||
if getline(v:lnum - 1) =~ '^\<in\s*$'
|
||||
if last_line =~ '^\<in\s*$'
|
||||
let ind += &sw
|
||||
endif
|
||||
|
||||
|
||||
@@ -36,6 +36,10 @@ if !exists('g:python_pep8_indent_multiline_string')
|
||||
let g:python_pep8_indent_multiline_string = 0
|
||||
endif
|
||||
|
||||
if !exists('g:python_pep8_indent_hang_closing')
|
||||
let g:python_pep8_indent_hang_closing = 0
|
||||
endif
|
||||
|
||||
let s:block_rules = {
|
||||
\ '^\s*elif\>': ['if', 'elif'],
|
||||
\ '^\s*except\>': ['try', 'except'],
|
||||
@@ -59,7 +63,7 @@ let s:stop_statement = '^\s*\(break\|continue\|raise\|return\|pass\)\>'
|
||||
" jedi* refers to syntax definitions from jedi-vim for call signatures, which
|
||||
" are inserted temporarily into the buffer.
|
||||
let s:skip_special_chars = 'synIDattr(synID(line("."), col("."), 0), "name") ' .
|
||||
\ '=~? "\\vstring|comment|jedi\\S"'
|
||||
\ '=~? "\\vstring|comment|^pythonbytes%(contents)=$|jedi\\S"'
|
||||
|
||||
let s:skip_after_opening_paren = 'synIDattr(synID(line("."), col("."), 0), "name") ' .
|
||||
\ '=~? "\\vcomment|jedi\\S"'
|
||||
@@ -90,14 +94,6 @@ else
|
||||
endfunction
|
||||
endif
|
||||
|
||||
function! s:pair_sort(x, y)
|
||||
if a:x[0] == a:y[0]
|
||||
return a:x[1] == a:y[1] ? 0 : a:x[1] > a:y[1] ? 1 : -1
|
||||
else
|
||||
return a:x[0] > a:y[0] ? 1 : -1
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" Find backwards the closest open parenthesis/bracket/brace.
|
||||
function! s:find_opening_paren(...)
|
||||
" optional arguments: line and column (defaults to 1) to search around
|
||||
@@ -144,27 +140,21 @@ endfunction
|
||||
" Find possible indent(s) of the block starter that matches the current line.
|
||||
function! s:find_start_of_block(lnum, types, multiple)
|
||||
let r = []
|
||||
let types = copy(a:types)
|
||||
let re = '\V\^\s\*\('.join(a:types, '\|').'\)\>'
|
||||
let lnum = a:lnum
|
||||
let last_indent = indent(lnum) + 1
|
||||
while lnum > 0 && last_indent > 0
|
||||
let indent = indent(lnum)
|
||||
if indent < last_indent
|
||||
for type in types
|
||||
let re = '\v^\s*'.type.'>'
|
||||
if getline(lnum) =~# re
|
||||
if !a:multiple
|
||||
return [indent]
|
||||
endif
|
||||
if index(r, indent) == -1
|
||||
let r += [indent]
|
||||
endif
|
||||
" Remove any handled type, e.g. 'if'.
|
||||
call remove(types, index(types, type))
|
||||
if getline(lnum) =~# re
|
||||
if !a:multiple
|
||||
return [indent]
|
||||
endif
|
||||
endfor
|
||||
let last_indent = indent(lnum)
|
||||
if index(r, indent) == -1
|
||||
let r += [indent]
|
||||
endif
|
||||
let last_indent = indent
|
||||
endif
|
||||
endif
|
||||
let lnum = prevnonblank(lnum - 1)
|
||||
endwhile
|
||||
@@ -205,8 +195,11 @@ function! s:indent_like_opening_paren(lnum)
|
||||
\ s:skip_after_opening_paren, paren_lnum, paren_col+1)
|
||||
let starts_with_closing_paren = getline(a:lnum) =~# '^\s*[])}]'
|
||||
|
||||
let hang_closing = get(b:, 'python_pep8_indent_hang_closing',
|
||||
\ get(g:, 'python_pep8_indent_hang_closing', 0))
|
||||
|
||||
if nothing_after_opening_paren
|
||||
if starts_with_closing_paren
|
||||
if starts_with_closing_paren && !hang_closing
|
||||
let res = base
|
||||
else
|
||||
let res = base + s:sw()
|
||||
@@ -220,10 +213,13 @@ function! s:indent_like_opening_paren(lnum)
|
||||
" indent further to distinguish the continuation line
|
||||
" from the next logical line.
|
||||
if text =~# b:control_statement && res == base + s:sw()
|
||||
return base + s:sw() * 2
|
||||
else
|
||||
return res
|
||||
" But only if not inside parens itself (Flake's E127).
|
||||
let [paren_lnum, _] = s:find_opening_paren(paren_lnum)
|
||||
if paren_lnum <= 0
|
||||
return res + s:sw()
|
||||
endif
|
||||
endif
|
||||
return res
|
||||
endfunction
|
||||
|
||||
" Match indent of first block of this type.
|
||||
@@ -337,11 +333,11 @@ endfunction
|
||||
" Is the syntax at lnum (and optionally cnum) a python string?
|
||||
function! s:is_python_string(lnum, ...)
|
||||
let line = getline(a:lnum)
|
||||
let linelen = len(line)
|
||||
if linelen < 1
|
||||
let linelen = 1
|
||||
if a:0
|
||||
let cols = type(a:1) != type([]) ? [a:1] : a:1
|
||||
else
|
||||
let cols = range(1, max([1, len(line)]))
|
||||
endif
|
||||
let cols = a:0 ? type(a:1) != type([]) ? [a:1] : a:1 : range(1, linelen)
|
||||
for cnum in cols
|
||||
if match(map(synstack(a:lnum, cnum),
|
||||
\ "synIDattr(v:val, 'name')"), 'python\S*String') == -1
|
||||
@@ -361,7 +357,7 @@ function! GetPythonPEPIndent(lnum)
|
||||
let prevline = getline(a:lnum-1)
|
||||
|
||||
" Multilinestrings: continous, docstring or starting.
|
||||
if s:is_python_string(a:lnum-1, len(prevline))
|
||||
if s:is_python_string(a:lnum-1, max([1, len(prevline)]))
|
||||
\ && (s:is_python_string(a:lnum, 1)
|
||||
\ || match(line, '^\%("""\|''''''\)') != -1)
|
||||
|
||||
@@ -379,8 +375,8 @@ function! GetPythonPEPIndent(lnum)
|
||||
endif
|
||||
|
||||
if s:is_python_string(a:lnum-1)
|
||||
" Previous line is (completely) a string.
|
||||
return indent(a:lnum-1)
|
||||
" Previous line is (completely) a string: keep current indent.
|
||||
return -1
|
||||
endif
|
||||
|
||||
if match(prevline, '^\s*\%("""\|''''''\)') != -1
|
||||
|
||||
@@ -69,7 +69,7 @@ let s:skip_expr =
|
||||
let s:ruby_indent_keywords =
|
||||
\ '^\s*\zs\<\%(module\|class\|if\|for' .
|
||||
\ '\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure\|rescue' .
|
||||
\ '\|\%(public\|protected\|private\)\=\s*def\):\@!\>' .
|
||||
\ '\|\%(\K\k*[!?]\?\)\=\s*def\):\@!\>' .
|
||||
\ '\|\%([=,*/%+-]\|<<\|>>\|:\s\)\s*\zs' .
|
||||
\ '\<\%(if\|for\|while\|until\|case\|unless\|begin\):\@!\>'
|
||||
|
||||
@@ -83,7 +83,7 @@ let s:ruby_deindent_keywords =
|
||||
let s:end_start_regex =
|
||||
\ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' .
|
||||
\ '\<\%(module\|class\|if\|for\|while\|until\|case\|unless\|begin' .
|
||||
\ '\|\%(public\|protected\|private\)\=\s*def\):\@!\>' .
|
||||
\ '\|\%(\K\k*[!?]\?\)\=\s*def\):\@!\>' .
|
||||
\ '\|\%(^\|[^.:@$]\)\@<=\<do:\@!\>'
|
||||
|
||||
" Regex that defines the middle-match for the 'end' keyword.
|
||||
@@ -195,8 +195,29 @@ function! GetRubyIndent(...) abort
|
||||
|
||||
" 2.3. Work on the previous line. {{{2
|
||||
" -------------------------------
|
||||
|
||||
" Special case: we don't need the real s:PrevNonBlankNonString for an empty
|
||||
" line inside a string. And that call can be quite expensive in that
|
||||
" particular situation.
|
||||
let indent_callback_names = [
|
||||
\ 's:EmptyInsideString',
|
||||
\ ]
|
||||
|
||||
for callback_name in indent_callback_names
|
||||
" Decho "Running: ".callback_name
|
||||
let indent = call(function(callback_name), [indent_info])
|
||||
|
||||
if indent >= 0
|
||||
" Decho "Match: ".callback_name." indent=".indent." info=".string(indent_info)
|
||||
return indent
|
||||
endif
|
||||
endfor
|
||||
|
||||
" Previous line number
|
||||
let indent_info.plnum = s:PrevNonBlankNonString(indent_info.clnum - 1)
|
||||
let indent_info.pline = getline(indent_info.plnum)
|
||||
|
||||
let indent_callback_names = [
|
||||
\ 's:StartOfFile',
|
||||
\ 's:AfterAccessModifier',
|
||||
\ 's:ContinuedLine',
|
||||
@@ -208,10 +229,6 @@ function! GetRubyIndent(...) abort
|
||||
\ 's:AfterIndentKeyword',
|
||||
\ ]
|
||||
|
||||
" Previous line number
|
||||
let indent_info.plnum = s:PrevNonBlankNonString(indent_info.clnum - 1)
|
||||
let indent_info.pline = getline(indent_info.plnum)
|
||||
|
||||
for callback_name in indent_callback_names
|
||||
" Decho "Running: ".callback_name
|
||||
let indent = call(function(callback_name), [indent_info])
|
||||
@@ -389,12 +406,17 @@ function! s:LeadingOperator(cline_info) abort
|
||||
endfunction
|
||||
|
||||
function! s:EmptyInsideString(pline_info) abort
|
||||
" If the line is empty and inside a string (plnum would not be the real
|
||||
" prevnonblank in that case), use the previous line's indent
|
||||
" If the line is empty and inside a string (the previous line is a string,
|
||||
" too), use the previous line's indent
|
||||
let info = a:pline_info
|
||||
|
||||
if info.cline =~ '^\s*$' && info.plnum != prevnonblank(info.clnum - 1)
|
||||
return indent(prevnonblank(info.clnum))
|
||||
let plnum = prevnonblank(info.clnum - 1)
|
||||
let pline = getline(plnum)
|
||||
|
||||
if info.cline =~ '^\s*$'
|
||||
\ && s:IsInStringOrComment(plnum, 1)
|
||||
\ && s:IsInStringOrComment(plnum, strlen(pline))
|
||||
return indent(plnum)
|
||||
endif
|
||||
return -1
|
||||
endfunction
|
||||
|
||||
@@ -31,8 +31,10 @@ if exists("*GetRustIndent")
|
||||
finish
|
||||
endif
|
||||
|
||||
" vint: -ProhibitAbbreviationOption
|
||||
let s:save_cpo = &cpo
|
||||
set cpo&vim
|
||||
" vint: +ProhibitAbbreviationOption
|
||||
|
||||
" Come here when loading the script the first time.
|
||||
|
||||
@@ -46,12 +48,12 @@ function! s:get_line_trimmed(lnum)
|
||||
" If the last character in the line is a comment, do a binary search for
|
||||
" the start of the comment. synID() is slow, a linear search would take
|
||||
" too long on a long line.
|
||||
if synIDattr(synID(a:lnum, line_len, 1), "name") =~ 'Comment\|Todo'
|
||||
if synIDattr(synID(a:lnum, line_len, 1), "name") =~? 'Comment\|Todo'
|
||||
let min = 1
|
||||
let max = line_len
|
||||
while min < max
|
||||
let col = (min + max) / 2
|
||||
if synIDattr(synID(a:lnum, col, 1), "name") =~ 'Comment\|Todo'
|
||||
if synIDattr(synID(a:lnum, col, 1), "name") =~? 'Comment\|Todo'
|
||||
let max = col
|
||||
else
|
||||
let min = col + 1
|
||||
@@ -71,7 +73,7 @@ function! s:is_string_comment(lnum, col)
|
||||
if has('syntax_items')
|
||||
for id in synstack(a:lnum, a:col)
|
||||
let synname = synIDattr(id, "name")
|
||||
if synname == "rustString" || synname =~ "^rustComment"
|
||||
if synname ==# "rustString" || synname =~# "^rustComment"
|
||||
return 1
|
||||
endif
|
||||
endfor
|
||||
@@ -90,13 +92,13 @@ function GetRustIndent(lnum)
|
||||
|
||||
if has('syntax_items')
|
||||
let synname = synIDattr(synID(a:lnum, 1, 1), "name")
|
||||
if synname == "rustString"
|
||||
if synname ==# "rustString"
|
||||
" If the start of the line is in a string, don't change the indent
|
||||
return -1
|
||||
elseif synname =~ '\(Comment\|Todo\)'
|
||||
\ && line !~ '^\s*/\*' " not /* opening line
|
||||
if synname =~ "CommentML" " multi-line
|
||||
if line !~ '^\s*\*' && getline(a:lnum - 1) =~ '^\s*/\*'
|
||||
elseif synname =~? '\(Comment\|Todo\)'
|
||||
\ && line !~# '^\s*/\*' " not /* opening line
|
||||
if synname =~? "CommentML" " multi-line
|
||||
if line !~# '^\s*\*' && getline(a:lnum - 1) =~# '^\s*/\*'
|
||||
" This is (hopefully) the line after a /*, and it has no
|
||||
" leader, so the correct indentation is that of the
|
||||
" previous line.
|
||||
@@ -123,22 +125,22 @@ function GetRustIndent(lnum)
|
||||
" Search backwards for the previous non-empty line.
|
||||
let prevlinenum = prevnonblank(a:lnum - 1)
|
||||
let prevline = s:get_line_trimmed(prevlinenum)
|
||||
while prevlinenum > 1 && prevline !~ '[^[:blank:]]'
|
||||
while prevlinenum > 1 && prevline !~# '[^[:blank:]]'
|
||||
let prevlinenum = prevnonblank(prevlinenum - 1)
|
||||
let prevline = s:get_line_trimmed(prevlinenum)
|
||||
endwhile
|
||||
|
||||
" Handle where clauses nicely: subsequent values should line up nicely.
|
||||
if prevline[len(prevline) - 1] == ","
|
||||
if prevline[len(prevline) - 1] ==# ","
|
||||
\ && prevline =~# '^\s*where\s'
|
||||
return indent(prevlinenum) + 6
|
||||
endif
|
||||
|
||||
if prevline[len(prevline) - 1] == ","
|
||||
\ && s:get_line_trimmed(a:lnum) !~ '^\s*[\[\]{}]'
|
||||
\ && prevline !~ '^\s*fn\s'
|
||||
\ && prevline !~ '([^()]\+,$'
|
||||
\ && s:get_line_trimmed(a:lnum) !~ '^\s*\S\+\s*=>'
|
||||
if prevline[len(prevline) - 1] ==# ","
|
||||
\ && s:get_line_trimmed(a:lnum) !~# '^\s*[\[\]{}]'
|
||||
\ && prevline !~# '^\s*fn\s'
|
||||
\ && prevline !~# '([^()]\+,$'
|
||||
\ && s:get_line_trimmed(a:lnum) !~# '^\s*\S\+\s*=>'
|
||||
" Oh ho! The previous line ended in a comma! I bet cindent will try to
|
||||
" take this too far... For now, let's normally use the previous line's
|
||||
" indent.
|
||||
@@ -197,7 +199,7 @@ function GetRustIndent(lnum)
|
||||
else
|
||||
" At the module scope, inside square brackets only
|
||||
"if getline(a:lnum)[0] == ']' || search('\[', '', '\]', 'nW') == a:lnum
|
||||
if line =~ "^\\s*]"
|
||||
if line =~# "^\\s*]"
|
||||
" It's the closing line, dedent it
|
||||
return 0
|
||||
else
|
||||
@@ -211,8 +213,10 @@ function GetRustIndent(lnum)
|
||||
return cindent(a:lnum)
|
||||
endfunction
|
||||
|
||||
" vint: -ProhibitAbbreviationOption
|
||||
let &cpo = s:save_cpo
|
||||
unlet s:save_cpo
|
||||
" vint: +ProhibitAbbreviationOption
|
||||
|
||||
" vim: set et sw=4 sts=4 ts=8:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user