विम को स्वचालित रूप से एक फ़ाइल के अंत में एक नई रेखा कैसे जोड़ें?


16

विम आम तौर <EOL>पर अंतिम पंक्ति के लिए लिखते हैं जब मूल फ़ाइल में एक था।

किसी फ़ाइल के अंत में हर समय एक नई लाइन लिखने के लिए vim कैसे करें (जब फ़ाइल बाइनरी नहीं है और पहले से ही एक नहीं है)?

मैंने eolविकल्प का परीक्षण किया है, लेकिन यह उम्मीद के मुताबिक काम नहीं किया।

यह भी देखें: पाठ फ़ाइलों के अंत में लापता एंड-ऑफ-लाइन को संरक्षित करें , लेकिन इसके विपरीत। और: फाइलें एक नई सीमा के साथ क्यों समाप्त होनी चाहिए?

जवाबों:


17

बुनियादी जानकारी

विम बफर में नवीनतम न्यूलाइन नहीं दिखाता है, लेकिन वास्तव में विम आपको फाइल लिखते समय हमेशा ईओएल को रखता है, क्योंकि यह यूनिक्स सिस्टम में टेक्स्ट फाइलों के लिए मानक है। आप इसके बारे में अधिक जानकारी यहाँ पा सकते हैं । संक्षेप में, आपको फ़ाइल के अंत में नई लाइनों की अनुपस्थिति के बारे में चिंता करने की ज़रूरत नहीं है।

प्रयोग १

इस व्यवहार को जांचने के लिए आप यह छोटा सा प्रयोग कर सकते हैं। टर्मिनल निष्पादन में:

$ vim test_test

चरित्र दर्ज करें 1और फ़ाइल सहेजें :wq

आपके पास फ़ाइल में केवल एक वर्ण है, है ना? वास्तव में नहीं :) आपके पास अब आपकी फ़ाइल 1और LFवर्ण हैं। आइए इसे जाँचें, हेक्सडम्प उपयोगिता के साथ:

$ hexdump test_test
0000000 31 0a
0000002

31चरित्र के लिए ASCII कोड है 1, और 0aगैर-मुद्रण LFवर्ण के लिए ASCII कोड है जो UNIX के लिए है क्योंकि आप पहले से ही लाइन के अंत के लिए कोड जान सकते हैं।

प्रयोग २

लेकिन क्या होगा अगर हम फाइल को खोलेंगे जिसमें फाइल eolके अंत में प्रतीक नहीं है । आइए इसे भी जांचें। आइए बिना अंत में फाइल बनाएं, उदाहरण के लिए:

$ echo -n "1" > test_without_eol

तो फिर आइए इसके अंदर देखें हेक्सडंप के साथ:

$ hexdump test_without_eol
000000 31
0000001

इसलिए यहां कोई eolपात्र नहीं है। आइए इस फाइल को vim में खोलें:

$ vim test_without_eol

संपादक के तल पर आप देखेंगे:

"test_without_eol" [noeol] 1L, 1C

और यदि आप इस फ़ाइल को सहेजेंगे तो eolवर्ण स्वचालित रूप से डाला जाएगा।

हम इस बारे में क्या कर सकते हैं?

यदि आपको वास्तव में फ़ाइल का अंत देखने की आवश्यकता है। इस आदेश का उपयोग करने का प्रयास करें:

:set listchars=eol:$

यह सभी eolवर्णों को $संकेत के रूप में दिखाएगा ।


महान। मैं अपनी उलझन के बाद उसी नतीजे पर पहुँचा, क्योंकि विम वास्तव में मुझे यह नई लाइन नहीं दिखा रहा था, लेकिन बचाने के बाद यह वहाँ था।
kenorb

1
जिस तरह से आप इस कॉमांड का उपयोग करके सभी ईओएल चरवाहों को दिखा सकते हैं:set listchars=eol:$
अलेक्जेंडर माईशोव

"वास्तव में मुझे यह नई लाइन नहीं दिख रही थी" - यूनिक्स में, कोई रेखा नहीं है। एक पंक्ति को "गैर-एलएफ पात्रों की संख्या के रूप में परिभाषित किया गया है, जो एलएफ चरित्र में समाप्त होता है"। यदि आप LF को "अगली पंक्ति में नहीं" लेकिन "लाइन का अंत" के रूप में मानते हैं, तो विम अचानक बहुत अधिक समझ में आता है।
आमदन

8

विम केवल EOL यदि फ़ाइल के रूप में खोला जाता है को छोड़ देता है 'binary' और'endofline' विकल्प रीसेट किया जाता है (बाइनरी फ़ाइल एक EOL जब उद्घाटन नहीं था जब, या आप स्पष्ट रूप से विकल्प रीसेट करें)। दूसरे शब्दों में, विम केवल बाइनरी फ़ाइलों के लिए एक लापता ईओएल का सम्मान करता है। पाठ फ़ाइलों के लिए, यह हमेशा एक (जोड़ा) ईओएल के साथ लिखता है। (इसीलिए आपको EOL के बिना टेक्स्ट फाइल रखने के लिए मेरे PreserveNoEOL प्लगइन जैसे समाधान की आवश्यकता है ।) आप सभी विवरण यहां देख सकते हैं :help 'endofline'

तो, आपको केवल विम को स्वचालित रूप से ईओएल लिखने के लिए गैर-बाइनरी के रूप में फ़ाइल को खोलना सुनिश्चित करना होगा ।


5

जैसा कि अलेक्जेंडर ने उल्लेख किया है, विम ईओएफ पर ईओएल नहीं दिखाता है, इसीलिए यह इतना भ्रामक है (विशेष रूप से खाली / खाली नई लाइन जो एक और बात है), इसलिए यह वास्तव में फ़ाइल सेव पर हर बार लिखता है।

यहाँ सरल परीक्षण है कि कैसे काम करे

$ printf foo > foo.txt
$ cat foo.txt
foo$ wc foo.txt
0 1 3 foo.txt
$ vim -cwq foo.txt
$ cat foo.txt
foo
$ wc foo.txt
1 1 4 foo.txt

ध्यान दें कि जब कोई ईओएल नहीं होता है तो शेल प्रॉम्प्ट कैसे व्यवहार करता है (यह अगली पंक्ति के साथ मिश्रित हो जाता है)। जब फ़ाइल को विम के साथ फिर से सहेजा जाता है, तो यह इसे जोड़ता है।

उपयोग करने से wcहम सहेजने से पहले और बाद में लाइनों, शब्दों और वर्णों की गणना कर सकते हैं, इसलिए हम देख सकते हैं कि यह वास्तव में बदलता है।

यह इतना महत्वपूर्ण क्यों है? हमारी फ़ाइलों को रखने के लिए POSIX का अनुपालन करें

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