我有 UltiSnips 的 vim 并且它可以工作,但前提是我编写了整个触发器。有没有办法扩展只写部分触发器的片段?我曾经和 SnipMate 一起工作过,这很管用。
例如:如果我有如下触发器:
snippet someTrigger
blah blah
endsnippet
当我输入时它会扩展代码段:
someTrigger<tab>
但是当我打字时它不会
some<tab>
我将提供两个关于 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>
如果只有一个匹配的片段,它将正常工作。如果存在两个片段,则会出现一个菜单,让您可以从其中一个匹配选项中进行选择。
如果您只是对匹配some
或感兴趣someTrigger
,最简单的解决方案可能是使用正则表达式触发器:
snippet "some(Trigger)?" !r
blah blah
endsnippet
!r 将触发器标识为正则表达式 - 请注意,正则表达式触发器必须用引号引起来。这将从“some”或“someTrigger”扩展。
看:help UltiSnips-adding-snippets
Ultisnips 还提供了一个通常映射到的 API <C-Tab>
UltiSnips#ListSnippets()
,你应该使用它以防你想避免输入整个片段名称,尽管发生冲突的可能性会更大。