UltiSnips ve YouCompleteMe


130

Macvim'imde paket ultisnips ve youcompleteme yüklü. Sorun, sekme ycm'ye bağlı olduğu için ultisnips'in çalışmamasıdır. let g:UltiSnipsExpandTrigger = "<s-tab>"Snippet tamamlamasını shift-tab ile tetikleyebilmek için koymayı denedim , ancak bilinmeyen bir nedenden dolayı çalışmıyor. Tetik olarak büyük harf kullanabilirdim, ancak şimdiye kadar bunu yapmanın bir yolunu bulamadım.

Bu iki eklentiyi birlikte kullanan var mı? Vardiya sekmesinin çalışmasını sağlamak için ne yapabilirim? Parçacıkları tetiklemek için başka bir anahtar önerebilir misiniz?


YCM <S-Tab>ve UltiSnips, IIRC de eşler . Sanırım YCM'nin yazarına sormalısınız.
romainl

ycm'de önceki tamamlamanın anahtarlarını değiştirdim ve s-tab'ı kaldırdım. hala çalışmıyor. ona
github'da

1
Haritanızın çalışıp çalışmadığını görün :verbose map <S-Tab>, muhtemelen komut satırı vim'de çalışmayacaktır. Oldukça iyi bir yedek imo <CR>.
Daan Bakker

Bunun için teşekkürler, bir çözüm bulmaya istekliydim ve YouCompleteMe'nin bir forumu olmaması can sıkıcı. Teşekkürler
atmosx

2
Bunu yakın zamanda tekrar denedin mi? Eklentilerden biri veya her ikisi de güncellenmiş olmalı, çünkü UltiSnips belgeleri şunları söylüyor: "YouCompleteMe - UltiSnips için kutudan çıkar çıkmaz tamamlama desteği ile birlikte geliyor. Parçacıklar için gerçekten güzel bir tamamlama diyalogu sunuyor."
Kyle Strand

Yanıtlar:


188

Diğer bir seçenek ise SuperTab eklentisini kullanmaktır:

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

Burada YouCompleteMe farklı bir kombinasyona bağlıdır Ctrln, ancak daha sonra bu kombinasyon SuperTab aracılığıyla sekmeye bağlanır. UltiSnips ve SuperTab birlikte güzel çalışır, böylece UltiSnips'i doğrudan sekmeye bağlayabilirsiniz ve her şey yoluna girecektir.


7
Joey Liu'nun önerisi benim için işe yaramadı (sekme hiçbir şeyi genişletmez, yalnızca bir sonraki otomatik tamamlama seçeneğine kaydırır). Bu cevap harika çalıştı, ancak önce YouCompleteMe'yi güncellemem ve yeniden derlemem gerekiyordu.
BenjaminGolder

1
Diğerlerinin de belirttiği gibi, Joey Liu'nun çözümü artık işe yaramıyor. Bu var!
Çapa

3
Otomatik tamamlama listesinde parçacıkları vurgulamanın bir yolu var mı?
syntagma

3
LANET OLSUN ! Adam ! Bir cazibe gibi çalışıyor! Şimdiye kadarki en iyi çözüm!
Yves Lange

4
Bu güzel, ancak tabbir parçacığın içine tıklamak YCM önerisini tamamlamak yerine bir sonraki sekme durağına gidecektir. Eklemek let g:UltiSnipsJumpForwardTrigger = "<Right>"ve let g:UltiSnipsJumpBackwardTrigger = "<Left>"bunu yapmak zorunda kaldım .
Gabriel Florit

48

YouCompleteMe sorun izleyicisinden bir sayfada bu öneriyi deneyin . .Vimrc dosyanızda:

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

Bu ayar, bir parçacığı genişletmenin bir parçacık içinde ileri atlamak için varsayılan eşlemeyi paylaşmasını sağlarken, UltiSnips yardım etiketlerinde belirtildiği gibi TextMates'in davranışını simüle eder.

Caps Lock tuşumu Ctrl ile eşlediğim için bu eşleme oldukça sorunsuz çalışıyor.


1
Bu en iyi cevap, basit ve açık olmalı, ancak macOS 10.12'deki macvim'imde <cj> çalışmıyor, <ck> olarak değiştiriyorum, sonra her şey yolunda gidiyor. <tab> ileri, <s-tab> geri, <ck> parçacığı genişletin. Teşekkürler
gpanda

40

Aşağıdaki kodu vimrc'nize kopyalayın ve keyfini çıkarın. Bu işlev, YCM ve UltiSnips arasındaki tüm sorunları çözecektir.

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
Bence gerekli olduğu yerde biraz kredi: github.com/Valloric/YouCompleteMe/issues/… Ve BufEnter autocmd birkaç yorum aşağı.
ches

3
Bu benim için işe yaramadı, Mac OS X için; 10 Temmuz 2014 itibariyle. Ancak Siegfried'in cevabı işe yaradı.
miguel.martin

Şimdiye kadar harika görünüyor! Ancak, pasaj kesme noktalarında nasıl "sekme" geçiş yapabilirim?
chmanie

1
g:UltiSnipsJumpForwardTrigger="<cr>"
Bağlamayı

1
Bu, listelenen YCM'yi tamamlamamı sağlıyor (Ultisnips önerileri dahil), ancak son inoremap <expr> satırı aslında enter tuşuna basmamı etkiliyor gibi görünmüyor. Tamamlamayı <Cy> ile manuel olarak tetikleyebilirim, ancak enter hiçbir şey yapmaz. Baska öneri?
HaaR

18

bu benim vimrc'imde var

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

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

Bu ilk denememde yaptığım şeydi, ancak UltiSnips'i Ultisnips ile yanlış yazdım .. oh iyi, sonunda işe yaradı!


17

Kişisel <tab>olarak YouCompleteMe ile kullanmayı değil, manuel olarak gezinmeyi seçtim .

Ben de şunu ekledim .vimrc:

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

bu da tabYCM anahtarını devre dışı bırakır . Bunun yerine hareket tuşlarını (oklar veya CTRL-N/ CTRL-P) kullanın ve girişi ile seçin CR. UltiSnips varsayılan olarak tab.


5

Michaelslec, Joey Liu'nun cevaplarını bir araya getirerek ve bu konu başlığında bulduğum çözümlerle ve bu adamın vimrc'iyle birlikte , şimdi hemen hemen tüm sorunları çözen buna sahibim.

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

Bu, esasen aynı sorunu COC ve Ultisnips ile çözmeye çalışırken çok yardımcı oldu. <TAB> ve <S-TAB> 'i PUM'da yukarı ve aşağı hareket ettirmenin yanı sıra Ultisnips yer tutucuları içinde ileri geri hareket etmek için kullanmak isteyen Teşekkürler.
110100100

4

Bu yazının biraz eski olduğunu bilmeme rağmen, yukarıda verilenden biraz daha optimize edilmiş kendi işlevim var:

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

Tabii ki, Joey Liu'nun sağladığı ayarları koruduğunuzda ve sonra sadece bu işlevi kullanırsanız, her şey mükemmel şekilde çalışacaktır!

DÜZENLEME: Ayrıca, YouCompleteMe ve UltiSnips arasında geri adım atma işlevini artırmak için başka bir işlev kullanıyorum. Ne demek istediğimi sana göstereceğim:

function! g:UltiSnips_Reverse()                                                                                               
  call UltiSnips#JumpBackwards()                                                                                              
  if g:ulti_jump_backwards_res == 0        
    return "\<C-P>"                                                                                                           
  endif                                                                                                                       

  return ""                                                                                                                   
endfunction

Sonra bunu .vimrc dosyanıza koyun:

au BufEnter * exec "inoremap <silent> " . g:UltiSnipsJumpBackwardTrigger . " <C-R>=g:UltiSnips_Reverse()<cr>"

Yanı sıra let g:UltiSnipsJumpBackwardTrigger="<s-tab>"ve setiniz!


3

İkisini birlikte kullanıyorum. Varsayılan YouCompleteMe bağlamalar ile <Tab>ve <Down>ayrıca bir sonraki tamamlama öğeyi ve seçmek için <S-Tab>ve <Up>önceki tamamlama öğeyi seçin. YouCompleteMe bağlamalarını g: ycm_key_list_select_completion ve g: ycm_key_list_previous_completion seçenekleriyle değiştirebilirsiniz. Bu seçeneklerin adlarının, seçenek tek bir dizeden dizeler listesine dönüştürüldüğünde yakın zamanda değiştirildiğine dikkat edin.


3

UltiSnips eklentisini YouCompleteMe eklentisinden sonra kurdum, bu yüzden çelişkili olduklarını düşündüm, ancak gerçekte daha müdahaleci bir şeyim vardı:

set paste

.vimrcVarsa onu çıkardığınızdan emin olun .


2

Pek çok cevap bu yazıda iyi çalışsa da, sorunun YCM ve UltiSnip arasındaki anahtar bağlanma çarpışmasından kaynaklandığını söylemek istiyorum, YCM varsayılan olarak UltiSnip parçacıkları desteklerken <tab>, tamamlama seçme anahtarı olarak varsayılan UltiSnip genişletme tetikleyicisini alır , bu nedenle UltiSnip parçacıkları, tarafından genişletilmeyecektir <tab>. Onlara farklı anahtar bağlama vermek sorunu çözecek, kişisel olarak <c-nve <c-p>YCM için kullanıyorum ve UltiSnip için varsayılanı <tab>kullanıyorum. help youcompletemeVim'deki doc ile daha fazla ayrıntı alabilirsiniz .


2

Siegfried'in cevabına göre, daha doğal görünen aşağıdakileri kullanıyorum:

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-hjklBağlamaları başka bir yerde de kullanıyorum (bir bölmeden diğerine geçiyorum), ancak bu yalnızca normal modda olacak, bu yüzden sorun yok.


1

Kullandığım ;UltiSnips genişletmek için, bu benim için çok şık var

let g:UltiSnipsExpandTrigger = ";"

Düzenleme: Şimdi kullanıyorum \çünkü ;Vim'in ekleme modunda yazamadığımı fark ettim
Ruto Collins

0

Ben kullanıyorum kj. Bu benim .vimrc:

let g:UltisnipsExpandTrigger="kj".

İçinde olan kelimeyle karşılaşmam nadiren oluyor kj. Bu durumda, yazdıktan sonra birkaç saniye beklerim kve bu tür j.


0

Başkalarının da bahsettiği gibi, Cj'yi ultisnips ile eşleştirmek harika çalışıyor.
let g:UltiSnipsExpandTrigger="<c-j>"

Şimdi, biraz daha ileri gidip xcape'i kurup kullanırsanız
xcape -e "Shift_L=Control_R|J"

Uçtan uca ipuçları için sadece shift tuşunu kullanmanın gücünü açığa çıkarırsınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.