web-dev-qa-db-ja.com

UltiSnipsとYouCompleteMe

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

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

124
pvinis

私はこれを私のvimに持っています

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

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

それが最初の試みでしたことですが、UltisnipsでUltiSnipsのスペルを間違えました。

18
pvinis

別のオプションは、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は一緒にNiceを再生するため、UltiSnipsを直接Tabにバインドするだけですべてが機能します。

177

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

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

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

Caps LockキーをCtrlにマッピングしたため、このマッピングは非常にスムーズに機能します。

46
unblevable

次のコードを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>"
37
Joey Liu

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

それで、これを.vimrcに追加しました:

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

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

12

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

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>"とあなたのセットだけでなく!

4
Michaelslec

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

3
David Brown

Michaelslec、Joey Liu、および this issue thread および this guy's 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>"
3
sudo bangbang

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

set paste

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

2
Antoine Snyers

Siegfriedの答えに基づいて、私は以下を使用しています。

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バインディングも別の場所で使用します(ペインから別のペインに切り替えます)が、それは通常モードのみであるため、問題はありません。

2
Nicolas Mattia

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

2
Minghao Ni

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

let g:UltisnipsExpandTrigger="kj"

kjを含むWordに遭遇することはめったにありません。この場合、kと入力してからjと入力した後、数秒待つだけです。

0
dowewas

他の人が述べたように、C-jを究極のニップにマッピングすることは非常に効果的です。
let g:UltiSnipsExpandTrigger="<c-j>"

さて、さらに進んでxcapeをインストールして使用する場合
xcape -e "Shift_L=Control_R|J"

Utlitsnipsのシフトキーだけを使用する力を解き放ちます。

0
Hritik