UltiSnips et YouCompleteMe

130

J'ai des bundles ultisnips et youcompleteme installés sur mon macvim. Le problème est que ultisnips ne fonctionne pas car tab est lié par ycm. J'ai essayé de faire en let g:UltiSnipsExpandTrigger = "<s-tab>"sorte que je puisse déclencher l'achèvement de l'extrait avec shift-tab, mais cela ne fonctionne pas pour une raison inconnue. Je pourrais utiliser des bouchons 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 l'onglet shift fonctionne? Pouvez-vous recommander une autre clé pour déclencher des extraits?

pvinis
la source
YCM cartographie également <S-Tab>, tout comme UltiSnips, IIRC. Vous devriez demander à l'auteur de YCM, je suppose.
romainl
J'ai changé les clés pour l'achèvement précédent sur ycm et supprimé s-tab. ne fonctionne toujours pas. je vais essayer de lui
envoyer un
1
Voyez si votre carte fonctionne avec :verbose map <S-Tab>, elle ne fonctionnera probablement pas sur la ligne de commande vim. Un très bon remplacement est imo <CR>.
Daan Bakker
Merci pour cela, j'avais hâte de trouver une solution et le fait que YouCompleteMe n'ait pas de forum est ennuyeux. Merci
atmosx
2
Avez-vous réessayé cela récemment? Un ou les deux plugins doivent avoir été mis à jour, car la documentation UltiSnips dit: "YouCompleteMe - est livré avec une prise en charge prête à l'emploi pour UltiSnips. Il offre une très belle boîte de dialogue de complétion pour les extraits."
Kyle Strand

Réponses:

188

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 via SuperTab. UltiSnips et SuperTab fonctionnent bien ensemble, vous pouvez donc simplement lier UltiSnips à l'onglet directement et tout fonctionnera.

Siegfried Gevatter
la source
7
La suggestion de Joey Liu ne fonctionnait pas pour moi (l'onglet ne développerait rien, il ferait seulement défiler jusqu'à l'option de saisie semi-automatique suivante). Cette réponse fonctionnait très bien, mais je devais d'abord mettre à jour et recompiler YouCompleteMe.
BenjaminGolder
1
Comme d'autres l'ont mentionné, la solution de Joey Liu ne fonctionne plus. Celui-là fait!
Ancre
3
Existe-t-il un moyen de mettre en évidence des extraits de code dans la liste de saisie semi-automatique?
syntagma
3
ZUT ! L'homme! Travailler comme un charme! La meilleure solution jamais!
Yves Lange
4
C'est bien, mais frapper à l' tabintérieur d'un extrait de code ira au prochain tabstop, au lieu de compléter la suggestion YCM. J'ai dû ajouter let g:UltiSnipsJumpForwardTrigger = "<Right>"et let g:UltiSnipsJumpBackwardTrigger = "<Left>"faire ce travail.
Gabriel Florit
48

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

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

Bien que ce paramètre fasse en sorte que l'expansion d'un extrait de code partage le mappage par défaut pour sauter en avant dans un extrait de code , il simule le comportement de TextMates comme indiqué dans les balises d'aide d'UltiSnips.

Depuis que j'ai mappé ma touche de verrouillage des majuscules à Ctrl, ce mappage fonctionne assez bien.

impossible
la source
1
Cela devrait être la meilleure réponse, simple et directe, bien que dans mon macvim sur macOS 10.12, <cj> ne fonctionne pas, je le change en <ck>, alors tout fonctionne très bien. <tab> vers l'avant, <s-tab> vers l'arrière, <ck> développez l'extrait. Merci
gpanda
40

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>"
Joey Liu
la source
27
Un peu de crédit là où il est dû je pense: github.com/Valloric/YouCompleteMe/issues/… Et le BufEnter autocmd quelques commentaires vers le bas.
ches
3
Cela ne semblait pas fonctionner pour moi, pour Mac OS X; à partir du 10 juillet 2014. La réponse de Siegfried a cependant fonctionné.
miguel.martin
Ça a l'air génial jusqu'à présent! Mais comment puis-je "parcourir" les points d'arrêt des extraits de code?
chmanie
1
Je l'ai trouvé pratique pour lier g:UltiSnipsJumpForwardTrigger="<cr>"afin que je puisse toujours parcourir toutes les complétions / extraits possibles
alaroldai
1
Cela me permet de parcourir la liste complète des YCM (y compris les suggestions Ultisnips), mais la dernière ligne <expr> inoremap ne semble pas réellement affecter mon appui sur la touche Entrée. Je peux déclencher manuellement la complétion avec <Cy>, mais enter ne fait rien. Aucune suggestion?
HaaR
18

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 orthographié UltiSnips avec Ultisnips .. eh bien, a fonctionné à la fin!

pvinis
la source
17

J'ai personnellement choisi de ne pas utiliser <tab>avec YouCompleteMe mais de naviguer manuellement.

J'ai donc ajouté ceci à mon .vimrc:

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

qui désactive simplement la tabclé pour YCM. À la place, vous utilisez les touches de déplacement (flèches ou CTRL-N/ CTRL-P) et sélectionnez l'entrée avec CR. UltiSnips fonctionne par défaut avec tab.

Thomas Fankhauser
la source
5

Juste en rassemblant les réponses de Michaelslec, Joey Liu et avec les solutions que j'ai trouvées dans ce fil de discussion et le vimrc de ce gars , j'ai maintenant cela qui a résolu à peu près tous les problèmes.

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
la source
Cela a été très utile pour essayer de résoudre le même problème avec COC et Ultisnips. Vous voulez utiliser <TAB> et <S-TAB> pour monter et descendre le PUM ainsi que pour aller et venir dans les espaces réservés Ultisnips. Merci.
110100100
4

Bien que je sache que cet article 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 gardez simplement les paramètres fournis par Joey Liu et que vous utilisez simplement cette fonction, tout fonctionnera parfaitement!

EDIT: J'utilise également une autre fonction pour augmenter la fonctionnalité de recul 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, mettez simplement 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 ensemble!

Michaelslec
la source
3

J'utilise les deux ensemble. Par défaut, YouCompleteMe lie <Tab>et <Down>pour sélectionner l'élément d'achèvement suivant et aussi <S-Tab>et <Up>pour sélectionner l'élément d'achèvement précédent. Vous pouvez modifier les liaisons YouCompleteMe avec les options g: ycm_key_list_select_completion et g: ycm_key_list_previous_completion . Notez que les noms de ces options ont été récemment modifiés lorsque l'option est passée d'une chaîne unique à une liste de chaînes.

David Brown
la source
3

J'ai installé le plugin UltiSnips après le plugin YouCompleteMe donc j'ai pensé qu'ils étaient en conflit, mais en réalité j'avais quelque chose de plus interférant:

set paste

Assurez-vous de le supprimer .vimrcs'il est présent.

Antoine Snyers
la source
2

Bien que Many answer fonctionne correctement dans cet article, je veux juste dire que le problème est causé par une collision de liaison de clé entre YCM et UltiSnip, alors que YCM prend en charge les extraits UltiSnip par défaut, il prend le déclencheur d'extension UltiSnip par défaut <tab>comme touche de sélection d'achèvement, donc Les extraits de code UltiSnip ne seront pas développés par <tab>. Leur donner une liaison de clé différente résoudra le problème, j'utilise personnellement <c-net <c-p>pour YCM et j'utilise la valeur <tab>par défaut pour UltiSnip. Vous pouvez obtenir plus de détails avec help youcompletemedoc dans vim.

Minghao Ni
la source
2

Sur la base de la réponse de Siegfried, j'utilise ce qui suit qui semble plus naturel:

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>"

J'utilise également les c-hjklliaisons ailleurs (passage d'un volet à un autre), mais ce ne serait qu'en mode normal, donc il n'y a pas de problème.

Nicolas Mattia
la source
1

J'utilise ;pour développer UltiSnips, c'est tellement chouette pour moi

let g:UltiSnipsExpandTrigger = ";"
Ruto Collins
la source
Edit: J'utilise maintenant \parce que j'ai trouvé que je ne pouvais pas taper ;sur le mode d'insertion de Vim
Ruto Collins
0

J'utilise kj. Voici ce qu'il y a dans mon .vimrc:

let g:UltisnipsExpandTrigger="kj".

Il m'arrive rarement de tomber sur un mot qui contient kj. Si tel est le cas, j'attendrais juste quelques secondes après avoir tapé ket ce type j.

Dowewas
la source
0

Comme mentionné par d'autres, mapper Cj aux ultisnips fonctionne très bien.
let g:UltiSnipsExpandTrigger="<c-j>"

Maintenant, si vous allez un peu plus loin et installez xcape et utilisez
xcape -e "Shift_L=Control_R|J"

Vous libérez la puissance d'utiliser uniquement la touche Maj pour les utlitsnips.

Hritik
la source