जब कोई वैकल्पिक बफ़र मौजूद न हो तो bd # करेंट बफर को डिलीट करें?


9

यहां बताया गया है कि मैं अपने द्वारा देखे जा रहे व्यवहार को कैसे पुन: पेश करता हूं।

सबसे पहले, मैं इस कमांड को दर्ज करता हूं:

echo aaaaa > a
vim a

विम में, मैं इन आदेशों को दर्ज करता हूं:

:ls
:e #
:echo bufname('#')

यहाँ उपरोक्त तीन कमांड का आउटपुट दिया गया है:

:ls
  1 %a   "a"                            line 1

:e #
E194: No alternate file name to substitute for '#'

:echo bufname('#')

bufname('#')आदेश का कोई उत्पादन पैदा करता है।

अब मैं इस कमांड को दर्ज करता हूं:

:bd #

वर्तमान बफ़र को हटा दिया गया है और इसे "[नो नेम]" बफ़र से बदल दिया गया है:

:ls
  2 %a   "[No Name]"                    line 1

मैं E194निष्पादन पर त्रुटि मिलने की उम्मीद कर रहा था :bd #। इसके बजाय वर्तमान बफ़र को क्यों हटाया गया?

मैं उपयोग कर रहा हूं VIM - Vi IMproved 8.0


1
यह एक दिलचस्प बिंदु है। आप अपने प्रश्न में उल्लेख कर सकते हैं कि यह भी मामला है NVIM v0.3.0-dev, मैंने जाँच की।
klaus

@ LoneLearner मैं वास्तव में इस जवाब का इनाम के कारण नहीं था, लेकिन अगर आप एक की पेशकश करने जा रहे हैं तो यह अच्छा होगा यदि आप इसे एक योग्य उत्तर के लिए पुरस्कार देंगे ... अफसोस, आपने लगभग एक में प्रवेश नहीं किया है सप्ताह और इनाम की अवधि खत्म हो गई है ...
बी लेयर

1
@ प्रार्थना क्षमा करें, मैं इनाम देना भूल गया। आपने शानदार उत्तर लिखा है। एक बार जब मेरे पास इस स्टैक एक्सचेंज साइट में पर्याप्त अंक होंगे, तो मैं इस प्रश्न के लिए एक और इनाम शुरू करूंगा और आपको इनाम प्रदान करूंगा। मुझे उम्मीद है कि इससे मेरी गलती ठीक होगी। आपके द्वारा लिखे गए महान जवाब के लिए धन्यवाद।
लोन लर्नर

@LoneLearner अरे, आपका स्वागत है और कोई चिंता नहीं है। मैं आपकी टिप्पणी की सराहना करता हूं। इनाम के बारे में चिंता मत करो। जैसा मैंने कहा कि यह अंकों के बारे में नहीं था। मैं सिर्फ आपको अगली बार एक इनाम देने के लिए सिर देना चाहता था। बिंदुओं को यहाँ से उस ओर लाएँ। चीयर्स!
बी लेयर

जवाबों:


7

सबूत

क्योंकि कोई वैकल्पिक फ़ाइल नहीं है जो आप वास्तव में केवल सादे ol 'चला रहे हैं :bd, वर्तमान बफ़र को हटा रहे हैं ... इसके बिना प्रयास करें #और आप देखेंगे कि परिणाम समान है। इसी तरह की बात होती है :buffer, :sbufferऔर कम से कम कुछ अन्य आदेश जो #एक तर्क के रूप में स्वीकार करते हैं : वे चुपचाप व्यवहार करते हैं जैसे कि कोई तर्क पारित नहीं किया गया था।

उसी पंक्तियों के साथ, यदि आप कोशिश :bunload #करते हैं कि आपको यह त्रुटि मिले E90: Cannot unload last buffer:। भागो :bunloadएक बार फिर से कोई तर्क और, के साथ, आप एक ही परिणाम प्राप्त करेंगे।

डॉक्स

इसलिए हमारे पास ऐसे सबूत हैं जो #"कुछ भी नहीं" (शायद एक खाली स्ट्रिंग) द्वारा प्रतिस्थापित किया जा रहा है। हम यहाँ से कहाँ जायेंगे? मैंने इस व्यवहार का उल्लेख खोजने की कोशिश करते हुए थोड़ी देर के लिए मदद फ़ाइलों के चारों ओर पोक किया। कुछ भी स्पष्ट नहीं था लेकिन :h cmdline-linesकहते हैं (एक या दो पृष्ठ नीचे स्क्रॉल करें) ...

जब वर्ण '%' या '#' का उपयोग किया जाता है जहां फ़ाइल नाम अपेक्षित होता है, तो उन्हें वर्तमान और वैकल्पिक फ़ाइल नाम में विस्तारित किया जाता है।

मैंने पढ़ा है कि Vim फ़ंक्शन के #माध्यम से डाल रहा है expand()(यानी expand('#')) या कम से कम उसी अंतर्निहित कोड का उपयोग किया जाता है।

:h expand() कहते हैं:

विस्तार करें .. विशेष कीवर्ड। .. '%' या '#' का उपयोग करते समय, और वर्तमान या वैकल्पिक फ़ाइल नाम को परिभाषित नहीं किया जाता है, एक खाली स्ट्रिंग का उपयोग किया जाता है।

परिचित लगता है।

कोड

अब उपरोक्त में से कोई भी निश्चित नहीं है या कोई सुराग क्यों देता है ? इसलिए मैंने खुदाई में कुछ और समय बिताया ... इस बार कोड में। मेरा C बहुत ही कठोर है और मेरे पास कोई अच्छा उपकरण नहीं है, लेकिन मैं एक ऐसा फंक्शन ढूंढने में कामयाब रहा, जो कुछ सेटअप को :bdeleteकॉल करता है do_bufdel()। यह कमांड लाइन तर्क भेजता है buflist_findpat(), जिसके माध्यम से, यदि #सामना किया जाता है , तो मान लौटाता है curwin->w_alt_fnum। यह वैकल्पिक बफर का "बफर नंबर" है ... जो हमारे परिदृश्य में एक सकारात्मक मूल्य नहीं हो सकता है। (इस बात की कोई जाँच नहीं है कि रिटर्न वैल्यू चुने जाने से पहले पूरी फाइल वैध है या मौजूद नहीं है।)

do_bufdel()एक चेक आउट बैक में 0 से कम बफर नंबर के लिए उस रिटर्न वैल्यू के खिलाफ बनाया गया है, जिस स्थिति में पैरामीटर प्रोसेसिंग लूप बाहर से टूट गया है। इसका परिणाम यह होगा कि कोर :bdeleteकोड को कोई भी पैरामीटर प्रस्तुत नहीं किया जाएगा ... जो कि मेरे पहले के अंतर्ज्ञान के अनुरूप है।

आगे क्या होगा?

यह ऐसा प्रतीत होता है कि इस रूप में डिज़ाइन किया गया है कि मुझे ऐसा कुछ भी दिखाई नहीं दिया जो एक स्पष्ट बग की तरह दिखता हो। संभवतः चूक का पाप, हालांकि ... एक कोने का मामला जिसे नजरअंदाज किया गया है और इस प्रकार कोई सुंदर संभाल नहीं है। लेकिन केवल डेवलपर्स ने लिखा है कि यह सुनिश्चित करने के लिए पता है। तो अंतिम चरण उनके इनपुट प्राप्त करने का प्रयास करना होगा। जैसा कि क्रिश्चियन बी ने कहा कि विम-देव सूची में जाने का तरीका है।

(ध्यान दें कि buflist_findpat()एक उपयोगिता समारोह है तो यह मान लेना कि कल्पना की एक खिंचाव की आवश्यकता नहीं होगी :bunload, :bufferआदि प्रयोग कर रहे हैं, भी ... कि के संबंध में उनके सामान्य व्यवहार की व्याख्या करता है #।)


मुझे लगता है कि विस्तारित बफ़र मौजूद है या नहीं यह जाँचने के लिए एक और कार्य करेगा। क्या आप सुनिश्चित हैं कि यह डिजाइन द्वारा होना चाहिए था? मुझे लगता है कि इसे बग के रूप में सूचीबद्ध किया जाना चाहिए।
klaus

मुझे लगता है कि आपका शोध सही है। BTW: मुझे नहीं लगता कि यह वास्तव में एक बग है।
क्रिश्चियन ब्रेबंट

मैंने अभी-अभी अपना निष्कर्ष थोड़ा सा निकाला है .... यह एक कठिन बग की तरह नहीं दिखता है। OTOH, यदि कोई इसके बारे में सोचता है, तो यह निष्कर्ष निकाल सकता है कि इसे बेहतर तरीके से संभालने की आवश्यकता है। शायद केवल डेवलपर सुनिश्चित करने के लिए जानता है।
B लेयर

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