फ़ाइल के अंत में वीआईएम स्वचालित न्यूलाइन अक्षम करें


251

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

अगर किसी को इस बारे में पता है, तो यह बहुत अच्छा होगा!


23
आपको उन्हें बताना चाहिए कि वे मूर्ख हैं - वास्तव में एक अच्छा कारण है कि विम ऐसा क्यों करता है: stackoverflow.com/questions/729692-… । मुझे लगता है कि यह केवल तभी प्रासंगिक है जब आप यूनिक्स जैसे सर्वरों पर तैनात हों।
hdgarrood

5
आधिकारिक PHP अनुशंसित अभ्यास ?>सिर्फ इस कारण से अंतिम समापन टैग को छोड़ना है ।
सेबेस्टियन ग्रिग्नोली

यह सवाल शायद सुपरसुसर को दर्शाता है ... लेकिन यह होना चाहिए।
जीसीबी

20
सवाल वास्तव में होना चाहिए: कैसे हम अन्य संपादकों के सभी कि अपने दुकान में लोगों को सुनिश्चित करने के लिए फ़ाइल की अंतिम पंक्ति का उपयोग कर रहे बताऊँ करता है एक EOL के साथ अंत। ;-)
टीजे क्राउडर

जवाबों:


361

और vim7.4+ के लिए आप उपयोग कर सकते हैं (अधिमानतः अपने .vimrc पर) (समाचार के उस अंतिम बिट के लिए that के लिए धन्यवाद!):

:set nofixendofline

के पुराने संस्करणों के बारे में अब vim

भले ही फ़ाइल अंत में नई लाइनों के साथ पहले से ही सेव थी:

vim -b file और एक बार विम में:

:set noeol
:wq

किया हुआ।

वैकल्पिक रूप से आप फ़ाइलों को vim के साथ खोल सकते हैं :e ++bin file

फिर भी एक और विकल्प:

:set binary
:set noeol
:wq

6
आप यह भी जोड़ सकते हैं set binaryऔर set noeolअपने .vimrc में
dryobs

17
खबरदार : binaryओवरराइड expandtab, जो आपको अपने स्रोत में शाब्दिक टैब प्राप्त करने के लिए प्रेरित करेगा।
सिरो सेंटिल्ली 郝海东 冠状 iro 事件 法轮功 '

4
@CiroSantilli धन्यवाद! मैं हमेशा के लिए बाइनरी के साइड इफेक्ट्स की तलाश कर रहा हूं और सोच रहा हूं कि यह डिफ़ॉल्ट क्यों नहीं है! चूंकि मुझे अपने टैब से प्यार है, मुझे लगता है कि मैं उस अतिरिक्त लाभ पर विचार करूंगा :)
gcb

11
अब आप set nofixendoflineVim 7.4+ में समस्या हल करने के लिए जोड़ सकते हैं
罗泽轩

1
@TrevorBoydSmith हाँ, क्योंकि ऐतिहासिक रूप से POSIX (मैं वास्तविक मानक पर गलत हो सकता है) एक पाठ फ़ाइल में एक पंक्ति के अंत में एक नई पंक्ति की अपेक्षा करता हूं। इसलिए अधिकांश समाधानों को एक द्विआधारी के रूप में मानना ​​आवश्यक है। यह शायद तब बहुत सुविधाजनक था, और यह आज पिछड़ा हुआ है, इसीलिए अब सुविधाजनक सेटिंग है। बस इसे अपने vimrc में जोड़ें। अन्य संपादकों में वैसे भी बदतर समस्याएं हैं :)
gcb

23

निम्न-पंक्ति विकल्प को चालू करने के लिए अपने .vimrc में निम्न कमांड जोड़ें:

autocmd FileType php setlocal noeol binary fileformat=dos

हालाँकि , PHP स्वयं उस अंतिम छोर की उपेक्षा करेगा - यह कोई समस्या नहीं होनी चाहिए। मैं लगभग निश्चित हूं कि आपके मामले में कुछ और है जो अंतिम न्यूलाइन वर्ण को जोड़ रहा है, या संभवतः विंडोज़ / यूनिक्स लाइन के अंत प्रकारों के साथ एक मिश्रण है ( \nया\r\n , आदि) के ।

अपडेट करें:

एक वैकल्पिक समाधान सिर्फ इस लाइन को अपने .vimrc में जोड़ने का हो सकता है:

set fileformats+=dos

मुझे पता है कि php इसे गलत नहीं ठहरा रहा है ... मैंने अपने सहकर्मियों को दिखाया है, लेकिन winmerge उन्हें अलग-अलग होने के रूप में देखता है ... मैं कोशिश करूँगा और आपको बताऊंगा कि यह कैसे होता है।
बूसले

ऐसा करने से अंतिम पंक्ति का वांछित प्रभाव पड़ता है, लेकिन यह फ़ाइल को यूनिक्स लाइन के अंत में भी परिवर्तित करता है ... (यहां तक ​​कि एक विंडोज़ बॉक्स पर भी) ... तो मैंने ऐसा पहले बाइनरी मोड में स्विच करके किया था ... लेकिन फिर लाइन एंडिंग नोटपैड में नहीं दिखाते हैं ... सब कुछ सिर्फ एक लाइन है।
बूसले

दुर्भाग्य से उन सुझावों में से कोई भी काम नहीं करता है। फाइलफॉर्मैट = डॉस को ऑटोकैड में जोड़ने से कोई प्रभाव नहीं पड़ता है, और फिल्टाइप टाइप किया जाता है + = डॉस अभी भी ट्रेलिंग \ n
बूसले

क्षमा करें, मुझे वह गलत लगा, 'सेट फाइलपेट्स + = डॉस' का प्रयोग करें, न कि 'फाइलफॉर्मेट्स सेट ...'
बहुत ज्यादा php

17

यदि आप स्रोत नियंत्रण के लिए Git का उपयोग कर रहे हैं, तो इस से संपर्क करने का एक और तरीका है। यहाँ एक उत्तर से प्रेरित होकर , मैंने एक गिट्टुवेनज में उपयोग के लिए अपना फ़िल्टर लिखा फ़ाइल ।

इस फ़िल्टर को स्थापित करने के लिए, इसे noeol_filterअपने रूप में कहीं पर सहेजें $PATH, इसे निष्पादन योग्य बनाएं, और निम्न कमांड चलाएं:

git config --global filter.noeol.clean noeol_filter
git config --global filter.noeol.smudge cat

केवल अपने लिए फ़िल्टर का उपयोग शुरू करने के लिए, निम्नलिखित पंक्ति को अपने में रखें $GIT_DIR/info/attributes:

*.php filter=noeol

यह सुनिश्चित करेगा कि आप ईओएफ पर कोई भी नया काम नहीं करेंगे .php फ़ाइल , इससे कोई फर्क नहीं पड़ता कि विम क्या करता है।

और अब, स्क्रिप्ट ही:

#!/usr/bin/python

# a filter that strips newline from last line of its stdin
# if the last line is empty, leave it as-is, to make the operation idempotent
# inspired by: /programming/1654021/how-can-i-delete-a-newline-if-it-is-the-last-character-in-a-file/1663283#1663283

import sys

if __name__ == '__main__':
    try:
        pline = sys.stdin.next()
    except StopIteration:
        # no input, nothing to do
        sys.exit(0)

    # spit out all but the last line
    for line in sys.stdin:
        sys.stdout.write(pline)
        pline = line

    # strip newline from last line before spitting it out
    if len(pline) > 2 and pline.endswith("\r\n"):
        sys.stdout.write(pline[:-2])
    elif len(pline) > 1 and pline.endswith("\n"):
        sys.stdout.write(pline[:-1])
    else:
        sys.stdout.write(pline)

यह एक महान समाधान है ... हालांकि दुर्भाग्य से मैं गिट का उपयोग नहीं कर रहा था। मैं svn का उपयोग कर रहा था, हालांकि मुझे संदेह है कि एक समान दृष्टिकोण लिया जा सकता था। वैसे भी, मैं उस स्थिति से आगे बढ़ गया हूं और अब इस बारे में चिंता करने की जरूरत नहीं है :)
Boushley

12

मैंने इस विकल्प की कोशिश नहीं की है, लेकिन निम्नलिखित जानकारी विम हेल्प सिस्टम (अर्थात ईओल) में दी गई है:

'endofline' 'eol'   boolean (default on)
            local to buffer
            {not in Vi}

When writing a file and this option is off and the 'binary' option
is on, no <EOL> will be written for the last line in the file.  This
option is automatically set when starting to edit a new file, unless
the file does not have an <EOL> for the last line in the file, in
which case it is reset.  

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

आपको पिछले प्रश्न के उत्तर में भी रुचि हो सकती है: " फाइल को एक नई पंक्ति के साथ क्यों समाप्त होना चाहिए "।


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

3
विम मदद यह भी कहती है, "जब 'बाइनरी' ऑफ हो तो वैल्यू का इस्तेमाल फाइल लिखते समय नहीं किया जाता है।" के बारे में eol
Boushley

1
उस सवाल पर वॉनसी के जवाब के लिए +1, जो इस बात पर प्रकाश डालता है कि "न्यूलाइन" और ईओएल को जब्त किया जा रहा है। गलत संपादकों ने एक ईओएल के कारण गलत तरीके से एक अतिरिक्त न्यूलाइन प्रदर्शित किया , विम एक "न्यूलाइन" नहीं जोड़ रहा है!
चेस

9

मैं एक समान (हालांकि अलग) समस्या के लिए विम विकी पर एक टिप जोड़ दिया है:

http://vim.wikia.com/wiki/Do_not_auto-add_a_newline_at_EOF


5
“विम 7.4.785 fixeolविकल्प को जोड़ता है जिसे फ़ाइल के अंत में किसी भी लापता ईओएल को स्वचालित रूप से संरक्षित करने के लिए अक्षम किया जा सकता है। यह स्क्रिप्ट विम 7.4.785 और बाद के लिए अनैतिक हो गई है। ” (स्रोत: वही विकी पेज।) धन्यवाद, मुझे उस नए विकल्प की जानकारी नहीं थी।
आमिर

1
मुझे दोनों को सेट करना था noeolऔर nofixeolवांछनीय परिणाम प्राप्त करना था।
2126 पर selurvedu

8

ठीक है, आप विंडोज पर चीजों को जटिल कर रहे हैं;)

जैसा कि 'बाइनरी' विकल्प 'फाइलफॉर्मैट' विकल्प को रीसेट करता है (और 'बाइनरी' सेट के साथ लिखना हमेशा यूनिक्स लाइन एंडिंग के साथ लिखता है), चलो बड़ा हथौड़ा निकालते हैं और इसे बाहरी रूप से करते हैं!

कैसे BufWritePost घटना के लिए एक autocommand (: autocommand मदद) को परिभाषित करने के बारे में? इस ऑटोकॉमैंड को हर बार जब आप एक पूरा बफर लिखते हैं, तब निष्पादित किया जाता है। इस ऑटोकॉमैंड में एक छोटे से बाहरी उपकरण (php, perl या जो भी स्क्रिप्ट) कहते हैं, वह सिर्फ लिखित फाइल के अंतिम न्यूलाइन को स्ट्रिप्स करता है।

तो यह कुछ इस तरह दिखेगा और आपकी .vimrc फ़ाइल में जाएगा:

autocmd!   "Remove all autocmds (for current group), see below"
autocmd BufWritePost *.php !your-script <afile>

यदि यह आपका पहली बार ऑटोकॉमैंड्स के साथ काम कर रहा है, तो ऑटोकेमैंड्स के बारे में पूरे विम दस्तावेज़ को पढ़ना सुनिश्चित करें। कुछ कैविएट हैं, उदाहरण के लिए यह आपके .vimrc में आपके सभी। को हटाने की सिफारिश की जाती है।


खैर ... मैं उम्मीद कर रहा था कि इससे बेहतर समाधान था ... लेकिन यह निश्चित रूप से काम करता है!
बूसली

3
यह महान काम करता है! वाह! हालाँकि, मेरा एक सवाल है ... क्या इसे बनाने का कोई तरीका है ताकि मुझे प्रत्येक सेव के बाद दो बार एंट्री न मारनी पड़े। मुझे cmd विंडो में एंटर करना है जो पॉप अप हुआ है और फिर दोबारा क्योंकि विम मुझे बता रहा है कि स्क्रिप्ट सफल हुई है ... किसी भी तरह से उन सभी को दूर करने के लिए?
बूसली

2
से बचने के लिए <Enter> केवल कमांड के साथ उपसर्ग का संकेत देता है silent। जैसे silent !your-script <afile>
डैश-टॉम-बैंग

6

मैंने पर्ल और पायथन पोस्ट-प्रोसेसिंग के साथ ब्लिक्सटर के सुझावों को लागू किया है, या तो विम के अंदर चल रहा है (यदि यह ऐसी भाषा समर्थन के साथ संकलित है), या बाहरी पर्ल स्क्रिप्ट के माध्यम से। यह vim.org पर PreserveNoEOL प्लगइन के रूप में उपलब्ध है ।


मैंने इसका पूरी तरह से परीक्षण नहीं किया है, लेकिन यह एक बेहतर समाधान की तरह प्रतीत होता है।
बूसली

प्लगइन काम करता है, लेकिन स्थापना के बाद मुझे let g:PreserveNoEOL = 1अपनी .vimrcफ़ाइल में डालना पड़ा ! प्लगइन विवरण से पता लगाने के लिए vimscript सीखना था! : डी
डेर्थवेंजर

1
@DarthVanger: :help PreserveNoEOL-usageआपको भी बताया होगा। आरटीएफएम :-)
इनकैट करकट

@IngoKarkat ओह, क्षमा करें। इस के तहत लिए देख रहा था INSTALLATIONऔर CONFIGURATIONUSAGEविवरण में अनुभाग भी नहीं देखा , क्योंकि यह स्थापना के ऊपर है :)
डार्थवेंजर

3

शायद आप देख सकते हैं कि वे क्यों शिकायत कर रहे हैं। अगर एक php फ़ाइल के समाप्त होने के बाद एक नई लाइन है?>, Php इसे पृष्ठ के भाग के रूप में आउटपुट करेगा। यह एक समस्या नहीं है जब तक कि आप फ़ाइल शामिल होने के बाद हेडर भेजने की कोशिश न करें।

हालाँकि, php फ़ाइल के अंत में;> वैकल्पिक है। कोई अंत नहीं?>, फ़ाइल के अंत में एक नई पंक्ति के साथ कोई समस्या नहीं है।


2
आप सही हैं, लेकिन हमने एक दुकान के रूप में फैसला किया कि अंत होना बेहतर लगता है?> मुझे पता है कि हम इसका उपयोग करना बंद कर सकते हैं ... लेकिन मैं अपने संपादक को अपनी कोडिंग शैली को दूसरे तरीके से फिट करने के लिए समायोजित करना पसंद करता हूं।
बूसली

1
इसके अलावा, आप जानते हैं कि php आपके समाप्त होने वाले टैग को स्वचालित रूप से पार्स कर देगा?> या?> \ N (क्योंकि लिनक्स में सभी मान्य फ़ाइलों को \ n के साथ समाप्त होना चाहिए) ... इसलिए मेरा कोड इन समस्याओं का कारण नहीं बनता है ... उन्हें सिर्फ लुक पसंद नहीं है।
बॉशले

2

मैं .vrc में जोड़ता हूं

set binary

और यह मदद करता है, यह कोशिश करो


2

मुझे लगता है कि मुझे स्वीकृत उत्तर की तुलना में बेहतर समाधान मिल गया है। वैकल्पिक समाधान मेरे लिए काम नहीं कर रहे थे और मैं हर समय बाइनरी मोड में काम नहीं करना चाहता था। सौभाग्य से यह काम पाने के लिए लगता है और मुझे अभी तक कोई बुरा साइड-इफेक्ट नहीं हुआ है: पाठ फ़ाइलों के अंत में लापता एंड-ऑफ-लाइन को संरक्षित करना । मैंने अभी पूरी बात अपने ~ / .vimrc में जोड़ दी है।


1

क्या आपके लिए इन फाइलों को सहेजने के लिए एक विशेष कमांड का उपयोग करना संभव होगा?

यदि आप ऐसा करते हैं: बाइनरी सेट करें,: w और: सेट नॉबिनरी फ़ाइल को बिना किसी शुरुआत के लिखा नहीं जाएगा, तो न्यूलाइन के बिना लिखा जाएगा।

आदेशों का यह क्रम निश्चित रूप से उपयोगकर्ता परिभाषित कमांड या मैपिंग में डाला जा सकता है।


दुर्भाग्य से क्योंकि मैं विंडोज़ के साथ काम कर रहा हूं, अगर मैं इसे बाइनरी मोड में सहेजता हूं, तो यह सेव को यूनिक्स मोड में रहने के लिए मजबूर करता है। यहां तक ​​कि जब मैं करता हूं: बाइनरी सेट करें: फ़ाइलफॉर्मैट सेट करें = डॉस: डब्ल्यू: सेट नॉबिनरी एक बार जब मैंने छोड़ दिया, तो इसने फाइल को यूनिक्स प्रारूप में सहेजा ... मुझे विश्वास नहीं हो रहा है कि इसे बंद करने का कोई तरीका नहीं है।
बूसले


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