UltiSnips dan YouCompleteMe

130

Saya memiliki bundel ultisnips dan youcompleteme diinstal pada macvim saya. Masalahnya adalah bahwa ultisnips tidak berfungsi karena tab diikat oleh ycm. Saya mencoba meletakkanlet g:UltiSnipsExpandTrigger = "<s-tab>" sehingga saya dapat memicu penyelesaian cuplikan dengan tab-geser, tetapi tidak berhasil karena alasan yang tidak diketahui. Saya bisa menggunakan topi sebagai pemicunya, tetapi sejauh ini saya tidak menemukan cara untuk melakukannya.

Apakah ada di antara Anda yang menggunakan kedua add-ons itu bersama-sama? Apa yang bisa saya lakukan untuk membuat shift-tab bekerja? Bisakah Anda merekomendasikan kunci lain untuk memicu cuplikan?

pvinis
sumber
YCM juga memetakan <S-Tab>dan begitu juga UltiSnips, IIRC. Anda harus bertanya kepada penulis YCM, saya kira.
romainl
saya mengubah kunci untuk penyelesaian sebelumnya pada ycm, dan menghapus s-tab. masih tidak bekerja. Saya akan mencoba mengirim pesan kepadanya di github, kurasa
pvinis
1
Lihat apakah peta Anda berfungsi :verbose map <S-Tab>, mungkin tidak akan bekerja pada vim baris perintah. Imo pengganti yang cukup bagus adalah <CR>.
Daan Bakker
Terima kasih untuk itu saya sangat ingin menemukan solusi dan fakta bahwa YouCompleteMe tidak memiliki forum itu menjengkelkan. Terima kasih
atmosx
2
Sudahkah Anda mencoba ini lagi baru-baru ini? Satu atau kedua plugin harus telah diperbarui, karena dokumentasi UltiSnips mengatakan: "YouCompleteMe - dilengkapi dengan dukungan penyelesaian UltiSnips di luar kotak. Ini menawarkan dialog penyelesaian yang sangat bagus untuk cuplikan."
Kyle Strand

Jawaban:

188

Opsi lain menggunakan plugin 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>"

Di sini YouCompleteMe terikat ke kombinasi yang berbeda Ctrln, tetapi kemudian kombinasi tersebut terikat ke tab melalui SuperTab. UltiSnips dan SuperTab bermain bagus bersama, jadi Anda bisa mengikat UltiSnips langsung ke tab dan semuanya akan berhasil.

Siegfried Gevatter
sumber
7
Saran Joey Liu tidak berfungsi untuk saya (tab tidak akan memperluas apa pun, itu hanya akan bergulir ke opsi pelengkapan otomatis berikutnya). Jawaban ini berhasil, tetapi saya harus memperbarui dan mengkompilasi ulang YouCompleteMe terlebih dahulu.
BenjaminGolder
1
Seperti yang disebutkan orang lain, solusi Joey Liu tidak lagi berfungsi. Yang ini!
Jangkar
3
Apakah ada cara untuk menyorot cuplikan pada daftar pelengkapan otomatis?
syntagma
3
SIAL ! Pria ! Bekerja seperti pesona! Solusi terbaik yang pernah ada!
Yves Lange
4
Ini bagus, tetapi memukul tabdi dalam cuplikan akan masuk ke tabstop berikutnya, alih-alih menyelesaikan saran YCM. Saya harus menambahkan let g:UltiSnipsJumpForwardTrigger = "<Right>"dan let g:UltiSnipsJumpBackwardTrigger = "<Left>"membuat ini berfungsi.
Gabriel Florit
48

Coba saran ini pada halaman dari pelacak masalah YouCompleteMe. Di .vimrc Anda:

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

Meskipun pengaturan ini akan membuat perluasan potongan cuplikan pemetaan default untuk melompat maju dalam potongan , itu mensimulasikan perilaku TextMates 'seperti yang disebutkan dalam tag bantuan UltiSnips.

Karena saya telah memetakan tombol Caps Lock ke Ctrl, pemetaan ini berfungsi dengan sangat lancar.

tidak bisa diperbaiki
sumber
1
Ini harus menjadi jawaban terbaik, sederhana dan lurus, meskipun di macvim saya di macOS 10.12, <cj> tidak berfungsi, saya ubah ke <ck>, lalu semuanya bekerja dengan baik. <tab> maju, <s-tab> mundur, <ck> perluas cuplikan. Terima kasih
gpanda
40

salin kode berikut ke vimrc Anda, dan selamat menikmati. Fungsi ini akan menangani semua masalah antara YCM dan 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>"
Joey Liu
sumber
27
Beberapa kredit di mana itu karena saya pikir: github.com/Valloric/YouCompleteMe/issues/… Dan BufEnter autocmd beberapa komentar turun.
ches
3
Ini sepertinya tidak berhasil untuk saya, untuk Mac OS X; pada 10 Juli 2014. Namun, jawaban Siegfried berhasil.
miguel.martin
Tampak hebat sejauh ini! Tetapi bagaimana saya bisa "menerobos" breakpoint snippet?
chmanie
1
Saya merasa mudah untuk mengikat g:UltiSnipsJumpForwardTrigger="<cr>"sehingga saya masih bisa
memeriksa
1
Ini memungkinkan saya masuk ke daftar lengkap YCM yang terdaftar (termasuk saran Ultisnips), tetapi baris inoremap <expr> terakhir sepertinya tidak memengaruhi penekanan tombol enter saya. Saya bisa memicu penyelesaian secara manual dengan <Cy>, tetapi masuk tidak melakukan apa-apa. Ada saran?
HaaR
18

saya punya ini di vimrc saya

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

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

Itulah yang saya lakukan pada percobaan pertama saya, tetapi saya salah mengeja UltiSnips dengan Ultisnips .. oh well, akhirnya berhasil!

pvinis
sumber
17

Saya pribadi memilih untuk tidak menggunakan <tab> dengan YouCompleteMe tetapi menavigasi secara manual.

Jadi saya menambahkan ini ke .vimrc:

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

yang hanya menonaktifkan tabkunci untuk YCM. Sebagai gantinya Anda menggunakan tombol gerakan (panah atau CTRL-N/ CTRL-P) dan memilih entri dengan CR. UltiSnips berfungsi dengan default tab.

Thomas Fankhauser
sumber
5

Hanya dengan mengumpulkan jawaban oleh Michaelslec, Joey Liu dan bersama dengan solusi yang saya temukan di utas masalah ini dan vimrc orang ini , saya sekarang memiliki ini yang memecahkan hampir semua masalah.

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>"
sudo bangbang
sumber
Ini sangat membantu ketika pada dasarnya mencoba untuk memperbaiki masalah yang sama dengan COC dan Ultisnips. Ingin menggunakan <TAB> dan <S-TAB> untuk bergerak naik dan turun PUM serta bergerak bolak-balik dalam placeholder Ultisnips. Terima kasih.
110100100
4

Meskipun saya tahu posting ini agak lama, saya memiliki fungsi saya sendiri yang sedikit lebih dioptimalkan daripada yang diberikan di atas:

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

Tentu saja, jika Anda hanya menyimpan pengaturan yang disediakan Joey Liu dan kemudian hanya menggunakan fungsi ini semuanya akan bekerja dengan sempurna!

EDIT: Juga, saya menggunakan fungsi lain untuk meningkatkan fungsionalitas back-stepping antara YouCompleteMe dan UltiSnips. Saya akan menunjukkan kepada Anda apa yang saya maksud:

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

  return ""                                                                                                                   
endfunction

Kemudian cukup letakkan ini di .vimrc Anda:

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

Serta let g:UltiSnipsJumpBackwardTrigger="<s-tab>"dan set Anda!

Michaelslec
sumber
3

Saya menggunakan keduanya bersama-sama. Secara default YouCompleteMe mengikat <Tab>dan <Down>memilih item penyelesaian selanjutnya dan juga <S-Tab>dan <Up>untuk memilih item penyelesaian sebelumnya. Anda dapat mengubah binding YouCompleteMe dengan opsi g: ycm_key_list_select_completion dan g: ycm_key_list_previous_completion . Perhatikan bahwa nama-nama opsi ini baru-baru ini berubah ketika opsi diubah dari string tunggal ke daftar string.

David Brown
sumber
3

Saya menginstal plugin UltiSnips setelah plugin YouCompleteMe jadi saya pikir mereka saling bertentangan, tetapi pada kenyataannya saya memiliki sesuatu yang lebih mengganggu:

set paste

Pastikan untuk menghapusnya .vimrcjika ada.

Antoine Snyers
sumber
2

Sementara Banyak jawaban berfungsi dengan baik di pos ini, saya hanya ingin mengatakan bahwa masalahnya disebabkan oleh tabrakan pengikatan kunci antara YCM dan UltiSnip, sementara YCM mendukung cuplikan UltiSnip secara default, dibutuhkan pemicu ultiSnip memperluas standar <tab>sebagai kunci pilih penyelesaiannya, jadi Cuplikan UltiSnip tidak akan diperluas oleh <tab>. Memberi mereka pengikatan kunci yang berbeda akan menyelesaikan masalah, saya pribadi menggunakan <c-ndan <c-p>untuk YCM dan menggunakan default <tab>untuk UltiSnip. Anda bisa mendapatkan detail lebih lanjut dengan help youcompletemedoc in vim.

Minghao Ni
sumber
2

Berdasarkan jawaban Siegfried, saya menggunakan yang berikut ini yang tampaknya lebih alami:

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

Saya juga menggunakan c-hjklbinding di tempat lain (beralih dari panel ke yang lain), tapi itu hanya dalam mode normal, jadi tidak ada masalah.

Nicolas Mattia
sumber
1

Saya menggunakan ;untuk memperluas UltiSnips, itu sangat bagus untuk saya

let g:UltiSnipsExpandTrigger = ";"
Ruto Collins
sumber
Sunting: Saya sekarang menggunakan \karena saya menemukan saya tidak bisa mengetik ;pada mode insert Vim
Ruto Collins
0

Saya menggunakan kj. Inilah yang ada di saya .vimrc:

let g:UltisnipsExpandTrigger="kj".

Jarang terjadi bahwa saya menemukan kata yang ada kjdi dalamnya. Jika ini masalahnya saya hanya akan menunggu beberapa detik setelah mengetik kdan tipe itu j.

dowewas
sumber
0

Seperti yang disebutkan oleh orang lain, pemetaan Cj ke ultisnips berfungsi dengan baik.
let g:UltiSnipsExpandTrigger="<c-j>"

Sekarang, jika Anda melangkah lebih jauh dan instal xcape dan gunakan
xcape -e "Shift_L=Control_R|J"

Anda melepaskan kekuatan hanya menggunakan tombol shift untuk utlitsnips.

Hritik
sumber