This repository was archived by the owner on Mar 30, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathtextgetter.py
136 lines (110 loc) · 4.25 KB
/
textgetter.py
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import sublime
import re
from .settings import SettingManager
class TextGetter:
def __init__(self, view):
self.view = view
self.sget = SettingManager(view).get
def expand_cursor(self, s):
s = self.view.line(s)
if self.sget("auto_expand_line", True):
s = self.expand_line(s)
return s
def expand_line(self, s):
return s
def advance(self, s):
view = self.view
view.sel().subtract(s)
pt = view.text_point(view.rowcol(s.end())[0]+1, 0)
if self.sget("auto_advance_non_empty", False):
nextpt = view.find(r"\S", pt)
if nextpt.begin() != -1:
pt = view.text_point(view.rowcol(nextpt.begin())[0], 0)
view.sel().add(sublime.Region(pt, pt))
def get_text(self):
view = self.view
cmd = ''
moved = False
for s in [s for s in view.sel()]:
if s.empty():
s = self.expand_cursor(s)
if self.sget("auto_advance", True):
self.advance(s)
moved = True
cmd += view.substr(s) + '\n'
if moved:
view.show(view.sel())
return cmd
class RTextGetter(TextGetter):
def expand_line(self, s):
view = self.view
thiscmd = view.substr(s)
if re.match(r".*\{\s*$", thiscmd):
es = view.find(
r"""^(?:.*(\{(?:(["\'])(?:[^\\]|\\.)*?\2|#.*$|[^\{\}]|(?1))*\})[^\{\}\n]*)+""",
view.line(s).begin()
)
if s.begin() == es.begin():
s = es
return s
class PythonTextGetter(TextGetter):
def expand_line(self, s):
view = self.view
thiscmd = view.substr(s)
row = view.rowcol(s.begin())[0]
prevline = view.line(s.begin())
lastrow = view.rowcol(view.size())[0]
if re.match(r"^(#\s%%|#%%|# In\[)", thiscmd):
while row < lastrow:
row = row + 1
line = view.line(view.text_point(row, 0))
m = re.match(r"^(#\s%%|#%%|# In\[)", view.substr(line))
if m:
s = sublime.Region(s.begin(), prevline.end())
break
else:
prevline = line
elif re.match(r"^[ \t]*\S", thiscmd):
indentation = re.match(r"^([ \t]*)", thiscmd).group(1)
while row < lastrow:
row = row + 1
line = view.line(view.text_point(row, 0))
m = re.match(r"^([ \t]*)([^\n\s]+)", view.substr(line))
if m and len(m.group(1)) <= len(indentation) and \
(len(m.group(1)) < len(indentation) or
not re.match(r"else|elif|except|finally", m.group(2))):
s = sublime.Region(s.begin(), prevline.end())
break
elif re.match(r"^[ \t]*\S", view.substr(line)):
prevline = line
if row == lastrow:
s = sublime.Region(s.begin(), prevline.end())
return s
class JuliaTextGetter(TextGetter):
def expand_line(self, s):
view = self.view
thiscmd = view.substr(s)
if (re.match(r"^\s*(?:function|if|for|while)", thiscmd) and
not re.match(r".*end\s*$", thiscmd)) or \
(re.match(r".*begin\s*$", thiscmd)):
indentation = re.match("^(\s*)", thiscmd).group(1)
end = view.find("^"+indentation+"end", s.begin())
s = sublime.Region(s.begin(), view.line(end.end()).end())
return s
class MarkDownTextGetter(TextGetter):
def advance(self, s):
view = self.view
view.sel().subtract(view.line(s.begin()-1))
pt = view.text_point(view.rowcol(s.end())[0]+2, 0)
if self.sget("auto_advance_non_empty", False):
nextpt = view.find(r"\S", pt)
if nextpt.begin() != -1:
pt = view.text_point(view.rowcol(nextpt.begin())[0], 0)
view.sel().add(sublime.Region(pt, pt))
def expand_line(self, s):
view = self.view
thisline = view.substr(s)
if re.match(r"^```", thisline):
end = view.find("^```$", s.end())
s = sublime.Region(s.end()+1, end.begin()-1)
return s