UltiSnips और YouCompleteMe


130

मैं अपने macvim पर बंडल अल्टिसनीप्स और youcompleteme स्थापित किया है। समस्या यह है कि अल्टिसनिप्स काम नहीं करता है क्योंकि टैब ycm द्वारा बाध्य है। मैंने डालने की कोशिश की let g:UltiSnipsExpandTrigger = "<s-tab>"ताकि मैं शिफ्ट-टैब के साथ स्निपेट को पूरा कर सकूं, लेकिन यह किसी अज्ञात कारण से काम नहीं करता। मैं ट्रिगर के रूप में कैप का उपयोग कर सकता हूं, लेकिन अभी तक मुझे ऐसा करने का कोई तरीका नहीं मिला है।

क्या आप में से कोई भी उन दो ऐड-ऑन का एक साथ उपयोग करता है? शिफ्ट-टैब का काम करने के लिए मैं क्या कर सकता हूं? क्या आप स्निपेट्स को ट्रिगर करने के लिए एक और कुंजी की सिफारिश कर सकते हैं?


<S-Tab>YCM मैप्स भी करता है और इसी तरह UltiSnips, IIRC भी करता है। आपको वाईसीएम के लेखक से पूछना चाहिए, मुझे लगता है।
रोमेन

मैंने ycm पर पिछली पूर्णता के लिए कुंजियाँ बदल दीं, और s- टैब हटा दिया। अभी भी काम नहीं कर रहा है। मैं उसे github पर मुझे संदेश देने की कोशिश करूँगा मुझे लगता है
पिविनिस

1
देखें कि क्या आपका नक्शा काम कर रहा है :verbose map <S-Tab>, यह संभवतः कमांड लाइन विम पर काम नहीं करेगा। एक बहुत अच्छा प्रतिस्थापन imo है <CR>
दान बाकर

इसके लिए धन्यवाद कि मैं एक समाधान खोजने के लिए उत्सुक था और यह तथ्य कि YouCompleteMe के पास एक मंच नहीं है, कष्टप्रद है। धन्यवाद
atmosx

2
क्या आपने हाल ही में फिर से यह कोशिश की है? एक या दोनों प्लगइन्स को अपडेट किया जाना चाहिए, क्योंकि उल्टीस्नीप्स दस्तावेज़ीकरण कहता है: "YouCompleteMe - UltiSnips के लिए बॉक्स पूरा होने के समर्थन के साथ आता है। यह स्निपेट्स के लिए एक बहुत अच्छा पूरा संवाद प्रदान करता है।"
काइल स्ट्रैंड

जवाबों:


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
जॉय लियू का सुझाव मेरे लिए काम नहीं कर रहा था (टैब कुछ भी विस्तारित नहीं करेगा, यह केवल अगले स्वत: पूर्ण विकल्प पर स्क्रॉल करेगा)। इस जवाब ने बहुत अच्छा काम किया, लेकिन मुझे YouCompleteMe को पहले अपडेट और फिर से करना पड़ा।
बेंजामिनगोल्डर

1
जैसा कि दूसरों ने उल्लेख किया है, जॉय लियू का समाधान अब काम नहीं कर रहा है। यह एक करता है!
लंगर

3
क्या स्वत: पूर्णता सूची में स्निपेट को उजागर करने का कोई तरीका है?
वाक्यगामा

3
अरे नहीं ! आदमी ! एक आकर्षण की तरह काम करना! सबसे अच्छा समाधान कभी!
यवेस लैंग

4
यह अच्छा है, लेकिन tabएक स्निपेट के अंदर मारना YCM सुझाव को पूरा करने के बजाय, अगले टैबस्टॉप पर जाएगा। मुझे इस काम को जोड़ना let g:UltiSnipsJumpForwardTrigger = "<Right>"और let g:UltiSnipsJumpBackwardTrigger = "<Left>"बनाना था।
गेब्रियल फ्लोरिट

48

YouCompleteMe समस्या ट्रैकर के एक पृष्ठ पर इस सुझाव का प्रयास करें । अपने .vimrc में:

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

हालांकि यह सेटिंग स्निपेट के विस्तार को एक स्निपेट के भीतर आगे कूदने के लिए डिफ़ॉल्ट मैपिंग का हिस्सा बनाएगी, लेकिन यह टेक्स्टमैट्स के व्यवहार का अनुकरण करता है जैसा कि उल्टीस्नीप्स टैग में उल्लेख किया गया है।

चूंकि मैंने अपनी कैप्स लॉक कुंजी को Ctrl से मैप किया है, इसलिए यह मैपिंग बहुत आसानी से काम करती है।


1
यह सबसे अच्छा जवाब, सरल और सीधा होना चाहिए, हालांकि मेरे macvim में macOS 10.12 पर <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 कुछ टिप्पणियों को स्वतः पूर्ण करता है।
चेस

3
मैक ओएस एक्स के लिए यह मेरे लिए काम नहीं कर रहा था; हालांकि जुलाई 2014 की 10 वीं के रूप में। सीगफ्रीड के जवाब ने काम किया।
मिगेल.martin

अब तक बहुत अच्छा लगता है! लेकिन मैं स्निपेट ब्रेकपॉइंट्स को "टैब-थ्रू" कैसे कर सकता हूं?
चेरी

1
मुझे यह बांधना आसान लगा, g:UltiSnipsJumpForwardTrigger="<cr>"ताकि मैं अभी भी सभी संभावित पूर्णताओं / स्निपेट्स के माध्यम से टैब कर
सकूं

1
यह मुझे YCM सूचीबद्ध संपूर्ण (Ultisnips सुझावों सहित) के माध्यम से टैब करने देता है, लेकिन अंतिम inoremap <expr> लाइन वास्तव में एंटर कुंजी के मेरे दबाव को प्रभावित नहीं करती है। मैं मैन्युअल रूप से पूरा पूरा कर सकता हूं <Cy>, लेकिन दर्ज कुछ भी नहीं करता है। कोई सुझाव?
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

बस माइकल्सलेक, जॉय लियू द्वारा उत्तर देने के साथ-साथ समाधान के साथ मैंने इस मुद्दे को थ्रेड और इस लड़के के 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>"

जब सीओसी और अल्टिसनिप के साथ एक ही मुद्दे को ठीक करने की कोशिश कर रहा था तो यह बहुत मददगार था। PUM को ऊपर और नीचे ले जाने के साथ-साथ Ultisnips प्लेसहोल्डर्स के भीतर आगे और पीछे जाने के लिए <TAB> और <S-TAB> का उपयोग करना चाहते हैं। धन्यवाद।
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

बेशक, अगर आप सिर्फ जोय लियू प्रदान की गई सेटिंग्स को रखते हैं और फिर इस फ़ंक्शन का उपयोग करें तो सब कुछ पूरी तरह से काम करेगा!

संपादित करें: इसके अलावा, मैं 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>पिछले पूरा होने के आइटम का चयन करने के लिए। आप gCom के साथ YouCompleteMe बाइंडिंग बदल सकते हैं : ycm_key_list_select_completion और g: ycm_key_list_prepret_completion विकल्प। ध्यान दें कि इन विकल्पों के नाम हाल ही में बदल दिए गए थे जब विकल्प को एक स्ट्रिंग से एक तार की सूची में बदल दिया गया था।


3

मैंने YouCompleteMe प्लगइन के बाद UltiSnips प्लगइन स्थापित किया, इसलिए मैंने सोचा कि वे परस्पर विरोधी थे, लेकिन वास्तव में मेरे पास कुछ और हस्तक्षेप था:

set paste

.vimrcयदि वह मौजूद है तो उसे निकालना सुनिश्चित करें ।


2

जबकि इस पोस्ट में कई उत्तर ठीक काम करते हैं, मैं सिर्फ यह कहना चाहता हूं कि समस्या YCM और UltiSnip के बीच महत्वपूर्ण बाध्यकारी टकराव के कारण होती है, जबकि YCM डिफ़ॉल्ट रूप से UltiSnip स्निपेट का समर्थन करता है, यह डिफ़ॉल्ट UlnSnip विस्तार ट्रिगर <tab>को इसके पूर्ण चयन कुंजी के रूप में लेता है , इसलिए UltiSnip स्निपेट द्वारा विस्तार नहीं किया जाएगा <tab>। दे दो उन्हें अलग कुंजी समस्या का समाधान होगा बंधन, मैं व्यक्तिगत रूप से उपयोग करें <c-nऔर <c-p>YCM के लिए और सामान्य का प्रयोग <tab>UltiSnip के लिए। आप help youcompletemedim के साथ और अधिक विवरण प्राप्त कर सकते हैं ।


2

सिगफ्रीड के उत्तर के आधार पर, मैं निम्नलिखित का उपयोग कर रहा हूं जो अधिक प्राकृतिक लगता है:

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

संपादित करें: मैं अब उपयोग करता \हूं क्योंकि मैंने पाया कि मैं ;विम के इंसर्ट मोड पर टाइप नहीं कर सकता
रुतो कोलिन्स

0

मैं उपयोग करता हूं kj। यह वही है जो मेरे में है .vimrc:

let g:UltisnipsExpandTrigger="kj"

यह शायद ही कभी होता है कि मैं उस शब्द में भागता हूं kjजो उसमें है। अगर ऐसा है तो मैं टाइप करने के बाद कुछ सेकंड इंतजार करूंगा kऔर वह टाइप होगा j


0

जैसा कि दूसरों ने उल्लेख किया है, सीजे को अल्टिस्निप के लिए मैप करना बहुत अच्छा काम करता है।
let g:UltiSnipsExpandTrigger="<c-j>"

अब, यदि आप थोड़ा आगे जाते हैं और xcape स्थापित करते हैं और उपयोग करते हैं
xcape -e "Shift_L=Control_R|J"

आप utlitsnips की शिफ्ट कुंजी का उपयोग करने की शक्ति प्राप्त करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.