如何仅使用触发器的一部分来扩展片段?

时间:2014-04-23 20:52:03

标签: vim ultisnips

我有与UltiSnips的vim并且它正在工作但只有我写完整个触发器。有没有办法扩展代码片段只写一部分触发器?我曾经使用SnipMate工作。

例如:如果我有如下触发器:

snippet someTrigger
blah blah
endsnippet

我在输入时展开代码段:

someTrigger<tab>

但是当我输入

时却没有
some<tab>

3 个答案:

答案 0 :(得分:2)

我将提供两个关于ultisnips文档的例子(我熟悉这些,因为我自己编写了这些特定的例子)。

第一个,不依赖于任何外部插件:

function! ExpandPossibleShorterSnippet()
  if len(UltiSnips#SnippetsInCurrentScope()) == 1 "only one candidate...
    let curr_key = keys(UltiSnips#SnippetsInCurrentScope())[0]
    normal diw
    exe "normal a" . curr_key
    exe "normal a "
    return 1
  endif
  return 0
endfunction
inoremap <silent> <C-L> <C-R>=(ExpandPossibleShorterSnippet() == 0? '': UltiSnips#ExpandSnippet())<CR>

如果没有其他代码段符合您已编写的内容,这将使<CTRL-L>扩展当前代码段。

第二个示例使用另一个插件unite

function! UltiSnipsCallUnite()
  Unite -start-insert -winheight=100 -immediately -no-empty ultisnips
  return ''
endfunction

inoremap <silent> <F12> <C-R>=(pumvisible()? "\<LT>C-E>":"")<CR><C-R>=UltiSnipsCallUnite()<CR>
nnoremap <silent> <F12> a<C-R>=(pumvisible()? "\<LT>C-E>":"")<CR><C-R>=UltiSnipsCallUnite()<CR>

如果只有一个匹配的代码段,它将正常工作。如果存在两个片段,则会出现一个菜单,您可以选择其中一个匹配选项。

答案 1 :(得分:1)

Ultisnips还提供了一个通常映射到<C-Tab> UltiSnips#ListSnippets()的API,如果你想避免输入整个代码段名称,你应该使用它,尽管冲突的可能性会更大。

答案 2 :(得分:1)

如果您只对匹配somesomeTrigger感兴趣,最简单的解决方案可能是使用正则表达式触发器:

snippet "some(Trigger)?" !r
blah blah
endsnippet

!r将触发器标识为正则表达式 - 请注意,正则表达式触发器必须用引号括起来。 这将从一些&#39;或者&#39; someTrigger&#39;。

请参阅:help UltiSnips-adding-snippets