Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 1 | vim9script |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 2 | |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 3 | # Language: ConTeXt typesetting engine |
| 4 | # Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com> |
| 5 | # Former Maintainers: Nikolai Weibull <now@bitwi.se> |
| 6 | # Latest Revision: 2022 Aug 12 |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 7 | |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 8 | # Typesetting {{{ |
| 9 | import autoload './typeset.vim' |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 10 | |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 11 | export def ConTeXtCmd(path: string): list<string> |
| 12 | return ['mtxrun', '--script', 'context', '--nonstopmode', '--autogenerate', path] |
| 13 | enddef |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 14 | |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 15 | export def Typeset(bufname: string, env = {}, Cmd = ConTeXtCmd): bool |
| 16 | return typeset.TypesetBuffer(bufname, Cmd, env, 'ConTeXt') |
| 17 | enddef |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 18 | |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 19 | export def JobStatus() |
| 20 | typeset.JobStatus('ConTeXt') |
| 21 | enddef |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 22 | |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 23 | export def StopJobs() |
| 24 | typeset.StopJobs('ConTeXt') |
| 25 | enddef |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 26 | |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 27 | export def Log(bufname: string) |
| 28 | execute 'edit' typeset.LogPath(bufname) |
| 29 | enddef |
| 30 | # }}} |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 31 | |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 32 | # Completion {{{ |
| 33 | def BinarySearch(base: string, keywords: list<string>): list<string> |
| 34 | const pat = '^' .. base |
| 35 | const len = len(keywords) |
| 36 | var res = [] |
| 37 | var lft = 0 |
| 38 | var rgt = len |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 39 | |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 40 | # Find the leftmost index matching base |
| 41 | while lft < rgt |
| 42 | var i = (lft + rgt) / 2 |
| 43 | if keywords[i] < base |
| 44 | lft = i + 1 |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 45 | else |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 46 | rgt = i |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 47 | endif |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 48 | endwhile |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 49 | |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 50 | while lft < len && keywords[lft] =~ pat |
| 51 | add(res, keywords[lft]) |
| 52 | lft += 1 |
| 53 | endwhile |
| 54 | |
| 55 | return res |
| 56 | enddef |
| 57 | |
| 58 | var isMetaPostBlock = false |
| 59 | |
| 60 | var MP_KEYWORDS: list<string> = [] |
| 61 | var CTX_KEYWORDS: list<string> = [] |
| 62 | |
| 63 | # Complete only MetaPost keywords in MetaPost blocks, and complete only |
| 64 | # ConTeXt keywords otherwise. |
| 65 | export def Complete(findstart: number, base: string): any |
| 66 | if findstart == 1 |
| 67 | if len(synstack(line("."), 1)) > 0 && synIDattr(synstack(line("."), 1)[0], "name") ==# 'contextMPGraphic' |
| 68 | isMetaPostBlock = true |
| 69 | return match(getline('.'), '\S\+\%' .. col('.') .. 'c') |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 70 | endif |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 71 | |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 72 | # Complete only \commands starting with a backslash |
| 73 | isMetaPostBlock = false |
| 74 | var pos = match(getline('.'), '\\\zs\S\+\%' .. col('.') .. 'c') |
| 75 | return (pos == -1) ? -3 : pos |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 76 | endif |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 77 | |
| 78 | if isMetaPostBlock |
| 79 | if empty(MP_KEYWORDS) |
| 80 | MP_KEYWORDS = sort(syntaxcomplete#OmniSyntaxList(['mf\w\+', 'mp\w\+'])) |
| 81 | endif |
| 82 | return BinarySearch(base, MP_KEYWORDS) |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 83 | endif |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 84 | |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 85 | if empty(CTX_KEYWORDS) |
| 86 | CTX_KEYWORDS = sort(syntaxcomplete#OmniSyntaxList([ |
| 87 | 'context\w\+', 'texAleph', 'texEtex', 'texLuatex', 'texOmega', |
| 88 | 'texPdftex', 'texTex', 'texXeTeX' |
| 89 | ])) |
| 90 | endif |
| 91 | return BinarySearch(base, CTX_KEYWORDS) |
| 92 | enddef |
| 93 | # }}} |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 94 | |
Bram Moolenaar | e1f3fd1 | 2022-08-15 18:51:32 +0100 | [diff] [blame] | 95 | # vim: sw=2 fdm=marker |