137 votes

UltiSnips et YouCompleteMe

J'ai les bundles ultisnips et youcompleteme installés sur mon macvim. Le problème est que ultisnips ne fonctionne pas parce que tab est lié par ycm. J'ai essayé de mettre let g:UltiSnipsExpandTrigger = "<s-tab>" afin de pouvoir déclencher l'achèvement du snippet avec shift-tab, mais cela ne fonctionne pas pour une raison inconnue. Je pourrais utiliser les majuscules comme déclencheur, mais jusqu'à présent, je n'ai trouvé aucun moyen de le faire.

L'un d'entre vous utilise-t-il ces deux modules complémentaires ensemble ? Que puis-je faire pour que shift-tab fonctionne ? Pouvez-vous me recommander une autre touche pour déclencher les snippets ?

0 votes

Le YCM cartographie également <S-Tab> et UltiSnips aussi, IIRC. Vous devriez demander à l'auteur du YCM, je suppose.

0 votes

J'ai changé les clés de l'achèvement précédent sur ycm, et supprimé s-tab. cela ne fonctionne toujours pas. je vais essayer de lui envoyer un message sur github, je pense.

1 votes

Vérifiez si votre carte fonctionne avec :verbose map <S-Tab> Il ne fonctionnera probablement pas avec vim en ligne de commande. Un bon remplacement est <CR> .

202voto

Une autre option consiste à utiliser le plugin 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>"

Ici YouCompleteMe est lié à une combinaison différente Ctrln mais cette combinaison est liée à l'onglet par le biais de SuperTab. UltiSnips et SuperTab fonctionnent bien ensemble, vous pouvez donc lier directement UltiSnips à Tab et tout se passera bien.

8 votes

La suggestion de Joey Liu ne fonctionnait pas pour moi (l'onglet ne se développait pas, il défilait seulement vers l'option de saisie automatique suivante). Cette réponse a très bien fonctionné, mais j'ai dû d'abord mettre à jour et recompiler YouCompleteMe.

0 votes

Siegfried, voulez-vous consolider vos deux réponses ?

0 votes

@BenjaminGolder Oh, je ne sais pas vraiment pourquoi je l'ai posté deux fois. C'est fait, merci.

52voto

unblevable Points 478

Essayez cette suggestion sur un page de l'outil de suivi des problèmes de YouCompleteMe. Dans votre .vimrc :

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

Alors que ce paramètre rendra l'expansion d'un extrait partager le mappage par défaut pour sauter en avant dans un extrait Il simule le comportement de TextMates tel que mentionné dans les balises d'aide d'UltiSnips.

Comme j'ai associé ma touche de verrouillage des majuscules à la touche Ctrl, cette association fonctionne sans problème.

1 votes

Cela devrait être la meilleure réponse, simple et directe, bien que dans mon macvim sur macOS 10.12, <c-j> ne fonctionne pas, je le change en <c-k>, puis tout fonctionne parfaitement. <tab>en avant, <s-tab>en arrière, <c-k> développer le snippet. Merci

0 votes

J'étais nouveau sur Ultisnips et j'ai essayé cette suggestion. Je ne la recommanderais pas car le fait d'avoir à la fois "jumping forward" et "expand" sur la même touche rend les snippets imbriqués inutilisables, ce qui est quelque chose dont vous aurez probablement besoin.

40voto

Joey Liu Points 390

Copiez le code suivant dans votre vimrc, et profitez-en. Cette fonction gérera tous les problèmes entre YCM et 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>"

27 votes

Un peu de crédit là où il est dû, je pense : github.com/Valloric/YouCompleteMe/issues/ Et l'autocmd BufEnter quelques commentaires plus bas.

3 votes

Cela n'a pas semblé fonctionner pour moi, pour Mac OS X ; à partir du 10 juillet 2014. La réponse de Siegfried a fonctionné, cependant.

0 votes

Il a l'air génial jusqu'à présent ! Mais comment puis-je "tabuler" les points d'arrêt des snippets ?

18voto

pvinis Points 853

J'ai ceci dans mon vimrc

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

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

c'est ce que j'ai fait lors de mon premier essai, mais j'ai mal écrit UltiSnips avec Ultisnips oh bien, ça a marché à la fin !

4voto

Michaelslec Points 59

Bien que je sache que ce post est un peu vieux, j'ai ma propre fonction qui est un peu plus optimisée que celle donnée ci-dessus :

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

Bien sûr, si vous conservez les paramètres fournis par Joey Liu et que vous utilisez cette fonction, tout fonctionnera parfaitement !

EDIT : Aussi, j'utilise une autre fonction pour augmenter la fonctionnalité de back-stepping entre YouCompleteMe et UltiSnips. Je vais vous montrer ce que je veux dire :

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

  return ""                                                                                                                   
endfunction

Ensuite, il suffit de mettre ceci dans votre .vimrc :

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

Ainsi que let g:UltiSnipsJumpBackwardTrigger="<s-tab>" et votre plateau !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X