विम फ़ाइल नाम / पथ पूरा करना


11

मुझे पता है कि मैं ctrl + x, ctrl + f ( compl-filename) का उपयोग करके वर्तमान निर्देशिका से फ़ाइल नाम / पथ पूरा कर सकता हूं । यह सेट ऑटोकैडिर के साथ संयोजन में बहुत अच्छा काम करता है, जो वर्तमान निर्देशिका को सक्रिय बफर की निर्देशिका में बदलता है।

हालांकि, मैंने airblade/vim-rooterवर्तमान निर्देशिका को "प्रोजेक्ट" फ़ोल्डर बनाने के लिए उपयोग करना शुरू कर दिया । अब फ़ाइलनाम पूरा होना हमेशा प्रोजेक्ट फ़ोल्डर से शुरू होता है।

प्रश्न: क्या फ़ाइल नाम पूरा करने के लिए वर्तमान निर्देशिका के बजाय सक्रिय बफर की निर्देशिका का उपयोग करने का कोई तरीका है? या कुछ और वर्कअराउंड?

स्टैकओवरफ्लो में भी पूछा गया


5
C-xC-f हमेशा वर्तमान बफ़र की कार्यशील निर्देशिका का उपयोग करता है, बिना किसी विकल्प के इसे कॉन्फ़िगर करने के लिए (यह pathया तो समर्थन नहीं करता है )। यह इस बात पर निर्भर करता है कि विम-रूटर के लिए आपका क्या उपयोग है। आप इससे क्या चाहते हैं, इसके आधार पर, हम अन्य प्लगइन्स का उपयोग कर सकते हैं। एक तरफ: मैं youcompleteme का उपयोग करता हूं, जो यदि आप टाइप करना शुरू करते हैं तो वर्तमान बफर की निर्देशिका से पथ पूरा करता है ./। देखें reddit.com/r/vim/comments/216jdd/...
muru

जवाबों:


7

जैसा कि @muru ने उल्लेख किया है, निर्देशिका को कॉन्फ़िगर करने का कोई विकल्प नहीं है, जिसमें से पथ और फ़ाइल नाम को पूरा करने के लिए। यह हमेशा खिड़की की कार्यशील निर्देशिका का उपयोग करता है।

मैंने इसके साथ काम करने के लिए कुछ फ़ंक्शन और मैपिंग लिखी हैं। पर्दे के पीछे, वे :lcdअस्थायी रूप से स्थानीय कामकाजी निर्देशिका (उपयोग करते हुए ) को बदलते हैं , फिर जब काम करते हैं तो पिछली कार्यशील निर्देशिका को पुनर्स्थापित करते हैं।

हाथी

मेरे लिए भी अज्ञात कारणों से, मैंने इस माइक्रो-प्लगइन को एलिफेंट कहा है

यहाँ कोड ( GitHub पर मेरे विम विन्यास से कॉपी किया गया है ):

let g:elephant_map = {
    \ 'f': function('elephant#current_file'),
    \ 'p': function('elephant#vcs_project')
\ }

function! elephant#prompt(base)
    let l:Fcn = get(g:elephant_map, a:base, function('elephant#identity'))
    let l:basedir = l:Fcn()
    execute 'lcd' l:basedir
    let l:file = fnamemodify(input(l:basedir.'/', '', 'file'), ':p')
    lcd -
    return fnamemodify(l:file, ':.')
endfunction

function! s:elephant_init()
    let l:base = getchar()
    return elephant#prompt(nr2char(l:base))
endfunction

function! elephant#identity()
    return '.'
endfunction

function! elephant#vcs_project()
    return fnamemodify(finddir('.git', '.;'), ':h')
endfunction

function! elephant#current_file()
    return expand('%:h')
endfunction

inoremap <silent> <expr> <C-R><C-E> <SID>elephant_init()
cnoremap <silent> <C-R><C-E> <C-R>=<SID>elephant_init()<CR>

इसका इस्तेमाल कैसे करें

इन मैपिंग का उपयोग 3 चरणों में होता है।

1. मैपिंग लागू करें

इन्सर्ट मोड या कमांड-लाइन मोड में, मैपिंग का उपयोग करके आह्वान करें <C-R><C-E>

2. एक निर्देशिका चुनें

जो रूट निर्देशिका आप से पूरा करना चाहते हैं चुनने के लिए एक एकल वर्ण टाइप करें। उपरोक्त कोड दो प्रकार की जड़ें प्रदान करता है:

  • f - वह निर्देशिका जो वर्तमान फ़ाइल (बफर) में रहती है
  • p - Git प्रोजेक्ट की बेस डायरेक्टरी वर्तमान फाइल से संबंधित है

3. पथ या फ़ाइल नाम दर्ज करें

आपको उपलब्ध पूर्ण होने के साथ, निर्दिष्ट निर्देशिका के सापेक्ष पथ या फ़ाइल नाम दर्ज करने के लिए प्रेरित किया जाएगा। Enterसमाप्त होने पर दबाएं ।

कुछ नोट

  • यह सम्मिलित मोड में इनलाइन पूर्णता प्रदान नहीं <C-X><C-F>करता है; इसके बजाय, आप कमांड-लाइन प्रॉम्प्ट (जहां :कमांड चलते हैं) पर पथ या फ़ाइल नाम टाइप करेंगे । दबाने पर Enter, पथ बफर में डाला जाएगा।
  • कमांड-लाइन मोड में भी यही सच है, जो कभी-कभी आपको हिट करते समय भ्रमित कर सकता है Enterऔर भूल सकता है कि आपको अभी भी Enterजो भी कमांड टाइप करना था उसे जारी करने के लिए हिट करना होगा।
  • अन्य निर्देशिका कार्यों को उन्हें जोड़कर पंजीकृत किया जा सकता है g:elephant_map
  • डाला गया मार्ग पूर्ण, पूर्ण मार्ग होगा। स्क्रिप्ट को उस व्यवहार को बदलने के लिए घुमाया जा सकता है, लेकिन मुझे इसके आसपास नहीं मिला है।

समाधान का काफी परीक्षण नहीं किया, लेकिन पूर्णता के कारण इसे स्वीकार कर लिया। इसके बजाय मैंने सुझाव का उपयोग किया: ctrl + x, ctrl + f के बजाय YouCompleteMe
राफेल बारबोसा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.