Dotfiles/sublime-text/Default/fold.py

126 lines
3.8 KiB
Python
Raw Normal View History

2014-05-12 18:57:15 +02:00
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())