You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
#!/usr/bin/env python
|
|
# encoding: utf-8
|
|
|
|
"""Implements a container for parsed snippets."""
|
|
|
|
class SnippetDictionary(object):
|
|
|
|
"""See module docstring."""
|
|
|
|
def __init__(self):
|
|
self._snippets = []
|
|
self._cleared = {}
|
|
self._clear_priority = float("-inf")
|
|
|
|
def add_snippet(self, snippet):
|
|
"""Add 'snippet' to this dictionary."""
|
|
self._snippets.append(snippet)
|
|
|
|
def get_matching_snippets(self, trigger, potentially, autotrigger_only):
|
|
"""Returns all snippets matching the given trigger.
|
|
|
|
If 'potentially' is true, returns all that could_match().
|
|
|
|
If 'autotrigger_only' is true, function will return only snippets which
|
|
are marked with flag 'A' (should be automatically expanded without
|
|
trigger key press).
|
|
It's handled specially to avoid walking down the list of all snippets,
|
|
which can be very slow, because function will be called on each change
|
|
made in insert mode.
|
|
|
|
"""
|
|
all_snippets = self._snippets
|
|
if autotrigger_only:
|
|
all_snippets = [s for s in all_snippets if s.has_option('A')]
|
|
|
|
if not potentially:
|
|
return [s for s in all_snippets if s.matches(trigger)]
|
|
else:
|
|
return [s for s in all_snippets if s.could_match(trigger)]
|
|
|
|
def clear_snippets(self, priority, triggers):
|
|
"""Clear the snippets by mark them as cleared.
|
|
|
|
If trigger is None, it updates the value of clear priority
|
|
instead.
|
|
|
|
"""
|
|
if not triggers:
|
|
if self._clear_priority is None or priority > self._clear_priority:
|
|
self._clear_priority = priority
|
|
else:
|
|
for trigger in triggers:
|
|
if (trigger not in self._cleared or
|
|
priority > self._cleared[trigger]):
|
|
self._cleared[trigger] = priority
|
|
|
|
def __len__(self):
|
|
return len(self._snippets)
|