[vim] UltiSnips와 YouCompleteMe

Macvim에 번들 ultisnips 및 youcompleteme가 설치되어 있습니다. 문제는 탭이 ycm에 의해 묶여 있기 때문에 ultisnips가 작동하지 않는다는 것입니다. let g:UltiSnipsExpandTrigger = "<s-tab>"shift-tab으로 스 니펫 완료를 트리거 할 수 있도록 넣어 보았지만 알 수없는 이유로 작동하지 않습니다. 나는 모자를 방아쇠로 사용할 수는 있지만 지금까지는 그렇게 할 수있는 방법을 찾지 못했습니다.

이 두 애드온을 함께 사용하는 사람이 있습니까? Shift-Tab을 작동 시키려면 어떻게해야합니까? 스 니펫을 트리거하기 위해 다른 키를 추천 할 수 있습니까?



답변

또 다른 옵션은 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를 탭에 직접 바인딩하면 모든 것이 잘됩니다.


답변

YouCompleteMe 이슈 트래커 의 페이지 에서이 제안을 시도하십시오 . .vimrc에서 :

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

이 설정은 스 니펫 공유를 스 니펫 내에서 앞으로 건너 뛰기 위한 기본 매핑으로 확장하지만 UltiSnips 도움말 태그에 언급 된대로 TextMates의 동작을 시뮬레이션합니다.

Caps Lock 키를 Ctrl에 매핑 했으므로이 매핑은 매우 매끄럽게 작동합니다.


답변

다음 코드를 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>"


답변

나는 내 vimrc 에이

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

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

그게 내가 첫 번째 시도에서 한 일이지만 Ultisnips로 UltiSnips의 철자를 잘못 입력했습니다.


답변

개인적 <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.


답변

그냥 내가 발견 솔루션 Michaelslec, 조이 리우와 함께 서로의 답변을 넣어 이 문제를 스레드이 사람의 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>"


답변

이 게시물이 약간 오래되었다는 것을 알고 있지만 위의 기능보다 조금 더 최적화 된 내 기능이 있습니다.

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>"당신의 세트!