File: context.vim

package info (click to toggle)
vim 2%3A9.1.2103-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 93,456 kB
  • sloc: ansic: 433,730; cpp: 6,399; makefile: 4,597; sh: 2,397; java: 2,312; xml: 2,099; python: 1,595; perl: 1,419; awk: 730; lisp: 501; cs: 458; objc: 369; sed: 8; csh: 6; haskell: 1
file content (107 lines) | stat: -rw-r--r-- 2,657 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
vim9script

# Language:           ConTeXt typesetting engine
# Maintainer:         Nicola Vitacolonna <nvitacolonna@gmail.com>
# Former Maintainers: Nikolai Weibull <now@bitwi.se>
# Latest Revision:    2026 Jan 10

# 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)
  var logpath = typeset.LogPath(bufname)

  if filereadable(logpath)
    execute 'edit' typeset.LogPath(bufname)
    return
  endif

  echomsg $'[ConTeXt] No log file found ({logpath})'
enddef
# }}}

# Completion {{{
def BinarySearch(base: string, keywords: list<string>): list<string>
  var pat = '^' .. base
  var 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