Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sublime, sublime_plugin
- from collections import defaultdict
- class RememberLayout(sublime_plugin.EventListener):
- """Remembers where views are located in a layout,
- so they can be restored correctly when you revert to that specific layout."""
- # Per window, per layout, which view as active.
- active_view_cache = defaultdict(dict)
- # Per window, per layout, per group, the views.
- views_cache = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
- def on_window_command(self, window, command_name, args):
- if command_name == 'set_layout':
- # Before the layout changes.
- self.remember_views(window)
- # After the layout changes.
- sublime.set_timeout(lambda: self.restore_views(window), 0)
- def get_layout_repr(self, window):
- # We need some kind of identifier for layouts, and the cells attribute seems a safe choice.
- return repr(window.get_layout()['cells'])
- def remember_views(self, window):
- layout = self.get_layout_repr(window)
- self.active_view_cache[window.id()][layout] = window.active_view().id()
- groups = self.views_cache[window.id()][layout]
- for v in window.views():
- self.update_view(groups, v)
- def update_view(self, groups, view):
- # The group and view index can potentially be -1 according to the API.
- window = view.window()
- group_idx, view_idx = window.get_view_index(view)
- if group_idx == -1 or view_idx == -1:
- return
- # Only alter if necessary.
- view_ids = groups[group_idx]
- view_id = view.id()
- if view_id in view_ids and view_ids.index(view_id) == view_idx:
- return
- self.remove_view_id(groups, view_id)
- view_ids.insert(view_idx, view_id)
- def remove_view_id(self, groups, view_id):
- for group_idx in groups:
- if view_id in groups[group_idx]:
- groups[group_idx].remove(view_id)
- return
- def restore_views(self, window):
- # There might be nothing to restore from.
- layout = self.get_layout_repr(window)
- if layout not in self.views_cache[window.id()]:
- return
- view_lookup = dict([(v.id(), v) for v in window.views()])
- groups = self.views_cache[window.id()][layout]
- for group_idx in groups:
- for view_idx, view_id in enumerate(groups[group_idx]):
- window.set_view_index(view_lookup[view_id], group_idx, view_idx)
- window.focus_view(view_lookup[self.active_view_cache[window.id()][layout]])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement