Qual é a diferença entre os plugins do vim snippets?


25

Existe um grande número de plugins de snippets para o vim: ultisnips , snipmate , xptemplate , neosnippet e muito mais.

Todos eles têm prós e contras e mais ou menos dependências. Até agora, uso ultisnips, mas nunca fiquei totalmente satisfeito com isso.

Como temos uma pergunta muito interessante e completa sobre os gerenciadores de plugins , acho que seria bastante útil ter o mesmo tipo de explicação sobre os plugins de snippets.

Há uma lista aqui que pode ser um bom começo, mas algumas respostas completas, claras e precisas, conforme nossa comunidade pode escrever, seriam bastante úteis.


11
Você também tem essa matriz fornecido em Marc Weber wiki: vim-wiki.mawercer.de/wiki/topic/...
Luc Hermitte

2
IMHO isso é bastante genérico, talvez se você elaborar o "nunca foi totalmente satisfeito com isso"? Eu uso o "neosnippet.vim" de Shougo.
VanLaser

você deve atualizar o wiki com as informações daqui. obrigado.
Christian Brabandt

@ChristianBrabandt: Sim, assim que tiver algum tempo (nos próximos dias) atualizarei.
statox

Respostas:


22

Estou usando ultisnips há várias semanas.

Eu acho que as principais vantagens deste plugin são as seguintes:

  • É bem rápido, mesmo com um grande número de trechos disponíveis.
  • A sintaxe básica para definir um novo trecho é fácil de entender; portanto, é fácil criar rapidamente um novo trecho fazendo o que você deseja fazer. (Para trechos mais complexos, pode ser necessário um trabalho adicional.)
  • Funciona muito bem fora da caixa; uma configuração básica permite que você use trechos muito rapidamente.
  • É realmente configurável. Mesmo que a configuração básica funcione bem, se você for um usuário avançado, poderá ajustá-la com bastante precisão.

Antes de tudo, o ultisnips é um mecanismo de snippet, o que significa que o plug-in fornece recursos para usar snippets, mas não fornece os snippets. Para obter os trechos, o autor recomenda vim-snippets .

Depois de instalar os dois plug-ins, você poderá usar seus snippets.

Os trechos de definições são armazenadas em arquivos chamados seguinte padrões: ft.snippets, ft_*.snippetsou ft/*, onde fté o 'filetype' do documento atual e *é um shell-like correspondência curinga qualquer cadeia, incluindo a cadeia vazia. (Observe que a sintaxe do tipo de arquivo pontilhado cuda.cppé suportada.)

Dessa maneira, fragmentos específicos para um tipo de arquivo são expandidos apenas quando o tipo de arquivo do buffer é definido. Um tipo de arquivo especial allestá disponível para criar trechos expandidos em todos os buffers.

Além dos snippets fornecidos pelos vim-snippets, o usuário pode definir seus próprios snippets. Minha recomendação seria colocá-los no diretório ~/.vim/my-snippets/Ultisnipsdesta maneira, o Ultisnips os encontrará sem configuração adicional e é fácil mantê-los em um repositório dotfile.

Para expandir os trechos, o Ultisnips fornece uma variável g:UltiSnipsExpandTrigger que define o mapeamento que acionará a expansão (eu escolhi o **que é bastante conveniente para mim). Observe que uma integração deve ser possível, mas eu não a testei sozinha).

Para usuários avançados, o Ultisnips também fornece algumas funções para personalizar o comportamento da expansão ou para acioná-lo de maneira diferente. Vejo:h UltiSnips-trigger-functions


Este é o primeiro gerenciador de trechos que eu realmente usei extensivamente e acho que esse é um bom começo, por sua simplicidade imediata e por sua possibilidade de ser ajustado.

Finalmente, aqui está uma lista de screencasts que fornecem uma boa introdução ao plugin:


Você sabe como fazê-lo para que ele não se expanda ao ser acionado, a menos que seja precedido por espaço em branco OU a >(como na chave de fechamento do HTML. O fato de ele não saber que no final de uma tag é irritante, porque se eu ativar a opção i, em seguida, torna-se por isso expande-lo mesmo se sua no meio de uma palavra que não é bom.
Tallboy

13

Eu uso o SnipMate original desde que comecei a usar o Vim.

  • Não possui dependências externas.
  • Ele usa uma sintaxe muito simples.
  • É muito fácil de configurar.
  • Está abandonado desde 2009.

Não tenho nada a reclamar.


16
É a primeira vez que vejo alguém mencionando o abandono como uma característica. : D
muru

6
Um projeto abandonado é um projeto estável. Você não precisa se preocupar com o fato de sua instância local estar desatualizada ou com uma atualização interrompendo seu fluxo de trabalho com uma alteração na API. Se atendeu às suas necessidades quando você o instalou, continuará a fazê-lo para sempre. A menos que suas necessidades mudem. Estabilidade é o recurso número 1 que procuro em qualquer ferramenta.
Romainl

3
"Se satisfez suas necessidades quando você o instalou, continuará a fazê-lo para sempre. A menos que suas necessidades mudem." Ou você encontra um bug; nesse momento, você precisa corrigi-lo, encontrar outra pessoa para corrigi-lo ou procurar uma alternativa; um que não tenha sido abandonado, talvez.

11
Obrigado pela sua resposta @romainl! Eu tenho uma pergunta: você disse que o plug-in foi abandonado, mas o readme é redirecionado para uma versão mais nova, que parece bastante ativa e vários commits parecem corrigir algumas coisas, não é melhor usar o novo?
Statox

11
Existem alguns bugs e erros de documentação no UltraSnips que contribuem para uma experiência introdutória menos do que agradável. Depois de finalmente executá-lo, decidi verificar o SnipMate e entender o argumento de estabilidade da @ romainl.
chb

7

Aqui está uma lista de recursos do mu-template . Discl .: Sou seu mantenedor.

  • Os arquivos de modelo podem ser expandidos:
    • automaticamente ao abrir um novo buffer (a menos que esteja desativado no .vimrc),
    • explicitamente através de menus ou da linha de comando,
    • no modo INSERT de maneira semelhante a um snippet;
    • do modo VISUAL para cercar a seleção com um trecho - o ambiente pode ser aplicado a diferentes zonas do trecho (por exemplo, zonas de código ou condição em uma whileinstrução de controle);
  • Todos os trechos são definidos em seu próprio arquivo de modelo - todos os outros mecanismos de trecho usam um arquivo por tipo de arquivo e colocam todos os trechos nele;
  • Os arquivos de modelo podem ser substituídos pelo usuário ou no contexto de um projeto específico;
  • Os trechos específicos do tipo de arquivo podem ser definidos para o modo INSERT (eles podem ser herdados, por exemplo, os trechos C podem ser usados ​​em C ++, Java etc.). A lista de trechos correspondentes será apresentada com uma dica para cada trecho;
  • Expressões VimL computadas podem ser inseridas;
  • As instruções do VimL podem ser executadas durante a expansão - eu uso-a para adicionar automaticamente instruções de inclusão ou importação ausentes;
  • Os arquivos de modelo podem incluir outros arquivos de modelo de maneira semelhante à função (os parâmetros ainda são suportados) - AFAIK, muito poucos mecanismos de snippet implementam isso, eles nem conseguem suportar aliases de snippet, o que é trivial de implementar graças a esse recurso;
  • Totalmente integrado ao meu sistema de espaços reservados;
  • Suporta re-indentação (se desejado) e indentação de Python;
  • Funciona bem com dobragem de vim;
  • Amigável;
  • Quando vários trechos coincidem, um menu de conclusão avançado é exibido (inspirado no menu pop-up do YouCompleteMe);
  • Opções de estilo são aplicadas automaticamente (como você prefere seus suportes? if (...) {\n}? if (...)\n{\n}Algo mais?), E, claro, eles podem ser ajustados de acordo com o projeto atual, ou o tipo de arquivo atual, ou mesmo ambos;
  • O plugin é 100% VimL. O Python pode ser usado no arquivo de modelo.
  • O mu-template depende de dois plugins de biblioteca (lh-vim-lib e lh-dev) e do meu sistema de espaço reservado (lh-brackets) - é por isso que recomendo instalá-lo com VAM ou VimFlavor, pois forneço os arquivos que declaram as dependências;
  • A licença é compatível com a geração de código - isso significa que, embora o código mu-template esteja sob a GPLv3, os trechos não estejam, você pode usá-los no código proprietário: alguns trechos estão sob a Boost Software License;

  • A expansão ocorre após o carregamento de todos os vimrcs locais presentes - para definir variáveis ​​específicas do projeto antes que a expansão seja concluída.

  • Graças ao plug-in StakeHolders de Tom Link, o µTemplate possui espaços reservados vinculados (a modificação de um espaço reservado nomeado modifica outros espaços reservados com o mesmo nome). A não instalação das partes interessadas não impedirá o uso do µTemplate.

Para ser sincero, a sintaxe do modelo é um pouco complicada e o sistema de espaço reservado pertence à primeira geração de espaços reservados - o mu-template é um dos mais antigos mecanismos de modelo / snippets do Vim.

No entanto, o fato de permitir que trechos incluam outros trechos (condicionalmente e com parâmetros) que podem ou não ser substituídos é muito importante. Aplicações típicas são

  • o modelo de arquivo C ++

    1. que inclui um cabeçalho de arquivo (geralmente ajustado de maneira diferente para cada projeto, a fim de incluir o aviso de direitos autorais correto)
    2. carregue o modelo mais adequado ao tipo atual de arquivo (.h, .cpp ou arquivo de teste de unidade)
      • no caso do arquivo de cabeçalho, os protetores anti-reinclusão serão incluídos - a maneira como eles são calculados pode ser substituída (novamente para seguir as políticas do projeto)
      • no caso dos arquivos .cpp, o arquivo .h correspondente é incluído automaticamente, se encontrado
  • Eu tenho um snippet / assistente de classe genérico no lh-cpp. E vários tipos de classes especializadas que usam esse modelo de classe comum, mas com parâmetros diferentes.


Obrigado pela sua resposta! Eu tenho uma pergunta: você disse All snippets are defined in their own template-file -- all other snippet engines use one file per filetype and put all snippets in it qual é a vantagem dessa arquitetura em comparação com a habitual (ou seja, um arquivo por tipo de arquivo)?
statox

@statox Eu diria que este é um problema de manutenção de trechos. Alguns trechos são excessivamente complexos. Dê uma olhada no lh-cpp, internals/class-skeletonpor exemplo. Prefiro não misturá-lo com os trechos da declaração de controle. Mas devo admitir que ter todas as declarações de controle juntas não seria tão problemático. Além disso, graças a esta abordagem, que pode muito facilmente substituir meus trechos, atualizá-los em tempo real, usá-los como funções, etc
Luc Hermitte

De fato, quando vejo seu link, posso entender por que alguns trechos vivem melhor em seus próprios arquivos. Obrigado por seus esclarecimentos.
statox

11
@statox Na verdade, muitos trechos que tenho tendem a ser complexos: eles detectam, deduzem e tentam fazer o máximo possível de coisas inteligentes. Na maioria das vezes, movo o código para funções carregadas automaticamente, mas às vezes faz mais sentido usar vários trechos que se chamam (e agem como pontos de variação que podem ser ajustados para as necessidades do projeto -> declarações de direitos autorais, ...)
Luc Hermitte

4

SnipMate e UltiSnips são os dois mecanismos de snippet mais populares para o Vim. Ambos são inspirados na sintaxe do snippet do TextMate. O UltiSnips pode executar todos os snippets do SnipMate, mas também possui sintaxe adicional para torná-lo mais poderoso.

Uma boa regra geral é que, se o seu Vim tiver suporte a python, use o UltiSnips. Caso contrário, use o SnipMate.

No meu .vimrc, eu carrego (usando o Plug) qualquer um dos plugins, dependendo da disponibilidade do python.

if (has('python') || has('python3'))
    Plug 'SirVer/ultisnips'
else
    Plug 'garbas/vim-snipmate'
    Plug 'MarcWeber/vim-addon-mw-utils' "required for snipmate
    Plug 'tomtom/tlib_vim' "required for snipmate
endif

O UltiSnips também pode executar códigos python em seu snippet, permitindo fazer alguns truques interessantes. Este é um dos meus trechos favoritos que desenham uma caixa em torno de um texto (de Como eu sou capaz de fazer anotações em aulas de matemática usando o LaTeX e o Vim | Gilles Castel )

snippet box2 "Box"
`!p snip.rv = '┌' + '─' * (len(t[1]) + 2) + '┐'`
│ $1 │
`!p snip.rv = '└' + '─' * (len(t[1]) + 2) + '┘'`
$0
endsnippet

Com esse trecho, posso gerar algo assim:

┌─────────────────────┐
│ this is a cool box! │
└─────────────────────┘
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.