def find_prev_lone_bracket(view, start, tags, unbalanced=0):
# TODO: Extract common functionality from here and the % motion instead of
# duplicating code.
# XXX: refactor this
if view.substr(start) == tags[0][1] if len(tags[0]) > 1 else tags[0]:
if not unbalanced and view.substr(start - 1) != '\\':
return sublime.Region(start, start + 1)
new_start = start
for i in range(unbalanced or 1):
prev_opening_bracket = reverse_search_by_pt(view, tags[0],
start=0,
end=new_start,
flags=sublime.IGNORECASE)
if prev_opening_bracket is None:
# Check whether the caret is exactly at a bracket.
# Tag names may be escaped, so slice them.
if (i == 0 and view.substr(start) == tags[0][-1] and
view.substr(start - 1) != '\\'):
return sublime.Region(start, start + 1)
# Unbalanced tags; nothing we can do.
return
while view.substr(prev_opening_bracket.begin() - 1) == '\\':
prev_opening_bracket = reverse_search_by_pt(
view,
tags[0],
start=0,
end=prev_opening_bracket.begin(),
flags=sublime.IGNORECASE
)
if prev_opening_bracket is None:
return
new_start = prev_opening_bracket.begin()
nested = 0
while True:
next_closing_bracket = reverse_search_by_pt(view,
tags[1],
start=prev_opening_bracket.a,
end=start,
flags=sublime.IGNORECASE)
if not next_closing_bracket:
break
nested += 1
start = next_closing_bracket.begin()
if nested > 0:
return find_prev_lone_bracket(view,
prev_opening_bracket.begin(),
tags,
nested)
else:
return prev_opening_bracket
评论列表
文章目录