summaryrefslogtreecommitdiffstats
path: root/runtime/autoload/context.vim
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--runtime/autoload/context.vim100
1 files changed, 100 insertions, 0 deletions
diff --git a/runtime/autoload/context.vim b/runtime/autoload/context.vim
new file mode 100644
index 0000000..07edd9a
--- /dev/null
+++ b/runtime/autoload/context.vim
@@ -0,0 +1,100 @@
+vim9script
+
+# Language: ConTeXt typesetting engine
+# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Former Maintainers: Nikolai Weibull <now@bitwi.se>
+# Latest Revision: 2023 Dec 26
+
+# Typesetting {{{
+import autoload './typeset.vim'
+
+export def ConTeXtCmd(path: string): list<string>
+ var cmd = ['mtxrun', '--script', 'context', '--nonstopmode', '--autogenerate']
+ if !empty(get(g:, 'context_extra_options', ''))
+ cmd += g:context_extra_options
+ endif
+ cmd->add(path)
+ return cmd
+enddef
+
+export def Typeset(bufname: string, env = {}, Cmd = ConTeXtCmd): bool
+ return typeset.TypesetBuffer(bufname, Cmd, env, 'ConTeXt')
+enddef
+
+export def JobStatus()
+ typeset.JobStatus('ConTeXt')
+enddef
+
+export def StopJobs()
+ typeset.StopJobs('ConTeXt')
+enddef
+
+export def Log(bufname: string)
+ execute 'edit' typeset.LogPath(bufname)
+enddef
+# }}}
+
+# Completion {{{
+def BinarySearch(base: string, keywords: list<string>): list<string>
+ const pat = '^' .. base
+ const len = len(keywords)
+ var res = []
+ var lft = 0
+ var rgt = len
+
+ # Find the leftmost index matching base
+ while lft < rgt
+ var i = (lft + rgt) / 2
+ if keywords[i] < base
+ lft = i + 1
+ else
+ rgt = i
+ endif
+ endwhile
+
+ while lft < len && keywords[lft] =~ pat
+ add(res, keywords[lft])
+ lft += 1
+ endwhile
+
+ return res
+enddef
+
+var isMetaPostBlock = false
+
+var MP_KEYWORDS: list<string> = []
+var CTX_KEYWORDS: list<string> = []
+
+# Complete only MetaPost keywords in MetaPost blocks, and complete only
+# ConTeXt keywords otherwise.
+export def Complete(findstart: number, base: string): any
+ if findstart == 1
+ if len(synstack(line("."), 1)) > 0 && synIDattr(synstack(line("."), 1)[0], "name") ==# 'contextMPGraphic'
+ isMetaPostBlock = true
+ return match(getline('.'), '\S\+\%' .. col('.') .. 'c')
+ endif
+
+ # Complete only \commands starting with a backslash
+ isMetaPostBlock = false
+ var pos = match(getline('.'), '\\\zs\S\+\%' .. col('.') .. 'c')
+ return (pos == -1) ? -3 : pos
+ endif
+
+ if isMetaPostBlock
+ if empty(MP_KEYWORDS)
+ MP_KEYWORDS = sort(syntaxcomplete#OmniSyntaxList(['mf\w\+', 'mp\w\+']))
+ endif
+ return BinarySearch(base, MP_KEYWORDS)
+ endif
+
+ if empty(CTX_KEYWORDS)
+ CTX_KEYWORDS = sort(syntaxcomplete#OmniSyntaxList([
+ 'context\w\+', 'texAleph', 'texEtex', 'texLuatex', 'texOmega',
+ 'texPdftex', 'texTex', 'texXeTeX'
+ ]))
+ endif
+ return BinarySearch(base, CTX_KEYWORDS)
+enddef
+# }}}
+
+# vim: sw=2 fdm=marker