138

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

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

4

14 に答える 14

203

もう 1 つのオプションは、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 をタブに直接バインドするだけですべてがうまくいきます。

于 2014-03-07T15:01:04.343 に答える
52

YouCompleteMe イシュー トラッカーのページでこの提案を試してください。.vimrc で:

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

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

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

于 2013-06-30T09:26:15.370 に答える
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のスペルを間違えました..まあ、最終的にはうまくいきました!

于 2013-02-16T09:53:35.707 に答える
18

個人的には<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

于 2014-08-27T17:25:53.367 に答える
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>"
于 2015-12-04T11:45:46.470 に答える
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>"、あなたのセット!

于 2014-02-24T05:54:13.980 に答える
4

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

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

于 2015-09-03T21:02:07.890 に答える
3

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

于 2013-02-15T20:52:39.223 に答える
3

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

于 2015-01-11T02:39:44.653 に答える
2

私は;UltiSnips を拡張するのに使っていました。

let g:UltiSnipsExpandTrigger = ";"
于 2020-01-14T06:47:48.333 に答える