parent
7c34a3400b
commit
360f58dbf6
@ -39,7 +39,7 @@ class SnippetDefinition(object):
|
||||
_TABS = re.compile(r"^\t*")
|
||||
|
||||
def __init__(self, priority, trigger, value, description,
|
||||
options, globals):
|
||||
options, globals, location):
|
||||
self._priority = priority
|
||||
self._trigger = as_unicode(trigger)
|
||||
self._value = as_unicode(value)
|
||||
@ -48,6 +48,7 @@ class SnippetDefinition(object):
|
||||
self._matched = ""
|
||||
self._last_re = None
|
||||
self._globals = globals
|
||||
self._location = location
|
||||
|
||||
# Make sure that we actually match our trigger in case we are
|
||||
# immediately expanded.
|
||||
@ -97,6 +98,11 @@ class SnippetDefinition(object):
|
||||
could_match()."""
|
||||
return self._matched
|
||||
|
||||
@property
|
||||
def location(self):
|
||||
"""Where this snippet was defined."""
|
||||
return self._location
|
||||
|
||||
def matches(self, trigger):
|
||||
"""Returns True if this snippet matches 'trigger'."""
|
||||
# If user supplies both "w" and "i", it should perhaps be an
|
||||
|
@ -11,9 +11,9 @@ class SnipMateSnippetDefinition(SnippetDefinition):
|
||||
|
||||
SNIPMATE_SNIPPET_PRIORITY = -1000
|
||||
|
||||
def __init__(self, trigger, value, description):
|
||||
def __init__(self, trigger, value, description, location):
|
||||
SnippetDefinition.__init__(self, self.SNIPMATE_SNIPPET_PRIORITY,
|
||||
trigger, value, description, "", {})
|
||||
trigger, value, description, "", {}, location)
|
||||
|
||||
def instantiate(self, snippet_instance, initial_text, indent):
|
||||
parse_and_instantiate(snippet_instance, initial_text, indent)
|
||||
|
@ -49,9 +49,9 @@ def snipmate_files_for(ft):
|
||||
ret.add(fn)
|
||||
return ret
|
||||
|
||||
def _parse_snippet_file(content, filename):
|
||||
def _parse_snippet_file(content, full_filename):
|
||||
"""Parses 'content' assuming it is a .snippet file and yields events."""
|
||||
filename = filename[:-len(".snippet")] # strip extension
|
||||
filename = full_filename[:-len(".snippet")] # strip extension
|
||||
segments = _splitall(filename)
|
||||
segments = segments[segments.index("snippets")+1:]
|
||||
assert len(segments) in (2, 3)
|
||||
@ -62,10 +62,12 @@ def _parse_snippet_file(content, filename):
|
||||
# Chomp \n if any.
|
||||
if content and content.endswith(os.linesep):
|
||||
content = content[:-len(os.linesep)]
|
||||
yield "snippet", (SnipMateSnippetDefinition(trigger, content, description),)
|
||||
yield "snippet", (SnipMateSnippetDefinition(trigger, content,
|
||||
description, full_filename),)
|
||||
|
||||
def _parse_snippet(line, lines):
|
||||
def _parse_snippet(line, lines, filename):
|
||||
"""Parse a snippet defintions."""
|
||||
start_line_index = lines.line_index
|
||||
trigger, description = head_tail(line[len("snippet"):].lstrip())
|
||||
content = ""
|
||||
while True:
|
||||
@ -80,9 +82,9 @@ def _parse_snippet(line, lines):
|
||||
content += line
|
||||
content = content[:-1] # Chomp the last newline
|
||||
return "snippet", (SnipMateSnippetDefinition(
|
||||
trigger, content, description),)
|
||||
trigger, content, description, "%s:%i" % (filename, start_line_index)),)
|
||||
|
||||
def _parse_snippets_file(data):
|
||||
def _parse_snippets_file(data, filename):
|
||||
"""Parse 'data' assuming it is a .snippets file. Yields events in the
|
||||
file."""
|
||||
lines = LineIterator(data)
|
||||
@ -94,7 +96,7 @@ def _parse_snippets_file(data):
|
||||
if head == "extends":
|
||||
yield handle_extends(tail, lines.line_index)
|
||||
elif head in "snippet":
|
||||
snippet = _parse_snippet(line, lines)
|
||||
snippet = _parse_snippet(line, lines, filename)
|
||||
if snippet is not None:
|
||||
yield snippet
|
||||
elif head and not head.startswith('#'):
|
||||
@ -110,5 +112,5 @@ class SnipMateFileSource(SnippetFileSource):
|
||||
for event, data in _parse_snippet_file(filedata, filename):
|
||||
yield event, data
|
||||
else:
|
||||
for event, data in _parse_snippets_file(filedata):
|
||||
for event, data in _parse_snippets_file(filedata, filename):
|
||||
yield event, data
|
||||
|
@ -47,8 +47,9 @@ def find_all_snippet_files(ft):
|
||||
ret.add(fn)
|
||||
return ret
|
||||
|
||||
def _handle_snippet_or_global(line, lines, python_globals, priority):
|
||||
def _handle_snippet_or_global(filename, line, lines, python_globals, priority):
|
||||
"""Parses the snippet that begins at the current line."""
|
||||
start_line_index = lines.line_index
|
||||
descr = ""
|
||||
opts = ""
|
||||
|
||||
@ -96,11 +97,12 @@ def _handle_snippet_or_global(line, lines, python_globals, priority):
|
||||
python_globals[trig].append(content)
|
||||
elif snip == "snippet":
|
||||
return "snippet", (UltiSnipsSnippetDefinition(priority, trig, content,
|
||||
descr, opts, python_globals),)
|
||||
descr, opts, python_globals,
|
||||
"%s:%i" % (filename, start_line_index)),)
|
||||
else:
|
||||
return "error", ("Invalid snippet type: '%s'" % snip, lines.line_index)
|
||||
|
||||
def _parse_snippets_file(data):
|
||||
def _parse_snippets_file(data, filename):
|
||||
"""Parse 'data' assuming it is a snippet file. Yields events in the
|
||||
file."""
|
||||
|
||||
@ -113,7 +115,7 @@ def _parse_snippets_file(data):
|
||||
|
||||
head, tail = head_tail(line)
|
||||
if head in ("snippet", "global"):
|
||||
snippet = _handle_snippet_or_global(line, lines,
|
||||
snippet = _handle_snippet_or_global(filename, line, lines,
|
||||
python_globals, current_priority)
|
||||
if snippet is not None:
|
||||
yield snippet
|
||||
@ -136,5 +138,5 @@ class UltiSnipsFileSource(SnippetFileSource):
|
||||
return find_all_snippet_files(ft)
|
||||
|
||||
def _parse_snippet_file(self, filedata, filename):
|
||||
for event, data in _parse_snippets_file(filedata):
|
||||
for event, data in _parse_snippets_file(filedata, filename):
|
||||
yield event, data
|
||||
|
@ -41,8 +41,8 @@ def _ask_snippets(snippets):
|
||||
""" Given a list of snippets, ask the user which one they
|
||||
want to use, and return it.
|
||||
"""
|
||||
display = [as_unicode("%i: %s") % (i+1, escape(s.description, '\\')) for
|
||||
i, s in enumerate(snippets)]
|
||||
display = [as_unicode("%i: %s (%s)") % (i+1, escape(s.description, '\\'),
|
||||
s.location) for i, s in enumerate(snippets)]
|
||||
return _ask_user(snippets, display)
|
||||
|
||||
def err_to_scratch_buffer(func):
|
||||
@ -193,14 +193,14 @@ class SnippetManager(object):
|
||||
"""Add a snippet to the list of known snippets of the given 'ft'."""
|
||||
self._added_snippets_source.add_snippet(ft,
|
||||
UltiSnipsSnippetDefinition(priority, trigger, value,
|
||||
description, options, {}))
|
||||
description, options, {}, "added"))
|
||||
|
||||
@err_to_scratch_buffer
|
||||
def expand_anon(self, value, trigger="", description="", options=""):
|
||||
"""Expand an anonymous snippet right here."""
|
||||
before = _vim.buf.line_till_cursor
|
||||
snip = UltiSnipsSnippetDefinition(0, trigger, value, description,
|
||||
options, {})
|
||||
options, {}, "")
|
||||
|
||||
if not trigger or snip.matches(before):
|
||||
self._do_snippet(snip, before)
|
||||
|
Loading…
Reference in New Issue
Block a user