summaryrefslogtreecommitdiffstats
path: root/indent/graphql.vim
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2019-09-04 16:29:56 +0200
committerAdam Stankiewicz <sheerun@sher.pl>2019-09-04 16:29:56 +0200
commit556c56d185fcc7d5cc6d51ea9a6453bcd4f7116c (patch)
treef97d9f0cdf9df718aaf1a04eed16819a84a5bab2 /indent/graphql.vim
parentfe84062992e12dea8e090e647afa6b314e891f73 (diff)
downloadvim-polyglot-556c56d185fcc7d5cc6d51ea9a6453bcd4f7116c.tar.gz
vim-polyglot-556c56d185fcc7d5cc6d51ea9a6453bcd4f7116c.zip
Add graphql support, closes #298
Diffstat (limited to 'indent/graphql.vim')
-rw-r--r--indent/graphql.vim81
1 files changed, 81 insertions, 0 deletions
diff --git a/indent/graphql.vim b/indent/graphql.vim
new file mode 100644
index 00000000..1bf93abb
--- /dev/null
+++ b/indent/graphql.vim
@@ -0,0 +1,81 @@
+if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'graphql') != -1
+ finish
+endif
+
+" Vim indent file
+" Language: GraphQL
+" Maintainer: Jon Parise <jon@indelible.org>
+
+if exists('b:did_indent')
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal nocindent
+setlocal nolisp
+setlocal nosmartindent
+
+setlocal indentexpr=GetGraphQLIndent()
+setlocal indentkeys=0{,0},0),0[,0],0#,!^F,o,O
+
+" If our indentation function already exists, we have nothing more to do.
+if exists('*GetGraphQLIndent')
+ finish
+endif
+
+let s:cpo_save = &cpoptions
+set cpoptions&vim
+
+" Check if the character at lnum:col is inside a string.
+function s:InString(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') is# 'graphqlString'
+endfunction
+
+function GetGraphQLIndent()
+ " If this is the first non-blank line, we have nothing more to do because
+ " all of our indentation rules are based on matching against earlier lines.
+ let l:prevlnum = prevnonblank(v:lnum - 1)
+ if l:prevlnum == 0
+ return 0
+ endif
+
+ let l:line = getline(v:lnum)
+
+ " If this line contains just a closing bracket, find its matching opening
+ " bracket and indent the closing backet to match.
+ let l:col = matchend(l:line, '^\s*[]})]')
+ if l:col > 0 && !s:InString(v:lnum, l:col)
+ let l:bracket = l:line[l:col - 1]
+ call cursor(v:lnum, l:col)
+
+ if l:bracket is# '}'
+ let l:matched = searchpair('{', '', '}', 'bW')
+ elseif l:bracket is# ']'
+ let l:matched = searchpair('\[', '', '\]', 'bW')
+ elseif l:bracket is# ')'
+ let l:matched = searchpair('(', '', ')', 'bW')
+ else
+ let l:matched = -1
+ endif
+
+ return l:matched > 0 ? indent(l:matched) : virtcol('.') - 1
+ endif
+
+ " If we're inside of a multiline string, continue with the same indentation.
+ if s:InString(v:lnum, matchend(l:line, '^\s*') + 1)
+ return indent(v:lnum)
+ endif
+
+ " If the previous line contained an opening bracket, and we are still in it,
+ " add indent depending on the bracket type.
+ if getline(l:prevlnum) =~# '[[{(]\s*$'
+ return indent(l:prevlnum) + shiftwidth()
+ endif
+
+ " Default to the existing indentation level.
+ return indent(l:prevlnum)
+endfunction
+
+let &cpoptions = s:cpo_save
+unlet s:cpo_save