UltiSnips và YouCompleteMe


130

Tôi có gói ultisnips và youcompleteme được cài đặt trên macvim của tôi. Vấn đề là ultisnips không hoạt động vì tab bị ràng buộc bởi ycm. Tôi đã thử đặt let g:UltiSnipsExpandTrigger = "<s-tab>"để tôi có thể kích hoạt hoàn thành đoạn mã bằng tab shift, nhưng nó không hoạt động vì một số lý do không xác định. Tôi có thể sử dụng mũ làm trình kích hoạt, nhưng cho đến nay tôi không tìm thấy cách nào để làm điều đó.

Có ai trong số các bạn sử dụng hai tiện ích bổ sung này cùng nhau không? Tôi có thể làm gì để làm cho tab shift hoạt động? Bạn có thể giới thiệu một khóa khác để kích hoạt đoạn trích không?


YCM cũng lập bản đồ <S-Tab>và UltiSnips, IIRC cũng vậy. Bạn nên hỏi tác giả của YCM, tôi đoán vậy.
romainl

tôi đã thay đổi các phím để hoàn thành trước đó trên ycm và xóa s-tab. vẫn không làm việc. Tôi sẽ thử nhắn tin cho anh ấy trên github tôi đoán
pvinis

1
Xem bản đồ của bạn đang làm việc với :verbose map <S-Tab>, mặc dù nó có thể sẽ không hoạt động trên dòng lệnh vim. Một imo thay thế khá tốt là <CR>.
Daan Bakker

Cảm ơn vì điều đó tôi đã háo hức tìm giải pháp và thực tế là YouCompleteMe không có một diễn đàn gây phiền nhiễu. Cảm ơn
atmosx

2
Bạn đã thử điều này gần đây? Một hoặc cả hai plugin phải được cập nhật, bởi vì tài liệu UltiSnips nói: "YouCompleteMe - đi kèm với hỗ trợ hoàn thành trong hộp cho UltiSnips. Nó cung cấp một cuộc đối thoại hoàn thành thực sự tốt cho các đoạn trích."
Kyle Strand

Câu trả lời:


188

Một tùy chọn khác là sử dụng 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>"

Ở đây YouCompleteMe bị ràng buộc với một kết hợp khác Ctrln, nhưng sau đó sự kết hợp đó bị ràng buộc với tab thông qua SuperTab. UltiSnips và SuperTab chơi tốt với nhau, vì vậy bạn có thể liên kết trực tiếp UltiSnips với tab và mọi thứ sẽ ổn.


7
Đề xuất của Joey Liu không hoạt động với tôi (tab sẽ không mở rộng bất cứ điều gì, nó sẽ chỉ cuộn sang tùy chọn tự động hoàn thành tiếp theo). Câu trả lời này rất hiệu quả, nhưng trước tiên tôi phải cập nhật và biên dịch lại YouCompleteMe.
BenjaminGolder

1
Như những người khác đã đề cập, giải pháp của Joey Liu không còn hiệu quả. Cái này nào!
Neo

3
Có cách nào để làm nổi bật các đoạn trong danh sách tự động hoàn thành không?
cú pháp

3
CHỈ TRÍCH ! Đàn ông ! Làm việc như một cơ duyên! Giải pháp tốt nhất!
Yves Lange

4
Điều này là tốt, nhưng nhấn tabvào bên trong một đoạn sẽ đi đến tabstop tiếp theo, thay vì hoàn thành đề xuất YCM. Tôi đã phải thêm let g:UltiSnipsJumpForwardTrigger = "<Right>"let g:UltiSnipsJumpBackwardTrigger = "<Left>"để làm cho công việc này.
Gabriel Florit

48

Hãy thử đề xuất này trên một trang từ trình theo dõi sự cố YouCompleteMe. Trong .vimrc của bạn:

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

Mặc dù cài đặt này sẽ giúp mở rộng một đoạn chia sẻ ánh xạ mặc định để nhảy về phía trước trong một đoạn , nó mô phỏng hành vi của TextMates như được đề cập trong thẻ trợ giúp UltiSnips.

Vì tôi đã ánh xạ phím Caps Lock của mình sang Ctrl, ánh xạ này hoạt động khá trơn tru.


1
Đây phải là câu trả lời tốt nhất, đơn giản và dễ hiểu, mặc dù trong macvim của tôi trên macOS 10.12, <cj> không hoạt động, tôi đổi nó thành <ck>, sau đó mọi thứ hoạt động tốt. <tab> chuyển tiếp, <s-tab> lùi, <ck> mở rộng đoạn mã. Cảm ơn
gpanda

40

sao chép mã sau vào vimrc của bạn và tận hưởng. Chức năng này sẽ xử lý tất cả các vấn đề giữa YCM và 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
Một số tín dụng đến hạn tôi nghĩ: github.com/Valloric/YouCompleteMe/issues/ mẹo Và Buf Entry autocmd một vài bình luận xuống.
ches

3
Điều này dường như không hoạt động đối với tôi, đối với Mac OS X; vào ngày 10 tháng 7 năm 2014. Tuy nhiên, câu trả lời của Siegfried đã có hiệu quả.
Miguel.martin

Có vẻ tuyệt vời cho đến nay! Nhưng làm thế nào tôi có thể "lướt qua" các điểm dừng của đoạn trích?
chmanie

1
Tôi thấy nó rất thuận tiện để liên kết g:UltiSnipsJumpForwardTrigger="<cr>"để tôi vẫn có thể tab thông qua tất cả các lần hoàn thành / đoạn trích có thể
alaroldai

1
Điều này cho phép tôi hoàn thành tab thông qua YCM được liệt kê (bao gồm các đề xuất Ultisnips), nhưng dòng <expr> inoremap cuối cùng dường như không thực sự ảnh hưởng đến việc tôi nhấn phím enter. Tôi có thể tự kích hoạt hoàn thành với <Cy>, nhưng enter không làm gì cả. Bất kỳ đề xuất?
HaaR

18

tôi có cái này trong vimrc của tôi

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

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

đó là những gì tôi đã làm trong lần thử đầu tiên, nhưng tôi đã viết sai UltiSnips với Ultisnips .. oh tốt, cuối cùng đã giải quyết xong!


17

Cá nhân tôi đã chọn không sử dụng <tab>với YouCompleteMe mà điều hướng bằng tay.

Vì vậy, tôi đã thêm nó vào .vimrc:

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

chỉ đơn giản là vô hiệu hóa tabkhóa cho YCM. Thay vào đó, bạn sử dụng các phím di chuyển (mũi tên hoặc CTRL-N/ CTRL-P) và chọn mục nhập với CR. UltiSnips hoạt động mặc định với tab.


5

Chỉ cần kết hợp các câu trả lời của Michaelslec, Joey Liu và cùng với các giải pháp tôi tìm thấy trong chủ đề vấn đề nàyvimrc của anh chàng này , bây giờ tôi có điều này giải quyết khá nhiều vấn đề.

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

Điều này rất hữu ích khi về cơ bản cố gắng khắc phục vấn đề tương tự với COC và Ultisnips. Muốn sử dụng <TAB> và <S-TAB> để di chuyển lên và xuống PUM cũng như di chuyển qua lại trong các phần giữ chỗ của Ultisnips. Cảm ơn.
110100100

4

Mặc dù tôi biết bài đăng này hơi cũ nhưng tôi có chức năng riêng được tối ưu hóa hơn một chút so với bài viết ở trên:

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

Tất nhiên, nếu bạn chỉ giữ các cài đặt mà Joey Liu cung cấp và sau đó chỉ cần sử dụng chức năng này thì mọi thứ sẽ hoạt động hoàn hảo!

EDIT: Ngoài ra, tôi sử dụng một chức năng khác để tăng chức năng quay lại giữa YouCompleteMe và UltiSnips. Tôi sẽ cho bạn thấy ý của tôi là:

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

  return ""                                                                                                                   
endfunction

Sau đó, chỉ cần đặt cái này trong .vimrc của bạn:

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

Cũng như let g:UltiSnipsJumpBackwardTrigger="<s-tab>"và thiết lập của bạn!


3

Tôi sử dụng cả hai cùng nhau. Theo mặc định, YouCompleteMe liên kết <Tab><Down>để chọn mục hoàn thành tiếp theo cũng <S-Tab>như <Up>để chọn mục hoàn thành trước đó. Bạn có thể thay đổi các liên kết YouCompleteMe với các tùy chọn g: ycm_key_list_select_completiong: ycm_key_list_preingly_completion . Lưu ý rằng tên của các tùy chọn này đã được thay đổi gần đây khi tùy chọn được thay đổi từ một chuỗi thành một danh sách các chuỗi.


3

Tôi đã cài đặt plugin UltiSnips sau plugin YouCompleteMe vì vậy tôi nghĩ rằng chúng đang xung đột, nhưng thực tế tôi có một thứ gì đó gây nhiễu hơn:

set paste

Hãy chắc chắn để loại bỏ nó khỏi .vimrcnếu nó hiện diện.


2

Mặc dù nhiều câu trả lời hoạt động tốt trong bài đăng này, tôi chỉ muốn nói rằng vấn đề là do xung đột ràng buộc chính giữa YCM và UltiSnip, trong khi YCM hỗ trợ đoạn trích UltiSnip theo mặc định, nó lấy trình kích hoạt mở rộng UltiSnip mặc định <tab>làm khóa chọn hoàn thành của nó, vì vậy Đoạn trích UltiSnip sẽ không được mở rộng bởi <tab>. Cung cấp cho họ ràng buộc khóa khác nhau sẽ giải quyết vấn đề, cá nhân tôi sử dụng <c-n<c-p>cho YCM và sử dụng mặc định <tab>cho UltiSnip. Bạn có thể biết thêm chi tiết với help youcompletemedoc trong vim.


2

Dựa trên câu trả lời của Siegfried, tôi đang sử dụng những cách sau có vẻ tự nhiên hơn:

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

Tôi cũng sử dụng các c-hjklliên kết ở một nơi khác (chuyển từ khung này sang khung khác), nhưng điều đó sẽ chỉ ở chế độ bình thường, vì vậy không có vấn đề gì.


1

Tôi sử dụng ;để mở rộng UltiSnips, nó rất tiện cho tôi

let g:UltiSnipsExpandTrigger = ";"

Chỉnh sửa: Bây giờ tôi sử dụng \vì tôi thấy tôi không thể gõ ;vào chế độ chèn của Vim
Ruto Collins

0

Tôi sử dụng kj. Đây là những gì trong tôi .vimrc:

let g:UltisnipsExpandTrigger="kj".

Nó hiếm khi xảy ra rằng tôi chạy vào từ có kjtrong đó. Nếu đây là trường hợp tôi sẽ đợi vài giây sau khi gõ kvà gõ kiểu đó j.


0

Như đã đề cập bởi những người khác, ánh xạ Cj đến ultisnips hoạt động rất tốt.
let g:UltiSnipsExpandTrigger="<c-j>"

Bây giờ, nếu bạn đi xa hơn một chút và cài đặt xcape và sử dụng
xcape -e "Shift_L=Control_R|J"

Bạn giải phóng sức mạnh của việc sử dụng chỉ phím shift cho utlitsnips.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.