我有与UltiSnips的vim并且它正在工作但只有我写完整个触发器。有没有办法扩展代码片段只写一部分触发器?我曾经使用SnipMate工作。
例如:如果我有如下触发器:
snippet someTrigger
blah blah
endsnippet
我在输入时展开代码段:
someTrigger<tab>
但是当我输入
时却没有some<tab>
答案 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)
如果您只对匹配some
或someTrigger
感兴趣,最简单的解决方案可能是使用正则表达式触发器:
snippet "some(Trigger)?" !r
blah blah
endsnippet
!r将触发器标识为正则表达式 - 请注意,正则表达式触发器必须用引号括起来。 这将从一些&#39;或者&#39; someTrigger&#39;。
请参阅:help UltiSnips-adding-snippets