UltiSnips와 YouCompleteMe


130

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

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


YCM <S-Tab>은 UltiSnips, IIRC 도 매핑 합니다. 당신은 YCM의 저자에게 물어봐야 할 것 같습니다.
romainl

ycm에서 이전 완료 키를 변경하고 s-tab을 제거했습니다. 그래도 작동이 안되는. 나는 github에 그에게 메시지를
보내

1
맵이에서 작동하는지 확인하면 :verbose map <S-Tab>명령 줄 vim에서는 작동하지 않을 수 있습니다. 꽤 좋은 대체 imo입니다 <CR>.
Daan Bakker

해결책을 찾기를 간절히 바랐으며 YouCompleteMe에 포럼이 없다는 사실은 성가신 일입니다. 감사합니다
atmosx

2
최근에 다시 시도 했습니까? UltiSnips 설명서에 "YouCompleteMe-UltiSnips에 대한 기본 완성 지원이 제공됩니다. 스 니펫에 대한 훌륭한 완성 대화를 제공합니다."
Kyle Strand

답변:


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

1
다른 사람들이 언급했듯이 Joey Liu의 솔루션은 더 이상 작동하지 않습니다. 이거에요!
앵커

3
자동 완성 목록에서 스 니펫을 강조 표시 할 수있는 방법이 있습니까?
syntagma

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의 동작을 시뮬레이션합니다.

Caps Lock 키를 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에 대한 몇 가지 코멘트가 있습니다.
ches

3
Mac OS X에서는이 기능이 작동하지 않는 것 같습니다. 그러나 Siegfried의 답변은 효과가있었습니다.
miguel.martin

지금까지 큰 것 같습니다! 그러나 스 니펫 중단 점을 어떻게 '탭 스루'할 수 있습니까?
chmanie

1
나는 그것이 편리 바인딩 발견 g:UltiSnipsJumpForwardTrigger="<cr>"그래서 내가 할 수 여전히 가능한 모든 완료 / 조각을 통해 탭
alaroldai

1
이렇게하면 YCM에 나열된 완료 항목 (Ultisnips 제안 포함)을 탭 할 수 있지만 마지막 inoremap <expr> 줄은 실제로 enter 키를 누르는 데 영향을 미치지 않는 것 같습니다. <Cy>로 수동으로 완료를 트리거 할 수 있지만 enter는 아무 작업도 수행하지 않습니다. 어떤 제안?
HaaR

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, 조이 리우와 함께 서로의 답변을 넣어 이 문제를 스레드이 사람의 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>이전 완료 항목을 선택합니다. g : ycm_key_list_select_completiong : ycm_key_list_previous_completion 옵션을 사용하여 YouCompleteMe 바인딩을 변경할 수 있습니다 . 옵션이 단일 문자열에서 문자열 목록으로 변경 될 때 이러한 옵션의 이름이 최근에 변경되었습니다.


3

YouCompleteMe 플러그인 다음에 UltiSnips 플러그인을 설치하여 충돌한다고 생각했지만 실제로는 더 방해하는 것이 있습니다.

set paste

.vimrc존재하는 경우 제거하십시오 .


2

이 게시물에서 많은 답변이 제대로 작동하지만 YCM과 UltiSnip 간의 키 바인딩 충돌로 인해 문제가 발생한다고 말하고 싶습니다 .YCM은 기본적으로 UltiSnip 스 니펫을 지원하지만 기본 UltiSnip 확장 트리거 <tab>를 완료 선택 키로 사용합니다. UltiSnip 스 니펫은에 의해 확장되지 않습니다 <tab>. 그들에게 다른 키 바인딩을 제공하여 문제를 해결할 수 있습니다. 개인적으로 <c-n그리고 <c-p>YCM에 사용하고 <tab>UltiSnip에 기본값 을 사용하십시오 . help youcompletemedoc in vim에서 자세한 내용을 확인할 수 있습니다 .


2

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다른 곳 에서 바인딩 을 사용 하지만 (창에서 다른 창으로 전환) 정상 모드에서만 가능하므로 아무런 문제가 없습니다.


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에 Shift 키만 사용하면됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.