62 lines
2.0 KiB
Python
62 lines
2.0 KiB
Python
"""This module provides commands for easily moving between headilnes.
|
|
|
|
The feature is borrowed from [Org-mode](http://org-mode.org).
|
|
|
|
"""
|
|
# Author: Muchenxuan Tong <demon386@gmail.com>
|
|
|
|
import sublime
|
|
import sublime_plugin
|
|
|
|
try:
|
|
from . import headline
|
|
from .utilities import is_region_void
|
|
except ValueError:
|
|
import headline
|
|
from utilities import is_region_void
|
|
|
|
|
|
class HeadlineMoveCommand(sublime_plugin.TextCommand):
|
|
def run(self, edit, forward=True, same_level=True):
|
|
"""Move between headlines, forward or backward.
|
|
|
|
If same_level is true, only move to headline with the same level
|
|
or higher level.
|
|
|
|
"""
|
|
new_sel = []
|
|
if same_level:
|
|
level_type = headline.MATCH_PARENT
|
|
else:
|
|
level_type = headline.MATCH_ANY
|
|
|
|
for region in self.view.sel():
|
|
if same_level:
|
|
_, level = headline.headline_and_level_at_point(self.view,\
|
|
region.a,
|
|
search_above_and_down=True)
|
|
if level is None:
|
|
return
|
|
else:
|
|
level = headline.ANY_LEVEL
|
|
|
|
match_region, _ = headline.find_headline(self.view, \
|
|
region.a, \
|
|
level, \
|
|
forward, \
|
|
level_type, \
|
|
skip_headline_at_point=True,\
|
|
skip_folded=True)
|
|
|
|
if is_region_void(match_region):
|
|
return
|
|
new_sel.append(sublime.Region(match_region.a, match_region.a))
|
|
|
|
self.adjust_view(new_sel)
|
|
|
|
def adjust_view(self, new_sel):
|
|
self.view.sel().clear()
|
|
for region in new_sel:
|
|
self.view.sel().add(region)
|
|
self.view.show(region)
|