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