0

我有 UltiSnips 的 vim 并且它可以工作,但前提是我编写了整个触发器。有没有办法扩展只写部分触发器的片段?我曾经和 SnipMate 一起工作过,这很管用。

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

snippet someTrigger
blah blah
endsnippet

当我输入时它会扩展代码段:

someTrigger<tab>

但是当我打字时它不会

some<tab>
4

3 回答 3

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>

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

于 2014-04-23T21:48:41.877 回答
1

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

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

!r 将触发器标识为正则表达式 - 请注意,正则表达式触发器必须用引号引起来。这将从“some”或“someTrigger”扩展。

:help UltiSnips-adding-snippets

于 2014-05-08T14:47:59.683 回答
1

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

于 2014-04-24T05:46:35.350 回答