विम एक नई पंक्ति क्यों जोड़ रहा है? क्या यह एक सम्मेलन है?


22

यदि मैं विम खोलता हूं और टाइप करता itest<Esc>:wqहूं तो मुझे एक फाइल मिलती है जिसमें विम की कोई नई कहानी नहीं है , लेकिन लगता है कि कोड में एक नई पंक्ति है:

$ vim -u NONE test.txt
$ cat test.txt | hd
00000000  74 65 73 74 0a                    |test.|
00000005

यदि मैं विम खोलता हूं और टाइप करता itest<Return><Esc>:wqहूं तो मुझे एक फाइल मिलती है जिसमें विम में एक न्यूलाइन होता है लेकिन कोड में दो न्यूलाइन होते हैं:

$ rm test.txt
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000  74 65 73 74 0a 0a                 |test..|
00000006

ध्यान दें कि मैं विम खोल रहा हूं -u NONEताकि कोई स्थानीय कॉन्फ़िगरेशन का उपयोग न हो। ध्यान दें कि यह मेरा पिछले प्रश्न से संबंधित हो सकता है ।

यह मेरी प्रणाली की जानकारी है:

$ uname -a
Linux awsAlpha 3.2.0-60-virtual #91-Ubuntu SMP Wed Feb 19 04:13:28 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled May  4 2012 04:25:35)
Included patches: 1-429
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@

मैं इस प्रणाली पर भी ठीक उसी व्यवहार की पुष्टि कर सकता हूं:

$ uname -a
Linux bruno 3.5.0-48-generic #72-Ubuntu SMP Mon Mar 10 23:18:29 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Oct 26 2012 16:45:33)
Included patches: 1-547
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@

विम एक नई पंक्ति क्यों जोड़ रहा है? क्या यह एक सम्मेलन है?

यहाँ hdUbuntu सर्वर पर स्थापित कमांड के बारे में कुछ स्पष्टीकरण दिया गया है :

$ man hd | head -4
HEXDUMP(1)            BSD General Commands Manual            HEXDUMP(1)

NAME
     hexdump, hd — ASCII, decimal, hexadecimal, octal dump

8
यह एक सम्मेलन लगता है। यहां बताया गया है कि यह कैसे निष्क्रिय करने के लिए अगर आप चाहते हैं। ये रहा इसका इतिहास।
jliv902

जवाबों:


28

यूनिक्स पाठ फ़ाइलों के लिए कन्वेंशन यह है कि हर लाइन एक नई लाइन द्वारा समाप्त की जाती है, और यह कि नई लाइन लाइन टर्मिनेटर हैं, न कि विभाजक।

जब विम एक बफर को फाइल के रूप में सहेजता है, तो यह हर लाइन को उस फाइल फॉर्मेट के लिए एंड-ऑफ-लाइन अनुक्रम के साथ समाप्त करता है, जो यूनिक्स के लिए एक नई लाइन है। देख

:help 'fileformat'

यदि आप यूनिक्स टेक्स्ट-प्रोसेसिंग टूल का उपयोग कर रहे हैं, तो इस सम्मेलन के साथ रहना सबसे अच्छा है। हालाँकि, यदि आपको किसी फ़ाइल की अंतिम पंक्ति के अंत में एक नई पंक्ति नहीं डालनी है, तो आप ऐसा कर सकते हैं। विम ऐसी फाइलों को "बाइनरी" मानते हैं। देख

:help 'binary'
:help edit-binary

1
ओह दिलचस्प है। तो इसके अलावा प्रसिद्ध \ r \ n बनाम \ n। विंडोज लाइन सेपरेटर का उपयोग करता है और यूनिक्स लाइन टर्मिनेटर का उपयोग करता है? और क्या यह कहीं भी प्रलेखित है? मुझे पता है कि यह यहाँ निश्चित रूप से यूनिक्स पर लागू होता है "आईएसओ / आईईसी 9899: 2011, धारा .27.21.2 धाराएं कहती हैं: एक पाठ धारा एक वर्णों का एक क्रमबद्ध क्रम है जो लाइनों में बना है, प्रत्येक पंक्ति जिसमें शून्य या अधिक वर्ण शामिल हैं और एक समाप्ति नया है -लाइन वर्ण "
बार्लॉप

लेकिन यह कहाँ प्रलेखित है कि विंडोज़ एक लाइन विभाजक का उपयोग करती है?
बार्लॉप

2

विम कुछ भी नहीं जोड़ रहा है जिसे आपने खुद नहीं डाला है।

ए 'न्यू लाइन "चरित्र है नहीं एक" नई लाइन "और दोनों उदाहरण पूरी तरह से सामान्य हैं:

  • पहले एक में, फ़ाइल में केवल एक पंक्ति होती है ताकि आपको एक "न्यूलाइन" वर्ण मिल जाए,
  • दूसरे एक में, फ़ाइल में दो लाइनें हैं ताकि आपको दो "न्यूलाइन" अक्षर मिलें।

2
यह न्यूलाइन जोड़ता है। इसका परीक्षण इस प्रकार करें: printf "\x41" > /tmp/test.txtफिर जांचें कि इसमें केवल 'ए' अक्षर है xxd /tmp/test.txt। अब vim /tmp/test.txt<ENTER>:wq। फ़ाइल को दो बाइट्स देखने के लिए फिर से जांचें: 'A \ n'।
रुस्लान

लाइनें एक नए वर्ण के साथ समाप्त होती हैं। आपके पास एक पंक्ति है और इस प्रकार आपके पास एक नई रेखा है।
रोमेल

खैर, printfयहाँ के बाद मेरे पास कोई अच्छी तरह से बनाई गई "लाइनें" नहीं थीं। विम के बाद मेरे पास एक है। तो, यह कुछ है कि मैं वहाँ नहीं जोड़ा गया है।
रुसलान

क्या आप printfएक पंक्ति जब तक आप संलग्न नहीं है \n। एक पाठ संपादक होने के नाते, विम डिफ़ॉल्ट रूप से लाइनों के साथ काम करता है, और फ़ाइल में आपके द्वारा डाला गया कोई भी पाठ बहुत कम से कम, एक पंक्ति में है, जब तक कि आप स्पष्ट रूप से विम को ऐसा न करने के लिए कहें।
रोमेनिल

2

अनधिकृत पाठ फ़ाइलें कई कारणों से खराब हैं; यहाँ एक है जिसे मैंने अभी तक उल्लेख नहीं किया है:

एक काल्पनिक दुनिया में जहां एक अनुगामी नई रेखा के बिना पाठ फ़ाइलें स्वीकार्य हैं, 0 पंक्ति वाली फ़ाइल और 1 रिक्त पंक्ति वाली फ़ाइल के बीच कोई अंतर नहीं होगा। वे दोनों को 0-बाइट फ़ाइल द्वारा दर्शाया जाएगा।

एक फ़ाइल में कितनी लाइनें हैं, यह तय करने में असमर्थता।


गैर-यूनिक्स प्रणालियों में पाठ फ़ाइलों में शून्य या अधिक पूर्ण रेखाएँ होती हैं, साथ ही शून्य या अधिक वर्णों की अधूरी रेखा होती है। एक खाली फ़ाइल में एक रिक्त रेखा नहीं होती है; इसमें शून्य पूर्ण रेखाएँ और शून्य वर्णों की एक आंशिक रेखा समाहित है। अस्पष्टता कहाँ है?
सुपरकाट

यह "आंशिक रेखा" एक अप्रिय अवधारणा है। आप एक कहीं भी फ़ाइल के अंत के अलावा अन्य नहीं हो सकता है, और आप किसी ऐसी फ़ाइल नहीं बना सकते नहीं करता है एक "आंशिक लाइन" है। यह फ़ाइल संघनन के लिए और अधिक टूटना जोड़ता है - भले ही आप फ़ाइलों के बीच एक नई पंक्ति सम्मिलित करते हैं जो आपके पास कुछ ऐसी चीज़ों के साथ होती है जो मूल रूप से फ़ाइलों की मूल जोड़ी के बराबर नहीं है (क्योंकि 2 फ़ाइलों के साथ आपके पास 2 आंशिक लाइनें थीं, और उनमें से एक कुछ बन गई थी अलग।) एक अनमोल प्रस्ताव।

तथ्य यह है कि समवर्ती फाइलें पहली फ़ाइल के अंत में किसी भी आंशिक रेखा का कारण बनेंगी आमतौर पर उन मामलों में icky होती है जहां दोनों फ़ाइलों में पूर्ण लाइनें होती हैं (यह कभी-कभी उन फ़ाइलों को संक्षिप्त करने के लिए उपयोगी हो सकती हैं जिनमें पूरी तरह से पूर्ण लाइनें नहीं होती हैं ), पर अब जो है वो है। यूनिक्स आंशिक लाइनों के साथ समाप्त होने वाली पाठ फ़ाइलों के निर्माण के लिए मना नहीं करता है, और मेरा मानना ​​है कि ऐसी फ़ाइलों को संक्षिप्त करना MSDOS के रूप में व्यवहार करेगा। मुझे लगता है कि अंतर यह है कि कई डॉस आधारित संपादकों ने ऐतिहासिक रूप से यह विचार किया है कि फ़ाइल को लोड करने और तुरंत सहेजने से एक नई फ़ाइल मिलनी चाहिए ...
सुपरकैट

... जो पुराने वाले के समान है - पीसी-राइट के शुरुआती संस्करणों के पंजीकृत उपयोगकर्ता को निर्देश दिया गया था कि वे इसका उपयोग निष्पादन योग्य की एक प्रति खोलने, अधिलेखित मोड पर स्विच करने, एक निश्चित स्ट्रिंग खोजने और इसे अपने स्थान से बदलने के लिए करें। क्रमांक!)। जब उन्हें बचाने के लिए फाइलों को मजबूर करने के लिए मजबूर होना पड़ता है, तो वे नई सुर्खियों में आ जाते हैं।
सुपरकैट

2

विम 8.0 अब इस fixeolविकल्प के साथ प्रदान करता है। विशेष रूप से यदि आप करते हैं:

:set nofixeol

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

कि एक filetype प्लगइन में जा सकता है, या संभवतः भी अपने .vimrc

(यह एक सुधार है :set binaryक्योंकि यह केवल अंतिम लाइन-ब्रेक चरित्र को प्रभावित करता है, जबकि binaryअन्य व्यवहारों का एक गुच्छा भी बदलता है, जो आप तब तक नहीं चाहते जब तक कि आप वास्तव में एक बाइनरी फ़ाइल को संपादित नहीं कर रहे हों।)

एक नई बनाई गई फ़ाइल में अभी भी डिफ़ॉल्ट रूप से एक अनुगामी लाइन-ब्रेक चरित्र होगा। आप इसे बदल सकते हैं (और एक फ़ाइल को स्विच कर सकते हैं जिसमें पहले से ही एक अंतिम नईलाइन है, जिसमें एक भी नहीं है) इसके अतिरिक्त:

:set noeol

इसे विशेष रूप से उस प्रत्येक फ़ाइल के लिए सेट करना होगा जिसे आप बदलना चाहते हैं: किसी फ़ाइल को बफर में लोड करना हमेशा eolफ़ाइल की वर्तमान स्थिति से मेल खाने के लिए सेट होगा ।


1

'J' कमांड का उपयोग करके आप सभी लाइनों को एक में मिला सकते हैं।

यदि आप भी अंतिम पंक्ति पर LF या CRLF को निकालना चाहते हैं तो vi में निम्न कार्य करें।

$ vi file
:set binary
:set noeol
:w!
:f          look for [noeol] on the status line
:q
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.