1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
#!/usr/bin/env python
# encoding: utf-8
"""Parses a UltiSnips snippet definition and launches it into Vim."""
from UltiSnips.snippet.parsing.base import (
tokenize_snippet_text,
finalize,
resolve_ambiguity,
)
from UltiSnips.snippet.parsing.lexer import (
EscapeCharToken,
VisualToken,
TransformationToken,
TabStopToken,
MirrorToken,
PythonCodeToken,
VimLCodeToken,
ShellCodeToken,
)
from UltiSnips.text_objects import (
EscapedChar,
Mirror,
PythonCode,
ShellCode,
TabStop,
Transformation,
VimLCode,
Visual,
)
_TOKEN_TO_TEXTOBJECT = {
EscapeCharToken: EscapedChar,
VisualToken: Visual,
ShellCodeToken: ShellCode,
PythonCodeToken: PythonCode,
VimLCodeToken: VimLCode,
}
__ALLOWED_TOKENS = [
EscapeCharToken,
VisualToken,
TransformationToken,
TabStopToken,
MirrorToken,
PythonCodeToken,
VimLCodeToken,
ShellCodeToken,
]
def _create_transformations(all_tokens, seen_ts):
"""Create the objects that need to know about tabstops."""
for parent, token in all_tokens:
if isinstance(token, TransformationToken):
if token.number not in seen_ts:
raise RuntimeError(
"Tabstop %i is not known but is used by a Transformation"
% token.number
)
Transformation(parent, seen_ts[token.number], token)
def parse_and_instantiate(parent_to, text, indent):
"""Parses a snippet definition in UltiSnips format from 'text' assuming the
current 'indent'.
Will instantiate all the objects and link them as children to
parent_to. Will also put the initial text into Vim.
"""
all_tokens, seen_ts = tokenize_snippet_text(
parent_to,
text,
indent,
__ALLOWED_TOKENS,
__ALLOWED_TOKENS,
_TOKEN_TO_TEXTOBJECT,
)
resolve_ambiguity(all_tokens, seen_ts)
_create_transformations(all_tokens, seen_ts)
finalize(all_tokens, seen_ts, parent_to)
|