web-dev-qa-db-fra.com

UltiSnips et YouCompleteMe

J'ai des ensembles 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 mettre let g:UltiSnipsExpandTrigger = "<s-tab>" afin que je puisse déclencher la fin de l'extrait de code 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.

Est-ce que l'un de vous utilise ces deux add-ons ensemble? Que puis-je faire pour que Shift-Tab fonctionne? Pouvez-vous recommander une autre clé pour déclencher des extraits?

124
pvinis

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.

18
pvinis

Une autre option utilise 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 à la tabulation via SuperTab. UltiSnips et SuperTab jouent à Nice ensemble, vous pouvez ainsi lier UltiSnips directement à l'onglet et tout ira bien.

177

Essayez cette suggestion sur une page à partir du suivi des problèmes de YouCompleteMe. Dans votre .vimrc:

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

Bien que ce paramètre permette de développer un extrait en partageant le mappage par défaut pour le passage en aval dans un extrait , 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 sur Ctrl, ce mappage fonctionne plutôt bien.

46
unblevable

copiez le code suivant sur votre vimrc et profitez-en. Cette fonction traitera 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>"
37
Joey Liu

J'ai personnellement choisi de ne pas utiliser <tab> avec YouCompleteMe mais naviguez-le 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 le tab clé 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.

12
Thomas Fankhauser

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

EDIT: De plus, j'utilise une autre fonction pour augmenter la fonctionnalité de retour en arrière 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 ceci dans votre fichier .vimrc:

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

Aussi bien que let g:UltiSnipsJumpBackwardTrigger="<s-tab>" et votre set!

4
Michaelslec

J'utilise les deux ensemble. Par défaut, YouCompleteMe lie <Tab> Et <Down> Pour sélectionner le prochain élément d'achèvement, ainsi que <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 récemment été modifiés lorsque l'option d'une seule chaîne a été remplacée par une liste de chaînes.

3
David Brown

Juste pour rassembler les réponses de Michaelslec, Joey Liu et les solutions que j'ai trouvées dans ce fil de discussion et vimrc de ce type , j'ai maintenant ceci qui résout à 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>"
3
sudo bangbang

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

set paste

Assurez-vous de retirer cela de .vimrc si c'est présent.

2
Antoine Snyers

Sur la base de la réponse de Siegfried, j'utilise le texte suivant 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 aussi le c-hjkl liaisons ailleurs (passage d'un volet à un autre), mais cela ne serait qu'en mode normal, donc il n'y a pas de problème.

2
Nicolas Mattia

Alors que Many answer fonctionne bien dans cet article, je tiens simplement à dire que le problème est dû à une collision de clés entre YCM et UltiSnip, alors que YCM prend en charge les extraits UltiSnip par défaut, il utilise le déclencheur de développement par défaut UltiSnip <tab> comme touche de fin de sélection, les extraits de code UltiSnip ne seront donc pas développés par <tab>. Donnez-leur différentes combinaisons de touches pour résoudre le problème, j'utilise personnellement <c-n et <c-p> pour YCM et utilise la valeur par défaut <tab> pour UltiSnip. Vous pouvez obtenir plus de détails avec help youcompleteme doc dans vim.

2
Minghao Ni

J'utilise kj. C'est ce qui est dans mon .vimrc:

let g:UltisnipsExpandTrigger="kj".

Il arrive rarement que je rencontre Word qui contient kj. Si tel est le cas, j'attendrais quelques secondes après avoir tapé k et ce type j.

0
dowewas

Comme mentionné par d'autres, la cartographie de C-j en 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 le pouvoir d'utiliser simplement la touche Maj pour utlitsnips.

0
Hritik