UltiSnipsとYouCompleteMe


130

ultisnipsとyoucompletemeのバンドルを私のmacvimにインストールしました。問題は、タブがycmでバインドされているため、ultisnipsが機能しないことです。let g:UltiSnipsExpandTrigger = "<s-tab>"shift-tabでスニペットの完了をトリガーできるように配置しようとしましたが、なんらかの理由で機能しません。トリガーとしてキャップを使用することもできましたが、今のところそれを行う方法はありません。

これら2つのアドオンを一緒に使用する人はいますか?シフトタブを機能させるにはどうすればよいですか?スニペットをトリガーする別のキーを推奨できますか?


YCMもマッピングし<S-Tab>、UltiSnips、IIRCもマッピングします。YCMの作者に聞いてみるべきだと思います。
romainl 2013

ycmで以前に完了したキーを変更し、s-tabを削除しました。まだ動作していません。私はgithubで彼にメッセージを送ってみます
pvinis

1
マップがで動作しているかどうかを確認してください:verbose map <S-Tab>。ただし、コマンドラインvimでは動作しない可能性があります。かなり良い代替imoです<CR>
Daan Bakker、2013

そのおかげで私は解決策を見つけようと熱望し、YouCompleteMeにフォーラムがないという事実は迷惑です。ありがとう
atmosx 2013

2
最近これをもう一度試しましたか?UltiSnipsのドキュメントには「YouCompleteMe-UltiSnipsのボックス補完サポートが同梱されています。スニペットの本当に素晴らしい補完ダイアログを提供します。」という理由により、一方または両方のプラグインが更新されている必要があります。
カイルストランド

回答:


188

別のオプションは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は別の組み合わせCtrlnにバインドされていますが、その組み合わせはSuperTabを通じてタブにバインドされています。UltiSnipsとSuperTabは相性がいいので、UltiSnipsを直接タブにバインドすれば、すべてうまくいきます。


7
Joey Liuの提案は私にとって機能しませんでした(タブは何も展開せず、次のオートコンプリートオプションまでスクロールするだけでした)。この回答はうまくいきましたが、最初にYouCompleteMeを更新して再コンパイルする必要がありました。
BenjaminGolder 14

1
他の人が述べたように、Joey Liuのソリューションはもはや機能していません。これはします!
2014年

3
オートコンプリートリストでスニペットを強調表示する方法はありますか?
syntagma 2015年

3
くそー !おとこ !魅力的な働き!史上最高のソリューション!
Yves Lange

4
これは便利ですがtab、スニペット内を押すと、YCMの提案を完了する代わりに、次のタブストップに移動します。追加let g:UltiSnipsJumpForwardTrigger = "<Right>"let g:UltiSnipsJumpBackwardTrigger = "<Left>"て、これを機能させる必要がありました。
Gabriel Florit

48

YouCompleteMe課題トラッカーのページでこの提案を試してください。あなたの.vimrcで:

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

この設定により、スニペットを展開すると、スニペット内で前方にジャンプするためのデフォルトのマッピングが共有されますが、UltiSnipsヘルプタグで説明されているように、TextMatesの動作がシミュレートされます。

CapsLockキーをCtrlにマッピングしたので、このマッピングはかなりスムーズに機能します。


1
これは最良の答えです。シンプルでストレートですが、macOS 10.12上のmacvimでは<cj>が機能しないので、<ck>に変更すると、すべてが正常に機能します。<tab>前方、<s-tab>後方、<ck>スニペットを展開します。ありがとう
gpanda

40

以下のコードをvimrcにコピーしてお楽しみください。この関数は、YCMと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
それが原因であると私は思ういくつかの信用:github.com/Valloric/YouCompleteMe/issues/… そして、BufEnter autocmdにいくつかのコメントがあります。
2013年

3
Mac OS Xの場合、これは私にはうまくいきませんでした。しかし、ジークフリートの答えはうまくいきました。
miguel.martin 2014

今のところ素晴らしいようです!しかし、スニペットのブレークポイントを「タブスルー」するにはどうすればよいですか?
chmanie 14

1
g:UltiSnipsJumpForwardTrigger="<cr>"可能なすべての補完/スニペットをタブで移動できるようにバインドするのが便利だと感じました
alaroldai

1
これにより、リストされたYCM完了(Ultisnipsの提案を含む)をタブで移動できますが、最後のinoremap <expr>行が実際にEnterキーを押すことに影響を与えていないようです。<Cy>を使用して手動で完了をトリガーできますが、Enterは何もしません。助言がありますか?
HaaR 2014年

18

これは私のvimrcにあります

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

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

それは私が最初の試みでやったことですが、UltisnipsでUltiSnipsのスペルを間違えました。まあ、結局うまくいきました!


17

私は個人的には<tab>YouCompleteMe では使用せず、手動でナビゲートすることにしました。

だから私はこれを私のに追加しました.vimrc

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

tabYCM のキーを無効にするだけです。代わりに、移動キー(矢印またはCTRL-N/ CTRL-P)を使用して、でエントリを選択しますCR。UltiSnipsはでデフォルトで機能しますtab


5

Michaelslec、Joey Liuによる回答と、この問題のスレッドこの人のvimrcで見つけた解決策をまとめるだけで、ほぼすべての問題が解決されました。

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

これは、基本的にCOCとUltisnipsで同じ問題を修正しようとするときに非常に役立ちました。<TAB>および<S-TAB>を使用してPUMを上下に移動したり、Ultisnipsプレースホルダー内を前後に移動したい。ありがとう。
110100100

4

私はこの投稿が少し古いことを知っていますが、私は上記のものより少し最適化された独自の関数を持っています:

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

もちろん、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>"、あなたのセット!


3

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


3

YouCompleteMeプラグインの後にUltiSnipsプラグインをインストールしたので、それらは競合していると思ったのですが、実際にはさらに何かが干渉していました。

set paste

.vimrc存在する場合は、必ず削除してください。


2

この投稿では多くの回答がうまく機能していますが、問題はYCMとUltiSnipの間のキーバインディングの衝突が原因であると言いたいだけですが、YCMはデフォルトでUltiSnipスニペットをサポートしていますが、<tab>完了選択キーとしてデフォルトのUltiSnip拡張トリガーを使用するため、 UltiSnipスニペットはによって拡張されません<tab>。彼らに、問題を解決するため、私は個人的に使用するバインディング異なるキー与える<c-n<c-p>YCMのために、デフォルトを使用<tab>UltiSnipために。help youcompletemevimのdocで詳細を取得できます。


2

ジークフリートの答えに基づいて、私はより自然に見える以下を使用しています:

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

また、c-hjklバインディングを別の場所で使用します(ペインから別のペインに切り替えます)が、それは通常モードの場合のみなので、問題はありません。


1

;UltiSnipsを拡張するために使用する、それは私にとってとても気の利いた

let g:UltiSnipsExpandTrigger = ";"

編集:Vimの挿入モードで\入力できないことがわかったので使用し;ます
Ruto Collins

0

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

let g:UltisnipsExpandTrigger="kj"

kjはそれにある言葉に出くわすことはめったにありません。この場合は、タイプkしてから数秒待ってからタイプしますj


0

他の人が述べたように、Cjをultisnipsにマッピングするとうまくいきます。
let g:UltiSnipsExpandTrigger="<c-j>"

さて、もう少し進んでxcapeをインストールし、
xcape -e "Shift_L=Control_R|J"

あなたは、utlitsnipsのためにシフトキーだけを使う力を解き放ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.