UltiSnips e YouCompleteMe

130

Tenho ultisnips de pacotes e você completou o instalador no meu macvim. O problema é que o ultisnips não funciona porque tab é limitado por ycm. Tentei colocar let g:UltiSnipsExpandTrigger = "<s-tab>"para poder disparar a conclusão do trecho com shift-tab, mas não funciona por algum motivo desconhecido. Eu poderia usar caps como gatilho, mas até agora não encontrei nenhuma maneira de fazer isso.

Algum de vocês usa esses dois complementos juntos? O que posso fazer para que a guia shift funcione? Você pode recomendar outra chave para acionar snippets?

pvinis
fonte
O YCM também mapeia <S-Tab>e o UltiSnips, IIRC também. Você deveria perguntar ao autor da YCM, eu acho.
romainl
Eu mudei as teclas para conclusão anterior em ycm e removi o s-tab. Ainda não funciona. eu vou tentar mensagens dele no github eu acho
pvinis
1
Veja se o seu mapa está funcionando :verbose map <S-Tab>, provavelmente não funcionará no vim da linha de comando. Um imo de substituição muito bom é <CR>.
Daan Bakker
Obrigado por isso, eu estava ansioso para encontrar uma solução e o fato de o YouCompleteMe não ter um fórum é irritante. Obrigado
atmosx
2
Você tentou isso de novo recentemente? Um ou ambos os plug-ins devem ter sido atualizados, porque a documentação do UltiSnips diz: "YouCompleteMe - vem com suporte imediato para o UltiSnips. Ele oferece um ótimo diálogo de conclusão para os snippets".
Kyle Strand

Respostas:

188

Outra opção é usar o plug-in SuperTab:

" if you use Vundle, load plugins:
Bundle 'ervandew/supertab'
Bundle 'Valloric/YouCompleteMe'
Bundle 'SirVer/ultisnips'

" make YCM compatible with UltiSnips (using supertab)
let g:ycm_key_list_select_completion = ['<C-n>', '<Down>']
let g:ycm_key_list_previous_completion = ['<C-p>', '<Up>']
let g:SuperTabDefaultCompletionType = '<C-n>'

" better key bindings for UltiSnipsExpandTrigger
let g:UltiSnipsExpandTrigger = "<tab>"
let g:UltiSnipsJumpForwardTrigger = "<tab>"
let g:UltiSnipsJumpBackwardTrigger = "<s-tab>"

Aqui o YouCompleteMe está vinculado a uma combinação diferente Ctrln, mas essa combinação está vinculada à guia da SuperTab. O UltiSnips e o SuperTab funcionam bem juntos, para que você possa vincular o UltiSnips à aba diretamente e tudo dará certo.

Siegfried Gevatter
fonte
7
A sugestão de Joey Liu não estava funcionando para mim (a guia não expandiria nada, seria apenas rolar para a próxima opção de preenchimento automático). Essa resposta funcionou muito bem, mas tive que atualizar e recompilar o YouCompleteMe primeiro.
21714 BenjaminGolder
1
Como outros já mencionaram, a solução de Joey Liu não está mais funcionando. Este faz!
Anchor
3
Existe alguma maneira de destacar trechos na lista de preenchimento automático?
Syntagma
3
DROGA ! Homem ! Trabalhando como um encanto! Melhor solução de sempre!
Yves Lange
4
Isso é bom, mas pressionar tabdentro de um snippet irá para a próxima tabstop, em vez de concluir a sugestão do YCM. Eu tive que adicionar let g:UltiSnipsJumpForwardTrigger = "<Right>"e let g:UltiSnipsJumpBackwardTrigger = "<Left>"fazer isso funcionar.
Gabriel Florit
48

Tente esta sugestão em uma página do rastreador de problemas do YouCompleteMe. No seu .vimrc:

let g:UltiSnipsExpandTrigger="<c-j>"

Embora essa configuração faça com que a expansão de um trecho compartilhe o mapeamento padrão para avançar dentro de um trecho , ela simula o comportamento do TextMates, conforme mencionado nas tags de ajuda do UltiSnips.

Desde que mapeei minha tecla Caps Lock para Ctrl, esse mapeamento funciona muito bem.

inevitável
fonte
1
Essa deve ser a melhor resposta, simples e direta, embora, no meu macvim no macOS 10.12, <cj> não funcione, eu mudei para <ck>, e tudo funcione perfeitamente. <tab> para frente, <s-tab> para trás, <ck> expanda o snippet. Graças
gpanda
40

copie o seguinte código para o seu vimrc e aproveite. Esta função tratará de todos os problemas entre o YCM e o UltiSnips.

function! g:UltiSnips_Complete()
    call UltiSnips#ExpandSnippet()
    if g:ulti_expand_res == 0
        if pumvisible()
            return "\<C-n>"
        else
            call UltiSnips#JumpForwards()
            if g:ulti_jump_forwards_res == 0
               return "\<TAB>"
            endif
        endif
    endif
    return ""
endfunction

au BufEnter * exec "inoremap <silent> " . g:UltiSnipsExpandTrigger . " <C-R>=g:UltiSnips_Complete()<cr>"
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsListSnippets="<c-e>"
" this mapping Enter key to <C-y> to chose the current highlight item 
" and close the selection list, same as other IDEs.
" CONFLICT with some plugins like tpope/Endwise
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
Joey Liu
fonte
27
Acho que é devido algum crédito: github.com/Valloric/YouCompleteMe/issues/… E o BufEnter autocmd alguns comentários abaixo.
Ches
3
Isso não pareceu funcionar para mim, para o Mac OS X; a partir de 10 de julho de 2014. A resposta de Siegfried funcionou, no entanto.
224148 miguel.martin
Parece ótimo até agora! Mas como posso "tabular" os pontos de interrupção do snippet?
chmanie
1
Eu encontrei-o útil para ligar g:UltiSnipsJumpForwardTrigger="<cr>"para que eu pudesse ainda guia através de todas as conclusões possíveis / trechos
alaroldai
1
Isso me permite percorrer as conclusões YCM listadas (incluindo sugestões de Ultisnips), mas a última linha inoremap <expr> não parece estar afetando meu pressionamento da tecla Enter. Posso acionar manualmente a conclusão com <Cy>, mas enter não faz nada. Alguma sugestão?
HaaR
18

eu tenho isso no meu vimrc

"" YouCompleteMe
let g:ycm_key_list_previous_completion=['<Up>']

"" Ultisnips
let g:UltiSnipsExpandTrigger="<c-tab>"
let g:UltiSnipsListSnippets="<c-s-tab>"

foi o que eu fiz na minha primeira tentativa, mas eu escrevi errado o UltiSnips com o Ultisnips .. oh bem, funcionou no final!

pvinis
fonte
17

Pessoalmente, optei por não usar o <tab>YouCompleteMe, mas navegá-lo manualmente.

Então eu adicionei isso ao meu .vimrc:

let g:ycm_key_list_select_completion=[]
let g:ycm_key_list_previous_completion=[]

que simplesmente desativa a tabchave para o YCM. Em vez disso, use as teclas de movimento (setas ou CTRL-N/ CTRL-P) e selecione a entrada com CR. O UltiSnips trabalha com o padrão tab.

Thomas Fankhauser
fonte
5

Apenas reunindo respostas de Michaelslec, Joey Liu e junto com as soluções que encontrei neste tópico e no vimrc desse cara , agora tenho isso que resolveu praticamente todos os problemas.

function! g:UltiSnips_Complete()
  call UltiSnips#ExpandSnippet()
  if g:ulti_expand_res == 0
    if pumvisible()
      return "\<C-n>"
    else
      call UltiSnips#JumpForwards()
      if g:ulti_jump_forwards_res == 0
        return "\<TAB>"
      endif
    endif
  endif
  return ""
endfunction

function! g:UltiSnips_Reverse()
  call UltiSnips#JumpBackwards()
  if g:ulti_jump_backwards_res == 0
    return "\<C-P>"
  endif

  return ""
endfunction


if !exists("g:UltiSnipsJumpForwardTrigger")
  let g:UltiSnipsJumpForwardTrigger = "<tab>"
endif

if !exists("g:UltiSnipsJumpBackwardTrigger")
  let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
endif

au InsertEnter * exec "inoremap <silent> " . g:UltiSnipsExpandTrigger     . " <C-R>=g:UltiSnips_Complete()<cr>"
au InsertEnter * exec "inoremap <silent> " .     g:UltiSnipsJumpBackwardTrigger . " <C-R>=g:UltiSnips_Reverse()<cr>"
sudo bangbang
fonte
Isso foi muito útil ao tentar essencialmente corrigir o mesmo problema com o COC e o Ultisnips. Deseja usar <TAB> e <S-TAB> para mover para cima e para baixo no PUM, bem como para frente e para trás nos espaços reservados Ultisnips. Obrigado.
110100100
4

Embora eu saiba que este post é um pouco antigo, tenho minha própria função que é um pouco mais otimizada do que a mencionada acima:

function! g:UltiSnips_Complete()
  call UltiSnips#ExpandSnippetOrJump()
  if g:ulti_expand_or_jump_res == 0
    if pumvisible()
      return "\<C-N>"
    else
      return "\<TAB>"
    endif
  endif

  return ""
endfunction

Obviamente, se você mantiver as configurações fornecidas por Joey Liu e usar esta função, tudo funcionará perfeitamente!

Edição: Além disso, eu uso outra função para aumentar a funcionalidade de retrocesso entre YouCompleteMe e UltiSnips. Eu vou te mostrar o que eu quero dizer:

function! g:UltiSnips_Reverse()                                                                                               
  call UltiSnips#JumpBackwards()                                                                                              
  if g:ulti_jump_backwards_res == 0        
    return "\<C-P>"                                                                                                           
  endif                                                                                                                       

  return ""                                                                                                                   
endfunction

Em seguida, basta colocar isso no seu .vimrc:

au BufEnter * exec "inoremap <silent> " . g:UltiSnipsJumpBackwardTrigger . " <C-R>=g:UltiSnips_Reverse()<cr>"

Bem como let g:UltiSnipsJumpBackwardTrigger="<s-tab>"e seu conjunto!

Michaelslec
fonte
3

Eu uso os dois juntos. Por padrão, o YouCompleteMe liga <Tab>e <Down>para selecionar o próximo item de conclusão e também <S-Tab>e <Up>para selecionar o item de conclusão anterior. Você pode alterar as ligações do YouCompleteMe com as opções g: ycm_key_list_select_completion e g: ycm_key_list_previous_completion . Observe que os nomes dessas opções foram alterados recentemente quando a opção foi alterada de uma única sequência para uma lista de sequências.

David Brown
fonte
3

Eu instalei o plugin UltiSnips após o plugin YouCompleteMe, então pensei que eles eram conflitantes, mas na realidade eu tinha algo mais interferente:

set paste

Remova isso .vimrcse estiver presente.

Antoine Snyers
fonte
2

Embora Muitas respostas funcionem bem neste post, eu só quero dizer que o problema é causado pela colisão de ligação de chave entre o YCM e o UltiSnip, enquanto o YCM suporta os snippets do UltiSnip por padrão, ele usa o gatilho de expansão padrão do UltiSnip <tab>como sua chave de seleção de conclusão, portanto Os snippets do UltiSnip não serão ampliados <tab>. Dê-lhes diferente de ligação vai resolver o problema fundamental, eu pessoalmente uso <c-ne <c-p>para YCM e usar o padrão <tab>para UltiSnip. Você pode obter mais detalhes com o help youcompletemedoc in vim.

Minghao Ni
fonte
2

Com base na resposta de Siegfried, estou usando o seguinte que parece mais natural:

let g:ycm_key_list_select_completion = ['<C-j>']
let g:ycm_key_list_previous_completion = ['<C-k>']

let g:UltiSnipsExpandTrigger = "<C-l>"
let g:UltiSnipsJumpForwardTrigger = "<C-j>"
let g:UltiSnipsJumpBackwardTrigger = "<C-k>"

Eu também uso as c-hjklligações em outro lugar (alternando de um painel para outro), mas isso seria apenas no modo normal, portanto não há problema.

Nicolas Mattia
fonte
1

Eu uso ;para expandir o UltiSnips, é tão bacana para mim

let g:UltiSnipsExpandTrigger = ";"
Ruto Collins
fonte
Edit: Agora uso \porque descobri que não sabia digitar ;no modo de inserção do Vim
Ruto Collins 17/06
0

Eu uso kj. Isto é o que está no meu .vimrc:

let g:UltisnipsExpandTrigger="kj".

Raramente acontece que eu me deparo com a palavra que contém kj. Se for esse o caso, esperaria apenas alguns segundos após digitar ke esse tipo j.

Dowewas
fonte
0

Conforme mencionado por outros, o mapeamento de Cj para ultisnips funciona muito bem.
let g:UltiSnipsExpandTrigger="<c-j>"

Agora, se você for um pouco mais longe, instalar o xcape e usar
xcape -e "Shift_L=Control_R|J"

Você libera o poder de usar apenas a tecla Shift para obter dicas.

Hritik
fonte