allow specify context using special header

This commit is contained in:
Egor Kovetskiy 2016-04-13 17:15:20 +06:00
parent 5d4094b2bb
commit 2e62906c33
5 changed files with 66 additions and 6 deletions

View File

@ -1387,6 +1387,11 @@ In that case snippet should be defined using this syntax: >
snippet tab_trigger "description" "expression" options snippet tab_trigger "description" "expression" options
Context can be defined using special header using this syntax: >
context "expression"
snippet tab_trigger "description" options
The 'expression' can be any python expression. If 'expression' evaluates to The 'expression' can be any python expression. If 'expression' evaluates to
'True', then this snippet will be chosen for expansion. The 'expression' must 'True', then this snippet will be chosen for expansion. The 'expression' must
be wrapped with double-quotes. be wrapped with double-quotes.

View File

@ -19,3 +19,11 @@ def handle_action(head, tail, line_index):
else: else:
return 'error', ("'{}' without specified action".format(head), return 'error', ("'{}' without specified action".format(head),
line_index) line_index)
def handle_context(tail, line_index):
if tail:
return 'context', tail.strip('"').replace(r'\"', '"')\
.replace(r'\\\\', r'\\')
else:
return 'error', ("'context' without body", line_index)

View File

@ -11,7 +11,7 @@ from UltiSnips import _vim
from UltiSnips.snippet.definition import UltiSnipsSnippetDefinition from UltiSnips.snippet.definition import UltiSnipsSnippetDefinition
from UltiSnips.snippet.source.file._base import SnippetFileSource from UltiSnips.snippet.source.file._base import SnippetFileSource
from UltiSnips.snippet.source.file._common import handle_extends, \ from UltiSnips.snippet.source.file._common import handle_extends, \
handle_action handle_action, handle_context
from UltiSnips.text import LineIterator, head_tail from UltiSnips.text import LineIterator, head_tail
@ -55,7 +55,7 @@ def find_all_snippet_files(ft):
def _handle_snippet_or_global( def _handle_snippet_or_global(
filename, line, lines, python_globals, priority, pre_expand filename, line, lines, python_globals, priority, pre_expand, context
): ):
"""Parses the snippet that begins at the current line.""" """Parses the snippet that begins at the current line."""
start_line_index = lines.line_index start_line_index = lines.line_index
@ -75,8 +75,7 @@ def _handle_snippet_or_global(
opts = words[-1] opts = words[-1]
remain = remain[:-len(opts) - 1].rstrip() remain = remain[:-len(opts) - 1].rstrip()
context = None if 'e' in opts and not context:
if 'e' in opts:
left = remain[:-1].rfind('"') left = remain[:-1].rfind('"')
if left != -1 and left != 0: if left != -1 and left != 0:
context, remain = remain[left:].strip('"'), remain[:left] context, remain = remain[left:].strip('"'), remain[:left]
@ -134,6 +133,7 @@ def _parse_snippets_file(data, filename):
lines = LineIterator(data) lines = LineIterator(data)
current_priority = 0 current_priority = 0
actions = {} actions = {}
context = None
for line in lines: for line in lines:
if not line.strip(): if not line.strip():
continue continue
@ -144,16 +144,22 @@ def _parse_snippets_file(data, filename):
filename, line, lines, filename, line, lines,
python_globals, python_globals,
current_priority, current_priority,
actions actions,
context
) )
actions = {} actions = {}
context = None
if snippet is not None: if snippet is not None:
yield snippet yield snippet
elif head == 'extends': elif head == 'extends':
yield handle_extends(tail, lines.line_index) yield handle_extends(tail, lines.line_index)
elif head == 'clearsnippets': elif head == 'clearsnippets':
yield 'clearsnippets', (current_priority, tail.split()) yield 'clearsnippets', (current_priority, tail.split())
elif head == 'context':
head, context, = handle_context(tail, lines.line_index)
if head == 'error':
yield (head, tail)
elif head == 'priority': elif head == 'priority':
try: try:
current_priority = int(tail.split()[0]) current_priority = int(tail.split()[0])

View File

@ -155,6 +155,12 @@ syn match snipPriority "^priority\%(\s.*\|$\)" contains=snipPriorityKeyword disp
syn match snipPriorityKeyword "^priority" contained nextgroup=snipPriorityValue skipwhite display syn match snipPriorityKeyword "^priority" contained nextgroup=snipPriorityValue skipwhite display
syn match snipPriorityValue "-\?\d\+" contained display syn match snipPriorityValue "-\?\d\+" contained display
" context {{{3
syn match snipContext "^\context\%(\s.*\|$\)" contains=snipContextKeyword display
syn match snipContextKeyword "^context" contained nextgroup=snipContextValue skipwhite display
syn match snipContextValue '".*"' contained display
" Actions {{{3 " Actions {{{3
syn match snipAction "^\%(pre_expand\|post_expand\|post_jump\).*$" contains=snipActionKeyword display skipwhite syn match snipAction "^\%(pre_expand\|post_expand\|post_jump\).*$" contains=snipActionKeyword display skipwhite
@ -212,6 +218,9 @@ hi def link snipTransformationReplace String
hi def link snipTransformationEscape snipEscape hi def link snipTransformationEscape snipEscape
hi def link snipTransformationOptions Operator hi def link snipTransformationOptions Operator
hi def link snipContextKeyword Keyword
hi def link snipContextValue String
hi def link snipPriorityKeyword Keyword hi def link snipPriorityKeyword Keyword
hi def link snipPriorityValue Number hi def link snipPriorityValue Number

View File

@ -11,7 +11,6 @@ class ContextSnippets_SimpleSnippet(_VimTest):
keys = 'a' + EX keys = 'a' + EX
wanted = 'abc' wanted = 'abc'
class ContextSnippets_ExpandOnTrue(_VimTest): class ContextSnippets_ExpandOnTrue(_VimTest):
files = { 'us/all.snippets': r""" files = { 'us/all.snippets': r"""
global !p global !p
@ -139,6 +138,7 @@ class ContextSnippets_CursorIsZeroBased(_VimTest):
keys = "e" + EX keys = "e" + EX
wanted = "(2, 1)" wanted = "(2, 1)"
class ContextSnippets_ContextIsClearedBeforeExpand(_VimTest): class ContextSnippets_ContextIsClearedBeforeExpand(_VimTest):
files = { 'us/all.snippets': r""" files = { 'us/all.snippets': r"""
pre_expand "snip.context = 1 if snip.context is None else 2" pre_expand "snip.context = 1 if snip.context is None else 2"
@ -164,3 +164,35 @@ class ContextSnippets_ContextHasAccessToVisual(_VimTest):
keys = "123" + ESC + "vhh" + EX + "test" + EX + " zzz" + ESC + \ keys = "123" + ESC + "vhh" + EX + "test" + EX + " zzz" + ESC + \
"vhh" + EX + "test" + EX "vhh" + EX + "test" + EX
wanted = "Yes No" wanted = "Yes No"
class ContextSnippets_Header_ExpandOnTrue(_VimTest):
files = { 'us/all.snippets': r"""
global !p
def check_context():
return True
endglobal
context "check_context()"
snippet a "desc" e
abc
endsnippet
"""}
keys = 'a' + EX
wanted = 'abc'
class ContextSnippets_Header_DoNotExpandOnFalse(_VimTest):
files = { 'us/all.snippets': r"""
global !p
def check_context():
return False
endglobal
context "check_context()"
snippet a "desc" e
abc
endsnippet
"""}
keys = 'a' + EX
wanted = keys