125 lines
3.8 KiB
Python
125 lines
3.8 KiB
Python
import sublime, sublime_plugin
|
|
|
|
def fold_region_from_indent(view, r):
|
|
if r.b == view.size():
|
|
return sublime.Region(r.a - 1, r.b)
|
|
else:
|
|
return sublime.Region(r.a - 1, r.b - 1)
|
|
|
|
class FoldUnfoldCommand(sublime_plugin.TextCommand):
|
|
def run(self, edit):
|
|
new_sel = []
|
|
for s in self.view.sel():
|
|
r = s
|
|
empty_region = r.empty()
|
|
if empty_region:
|
|
r = sublime.Region(r.a - 1, r.a + 1)
|
|
|
|
unfolded = self.view.unfold(r)
|
|
if len(unfolded) == 0:
|
|
self.view.fold(s)
|
|
elif empty_region:
|
|
for r in unfolded:
|
|
new_sel.append(r)
|
|
|
|
if len(new_sel) > 0:
|
|
self.view.sel().clear()
|
|
for r in new_sel:
|
|
self.view.sel().add(r)
|
|
|
|
class FoldCommand(sublime_plugin.TextCommand):
|
|
def run(self, edit):
|
|
new_sel = []
|
|
for s in self.view.sel():
|
|
if s.empty():
|
|
r = self.view.indented_region(s.a)
|
|
if not r.empty():
|
|
r = fold_region_from_indent(self.view, r)
|
|
self.view.fold(r)
|
|
new_sel.append(r)
|
|
else:
|
|
new_sel.append(s)
|
|
else:
|
|
if self.view.fold(s):
|
|
new_sel.append(s)
|
|
else:
|
|
r = self.view.indented_region(s.a)
|
|
if not r.empty():
|
|
r = fold_region_from_indent(self.view, r)
|
|
self.view.fold(r)
|
|
new_sel.append(r)
|
|
else:
|
|
new_sel.append(s)
|
|
|
|
self.view.sel().clear()
|
|
for r in new_sel:
|
|
self.view.sel().add(r)
|
|
|
|
class FoldAllCommand(sublime_plugin.TextCommand):
|
|
def run(self, edit):
|
|
folds = []
|
|
tp = 0
|
|
size = self.view.size()
|
|
while tp < size:
|
|
s = self.view.indented_region(tp)
|
|
if not s.empty():
|
|
r = fold_region_from_indent(self.view, s)
|
|
folds.append(r)
|
|
tp = s.b
|
|
else:
|
|
tp = self.view.full_line(tp).b
|
|
|
|
self.view.fold(folds)
|
|
self.view.show(self.view.sel())
|
|
|
|
sublime.status_message("Folded " + str(len(folds)) + " regions")
|
|
|
|
class FoldByLevelCommand(sublime_plugin.TextCommand):
|
|
def run(self, edit, level):
|
|
level = int(level)
|
|
folds = []
|
|
tp = 0
|
|
size = self.view.size()
|
|
while tp < size:
|
|
if self.view.indentation_level(tp) == level:
|
|
s = self.view.indented_region(tp)
|
|
if not s.empty():
|
|
r = fold_region_from_indent(self.view, s)
|
|
folds.append(r)
|
|
tp = s.b
|
|
continue;
|
|
|
|
tp = self.view.full_line(tp).b
|
|
|
|
self.view.fold(folds)
|
|
self.view.show(self.view.sel())
|
|
|
|
sublime.status_message("Folded " + str(len(folds)) + " regions")
|
|
|
|
class UnfoldCommand(sublime_plugin.TextCommand):
|
|
def run(self, edit):
|
|
new_sel = []
|
|
for s in self.view.sel():
|
|
unfold = s
|
|
if s.empty():
|
|
unfold = sublime.Region(s.a - 1, s.a + 1)
|
|
|
|
unfolded = self.view.unfold(unfold)
|
|
if len(unfolded) == 0 and s.empty():
|
|
unfolded = self.view.unfold(self.view.full_line(s.b))
|
|
|
|
if len(unfolded) == 0:
|
|
new_sel.append(s)
|
|
else:
|
|
for r in unfolded:
|
|
new_sel.append(r)
|
|
|
|
if len(new_sel) > 0:
|
|
self.view.sel().clear()
|
|
for r in new_sel:
|
|
self.view.sel().add(r)
|
|
|
|
class UnfoldAllCommand(sublime_plugin.TextCommand):
|
|
def run(self, edit):
|
|
self.view.unfold(sublime.Region(0, self.view.size()))
|
|
self.view.show(self.view.sel())
|