1global !p
2texMathZones = ['texMathZone'+x for x in ['A', 'AS', 'B', 'BS', 'C', 'CS', 'D', 'DS', 'V', 'W', 'X', 'Y', 'Z']]
3# If you have http://www.drchip.org/astronaut/vim/vbafiles/amsmath.vba.gz,
4# you want to add:
5# texMathZones += ['texMathZone'+x for x in ['E', 'ES', 'F', 'FS', 'G', 'GS', 'H', 'HS', 'I', 'IS', 'J', 'JS', 'K', 'KS', 'L', 'LS']]
6texIgnoreMathZones = ['texMathText']
7
8texMathZoneIds = vim.eval('map('+str(texMathZones)+", 'hlID(v:val)')")
9texIgnoreMathZoneIds = vim.eval('map('+str(texIgnoreMathZones)+", 'hlID(v:val)')")
10
11def math():
12 # DEBUGGING
13 synstack = vim.eval("map(synstack(line('.'), col('.') - (col('.')>=2 ? 1 : 0)), {i,v -> synIDattr(v, 'name')})")
14 print("synstack: " + str(synstack))
15 syntaxgroup = vim.eval("get(reverse(map(synstack(line('.'), col('.') - (col('.')>=2 ? 1 : 0)), {i,v -> synIDattr(v, 'name')})), 0, '')")
16 print("syntaxgroup (rev): "+ syntaxgroup)
17 synstackids = vim.eval("synstack(line('.'), col('.') - (col('.')>=2 ? 1 : 0))")
18 if not set(texIgnoreMathZoneIds).isdisjoint(synstackids):
19 return False
20 return not set(texMathZoneIds).isdisjoint(synstackids)
21 # isdisjoint() can short-circuit as soon as a match is found
22
23endglobal
24
25
26snippet \beg "begin{} / end{}" bA
27\begin{$1}
28 $0
29\end{$1}
30endsnippet
31
32snippet $ "Math" wA
33$${1}$`!p
34if t[2] and t[2][0] not in [',', '.', '?', '-', ' ']:
35 snip.rv = ' '
36else:
37 snip.rv = ''
38`$2
39endsnippet
40
41snippet \[ "Math" wA
42\[ $1 \] $0
43endsnippet
44
45snippet '(.+)(pr)' "Superscript prime" Air
46`!p snip.rv = match.group(1) + "^{\prime}"`
47endsnippet
48
49#snippet '(\S+)/(\S+) ' "Fraction" Air
50#`!p snip.rv = "\\frac{" + match.group(1) + "}{" + match.group(2) + "} "`
51#endsnippet
52
53snippet // "Fraction" iA
54\\frac{$1}{$2}$0
55endsnippet
56
57snippet '((\d+)|(\d*)(\\)?([A-Za-z]+)((\^|_)(\{\d+\}|\d))*)/' "Fraction" wrA
58\\frac{`!p snip.rv = match.group(1)`}{$1}$0
59endsnippet
60
61priority 1000
62snippet '^.*\)/' "() Fraction" wrA
63`!p
64stripped = match.string[:-1]
65depth = 0
66i = len(stripped) - 1
67while True:
68 if stripped[i] == ')': depth += 1
69 if stripped[i] == '(': depth -= 1
70 if depth == 0: break;
71 i -= 1
72snip.rv = stripped[0:i] + "\\frac{" + stripped[i+1:-1] + "}"
73`{$1}$0
74endsnippet
75
76priority 10
77snippet "bar" "bar" riA
78\overline{$1}$0
79endsnippet
80
81priority 100
82snippet "([a-zA-Z])bar" "bar" riA
83\overline{`!p snip.rv=match.group(1)`}
84endsnippet
85
86priority 10
87snippet "hat" "hat" riA
88\hat{$1}$0
89endsnippet
90
91priority 100
92snippet "([a-zA-Z])hat" "hat" riA
93\hat{`!p snip.rv=match.group(1)`}
94endsnippet
95
96snippet "(\\?\w+)(,\.|\.,)" "Vector postfix" riA
97\vec{`!p snip.rv=match.group(1)`}
98endsnippet
99
100snippet "fn" "Function" r
101f : $1 \to \R, \> y = $0
102endsnippet