2013-02-15 5 views
102

私はMacvimにultisnipsとyoucompletemeがインストールされています。 タブがycmによって束縛されているため、ultisnipsが機能しないという問題があります。 let g:UltiSnipsExpandTrigger = "<s-tab>"を入れて、シフト - タブでスニペットの補完をトリガーできるようにしましたが、何らかの不明な理由で機能しません。トリガーとしてキャップを使用することはできましたが、これまではキャップを使用する方法がありませんでした。UltiSnipsとYouCompleteMe

これらの2つのアドオンを一緒に使用していますか? シフトタブを作るにはどうしたらいいですか? スニペットをトリガーする別のキーをお勧めしますか?

+0

また、YCMは「」と、UltiSnips、IIRCもマップします。あなたはYCMの著者に尋ねるべきです。 – romainl

+0

ycmで以前の完了のためのキーを変更し、s-tabを削除しました。まだ動かない。 – pvinis

+1

マップが ':verbose map 'で動作しているかどうかを確認するには、コマンドラインのvimでうまく動作しないかもしれません。かなり良い置換イメージは ''です。 –

答えて

17

私は私の最初の試みに何をしたか

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

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

はthatsの私のvimrcでこれを持っているが、私はUltisnipsでUltiSnipsをスペルミス...まあ、最終的に働きました!

2

私はそれらを一緒に使用します。デフォルトでYouCompleteMeは<Tab><Down>をバインドして次の完了項目を選択し、<S-Tab><Up>を選択して前の完了項目を選択します。 YouCompleteMeバインディングは、g:ycm_key_list_select_completiong:ycm_key_list_previous_completionオプションで変更できます。これらのオプションの名前は、オプションが単一の文字列から文字列のリストに変更されたときに最近変更されたことに注意してください。

37

YouCompleteMe号トラッカーのpageでこの提案をお試しください。あなたの.vimrcで:

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

この設定はスニペット内前方にジャンプするデフォルトのマッピングを共有するスニペットを拡大行いますがUltiSnipsヘルプタグに述べたように、それはTextMatesの行動をシミュレートします。

私はCaps LockキーをCtrlにマップしているので、このマッピングはかなり円滑に機能します。

+0

MacOS 10.12のmacvimではが動作しませんが、私はに変更していますが、これはすべてうまくいきますが、これは最高の答えです。 forward、 backward、スニペットを展開します。お返事ありがとうございます – gpanda

36

次のコードをあなたのvimrcにコピーしてお楽しみください。この機能は、YCMとUltiSnips間のすべての問題を処理します。あなただけの設定を続ければ、当然のことながら

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 

:私はこの記事が少し古いです知っているが、

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

私は考えているいくつかのクレジット:https://github.com/Valloric/YouCompleteMe/issues/36#issuecomment-15451411そしてBufEnterはいくつかのコメントをautocmd。 – ches

+2

これは私のMac OS Xではうまくいきませんでした。しかし2014年7月10日現在、ジークフリートの答えはうまくいった。 –

+0

これまでのところ素晴らしいですね!しかし、どうすればスニペットブレークポイントを "タブスルー"できますか? – chmanie

4

は、私はもう少し上に与えられたものよりも最適化されている私自身の機能を持っていますJoey Liuが提供して、この機能を使用するだけで、すべてが完全に機能します!

編集:また、YouCompleteMeとUltiSnipsの間のバックステッピング機能を高めるために別の機能を使用します。私は私が何を意味するかを紹介します:

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

    return ""                             
endfunction 

それからちょうどあなたの.vimrcでこれを置く:

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

だけでなくlet g:UltiSnipsJumpBackwardTrigger="<s-tab>"とあなたのセット!

146

別のオプションは、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>" 

ここYouCompleteMeを異なる組み合わせCtrlキーNにバインドされていますが、その組み合わせはSuperTabをタブにバインドされています。 UltiSnipsとSuperTabは一緒に使えるので、UltiSnipsをタブに直接バインドすれば、すべてがうまくいくはずです。

+7

Joey Liuの提案は私のためには機能しませんでした(タブは何も展開しませんでした。次の自動補完オプションにスクロールするだけです)。この回答は素晴らしいものでしたが、YouCompleteMeをまず更新して再コンパイルする必要がありました。 – BenjaminGolder

+0

Siegfried、あなたは2つの答えを統合しますか? – BenjaminGolder

+0

@BenjaminGolderああ、どうして私はそれを2回投稿したのか分かりません。ありがとう、ありがとう。 –

7

私は個人的にYouCompleteMeで<tab>を使用しないように選択しましたが、手動でナビゲートしました。

だから、私は.vimrcにこれを追加しました:単にYCM用タブキーを無効にし

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

。代わりに、移動キーを使用してCRでエントリを選択します。 UltiSnipsはデフォルトでタブで動作します。

1

多くの答えは、この記事では正常に動作している間、私はただ問題はYCMとUltiSnip間のキーバインディングの衝突によって引き起こされていることを言いたい、デフォルトでYCMサポートUltiSnipスニペットながら、それはUltiSnipはそのようトリガー<tab>を展開する既定値をとります完了の選択キーなので、UltiSnipスニペットは<tab>で拡張されません。私は個人的にYCMのために<c-n<c-p>を使用し、UltiSnipにはデフォルトの<tab>を使用します。あなたはvimのhelp youcompletemeのドキュメントで詳細を得ることができます。

1

ジークフリートの回答に基づいて、私はより自然に感じ、次の使用しています:私もどこか別の場所(別のウィンドウからの切り替え)c-hjklバインディングを使用

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

を、それが唯一の通常になりますモードなので、問題ありません。

3

私はthis issue threadthis guy's vimrcで見つけた解決策とともに、Michaelslec、Joey Liuの回答をまとめるだけで、すべての問題をほぼ解決しました。

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

私はので、私は彼らが矛盾すると思っていたが、実際に、私は干渉もっと何か持っていたYouCompleteMeプラグインの後UltiSnipsプラグインをインストール:

set paste 

も、それが本だ場合.vimrcからそれを削除することを確認します。

0

私はkjを使用します。これは私の中にあるものです。.vimrc

です。

kjという言葉に遭遇することはめったにありません。この場合、kとタイプjと入力してから数秒待つだけです。

関連する問題