diff options
| author | Adam Stankiewicz <sheerun@sher.pl> | 2015-03-08 21:50:10 -0700 | 
|---|---|---|
| committer | Adam Stankiewicz <sheerun@sher.pl> | 2015-03-08 21:50:10 -0700 | 
| commit | f24fecc338b5129a47c343f61daad2c2fe7a4ab0 (patch) | |
| tree | 8d3d42701c411d711420d779c7cd8d05b145cfe2 /indent | |
| parent | 23913e0598d23ec5948b71ea78c549b39cecf764 (diff) | |
| download | vim-polyglot-f24fecc338b5129a47c343f61daad2c2fe7a4ab0.tar.gz vim-polyglot-f24fecc338b5129a47c343f61daad2c2fe7a4ab0.zip | |
Change JSON provider to sheerun/vim-json, closes #51v1.13.0
Diffstat (limited to 'indent')
| -rw-r--r-- | indent/json.vim | 169 | 
1 files changed, 169 insertions, 0 deletions
| diff --git a/indent/json.vim b/indent/json.vim new file mode 100644 index 00000000..9e563ad4 --- /dev/null +++ b/indent/json.vim @@ -0,0 +1,169 @@ +" Vim indent file +" Language:		JSON +" Mantainer:		Eli Parra <eli@elzr.com> https://github.com/elzr/vim-json +" Last Change:          2014-05-13: merged Fix for square bracket matching by Jakar  +"   https://github.com/jakar/vim-json/commit/20b650e22aa750c4ab6a66aa646bdd95d7cd548a#diff-e81fc111b2052e306d126bd9989f7b7c +" Original Author:	Rogerz Zhang <rogerz.zhang at gmail.com> http://github.com/rogerz/vim-json +" Acknowledgement:      Based off of vim-javascript maintained by Darrick Wiebe  +"                       http://www.vim.org/scripts/script.php?script_id=2765 + +" 0. Initialization {{{1 +" ================= + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") +  finish +endif +let b:did_indent = 1 + +setlocal nosmartindent + +" Now, set up our indentation expression and keys that trigger it. +setlocal indentexpr=GetJSONIndent() +setlocal indentkeys=0{,0},0),0[,0],!^F,o,O,e + +" Only define the function once. +if exists("*GetJSONIndent") +  finish +endif + +let s:cpo_save = &cpo +set cpo&vim + +" 1. Variables {{{1 +" ============ + +let s:line_term = '\s*\%(\%(\/\/\).*\)\=$' +" Regex that defines blocks. +let s:block_regex = '\%({\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term + +" 2. Auxiliary Functions {{{1 +" ====================== + +" 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') == jsonString +endfunction + +" Find line above 'lnum' that isn't empty, or in a string. +function s:PrevNonBlankNonString(lnum) +  let lnum = prevnonblank(a:lnum) +  while lnum > 0 +    " If the line isn't empty or in a string, end search. +    let line = getline(lnum) +    if !(s:IsInString(lnum, 1) && s:IsInString(lnum, strlen(line))) +      break +    endif +    let lnum = prevnonblank(lnum - 1) +  endwhile +  return lnum +endfunction + +" Check if line 'lnum' has more opening brackets than closing ones. +function s:LineHasOpeningBrackets(lnum) +  let open_0 = 0 +  let open_2 = 0 +  let open_4 = 0 +  let line = getline(a:lnum) +  let pos = match(line, '[][(){}]', 0) +  while pos != -1 +    let idx = stridx('(){}[]', line[pos]) +    if idx % 2 == 0 +      let open_{idx} = open_{idx} + 1 +    else +      let open_{idx - 1} = open_{idx - 1} - 1 +    endif +    let pos = match(line, '[][(){}]', pos + 1) +  endwhile +  return (open_0 > 0) . (open_2 > 0) . (open_4 > 0) +endfunction + +function s:Match(lnum, regex) +  let col = match(getline(a:lnum), a:regex) + 1 +  return col > 0 && !s:IsInString(a:lnum, col) ? col : 0 +endfunction + +" 3. GetJSONIndent Function {{{1 +" ========================= + +function GetJSONIndent() +  " 3.1. Setup {{{2 +  " ---------- + +  " Set up variables for restoring position in file.  Could use v:lnum here. +  let vcol = col('.') + +  " 3.2. Work on the current line {{{2 +  " ----------------------------- + +  " Get the current line. +  let line = getline(v:lnum) +  let ind = -1 + +  " If we got a closing bracket on an empty line, find its match and indent +  " according to it. +  let col = matchend(line, '^\s*[]}]') + +  if col > 0 && !s:IsInString(v:lnum, col) +    call cursor(v:lnum, col) +    let bs = strpart('{}[]', stridx('}]', line[col - 1]) * 2, 2) + +    let pairstart = escape(bs[0], '[') +    let pairend = escape(bs[1], ']') +    let pairline = searchpair(pairstart, '', pairend, 'bW') + +    if pairline > 0  +      let ind = indent(pairline) +    else +      let ind = virtcol('.') - 1 +    endif + +    return ind +  endif + +  " If we are in a multi-line string, don't do anything to it. +  if s:IsInString(v:lnum, matchend(line, '^\s*') + 1) +    return indent('.') +  endif + +  " 3.3. Work on the previous line. {{{2 +  " ------------------------------- + +  let lnum = prevnonblank(v:lnum - 1) + +  if lnum == 0 +    return 0 +  endif + +  " Set up variables for current line. +  let line = getline(lnum) +  let ind = indent(lnum) + +  " If the previous line ended with a block opening, add a level of indent. +  " if s:Match(lnum, s:block_regex) +    " return indent(lnum) + shiftwidth() +  " endif + +  " If the previous line contained an opening bracket, and we are still in it, +  " add indent depending on the bracket type. +  if line =~ '[[({]' +    let counts = s:LineHasOpeningBrackets(lnum) +    if counts[0] == '1' || counts[1] == '1' || counts[2] == '1' +      return ind + shiftwidth() +    else +      call cursor(v:lnum, vcol) +    end +  endif + +  " }}}2 + +  return ind +endfunction + +" }}}1 + +let &cpo = s:cpo_save +unlet s:cpo_save + +" vim:set sw=2 sts=2 ts=8 noet: + | 
