बिना फ़ाइल, गैर-मौजूदा फ़ाइल, या रिक्त फ़ाइल (लेकिन मौजूदा फ़ाइल से शुरू होने पर नहीं) के साथ विम को शुरू करने पर मैं एक ऑटोकैमड कैसे चला सकता हूं?


11

जब मैं विम शुरू करूं, तो मैं निम्नलिखित परिदृश्य में एक ऑटोकैमड चलाना चाहता हूं:

  • कोई फ़ाइल नाम निर्दिष्ट नहीं है।
  • जब फाइल नई हो।
  • जब फ़ाइल मौजूद है, लेकिन पूरी तरह से खाली है।

उपरोक्त तीनों मामलों में मैं एक ऑटोकैमड चलाना चाहता हूं; विशेष रूप से, मैं केवल उपरोक्त परिदृश्यों के लिए स्वचालित रूप से इन्सर्ट मोड शुरू करना चाहूंगा (और नहीं जब मैं एक ऐसी फ़ाइल खोल रहा हूँ जो पहले से मौजूद है और रिक्त नहीं है)।


अपडेट करें:

मैंने निम्नलिखित को अपने में रखने की कोशिश की है _vimrc, लेकिन कोई भी भाग्य नहीं है (प्लस मुझे यकीन नहीं है कि क्या कोई ऐसा कार्य है जो किसी फ़ाइल में वर्णों की संख्या को गिनता है (यह देखने के लिए कि क्या यह शून्य है) इसे खोलने से पहले:

if @% == "" || filereadable(@%)
  autocmd BufRead,BufNewFile * startinsert
endif

नहीं, यह कोई डुप्लिकेट नहीं है। मैं vi चाहता हूं कि केवल उस SCENARIOS के लिए जिसे मैं अपने नाम से इन्सर्ट करूं।
जॉन सोंडरसन

3
ठीक है, मैं इसे एक अलग तरह से देखना चाहता हूँ, लेकिन मैं बहुत खुश हूँ। ;-) मैंने मतभेदों को स्पष्ट करने के लिए आपके प्रश्न को थोड़ा संपादित किया है।
मार्टिन टूरनोइज


2
@ जॉन्होन्डरसन पहला लिंक आपको बताता है कि कैसे पता लगाएं कि कोई फ़ाइल नाम नहीं दिया गया है, दूसरे को normalइसके बजाय का उपयोग करके अनुकूलित किया जा सकता है exec
मुरु १४'१५

1
विम फ़ाइल को केवल एक बार पढ़ा जाता है : जब विम शुरू होता है। ऑटोकैम की सामग्री हर बार चालू होने के बाद चलती है। तो ifकथन आटोक्मड के आस-पास नहीं होना चाहिए , अगर आटोक्मड के अंदर होना चाहिए , तो यह ऑटोकैड ट्रिगर होने पर हर बार चलाया जाएगा।
मार्टिन टूरनोइज

जवाबों:


10

यह मेरे लिए आपके सभी 3 मामलों के लिए काम करता है:

function InsertIfEmpty()
    if @% == ""
        " No filename for current buffer
        startinsert
    elseif filereadable(@%) == 0
        " File doesn't exist yet
        startinsert
    elseif line('$') == 1 && col('$') == 1
        " File is empty
        startinsert
    endif
endfunction

au VimEnter * call InsertIfEmpty()

फ़ाइल के खाली होने की वजह से ये संभवत: सिर्फ अंतिम चेक के रूप में संघनित हो सकते हैं, क्योंकि कोई फ़ाइल नाम या कोई फ़ाइल जो आमतौर पर मौजूद नहीं होती है, खाली बफर के रूप में शुरू होती है। हालांकि, यह संभव है कि कुछ अन्य प्लगइन पहले दो मामलों (जैसे कुछ टेम्पलेट प्लगइन्स) में से कुछ में कुछ सामान पहले से भर देते हैं, इसलिए सभी तीनों की जांच करना सबसे अच्छा है।

पहला परीक्षण जो आपके पास पहले से था।

दूसरा परीक्षण filereadableशून्य के मान के खिलाफ जांच करने की आवश्यकता है (मौजूद नहीं है) यह तय करने के लिए कि क्या यह नया है (जो आपके पास था)।

अंतिम परीक्षण यह जांचता है कि फ़ाइल में अंतिम पंक्ति की संख्या 1 है (जो कि पहली पंक्ति भी है, जिसका अर्थ है कि केवल एक पंक्ति है), और यह कि पंक्ति के अंत का कॉलम नंबर (अंतिम वर्ण के बाद वाला कॉलम) पंक्ति) 1 है, जिसका अर्थ है कि 0 वर्ण हैं। यदि इसमें 0 वर्णों के साथ केवल 1 पंक्ति है, तो फ़ाइल खाली होनी चाहिए।

एक अंतिम नोट: जिस तरह से आप अपने बयान में सवाल करते हैं, वह कुछ आश्चर्यजनक परिणाम दे सकता है। अर्थात्, आप सेट कर रहे हैं BufReadऔर BufNewFileकेवल तभी जब स्टार्टअप में स्थितियां पूरी होती हैं, लेकिन तब आपके ऑटोकॉमैंड्स आपके शेष सत्र के लिए मौजूद होते हैं। इसलिए, यदि आप एक खाली फ़ाइल पर शुरू करने वाले थे, जो इन आदेशों को सेट करता है, तो बाद में खोली गई हर नई फ़ाइल (नई है या नहीं, रिक्त है या नहीं) आवेषण मोड में शुरू होगी।

ऑटोकॉमैंड VimEnterको विम के स्टार्टअप के अंत में और पूरे सत्र के लिए केवल एक बार चलाया जाता है। इस तरह, आपके परीक्षण केवल तभी चलते हैं जब आप विम शुरू करते हैं और कोई अन्य समय नहीं।

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