2008-10-27 8 views
49

में फ़ाइल से लाइनों की रेंज को कैसे पढ़ा जाए, मैं वर्तमान fffer में फ़ाइल foo.c से लाइन n1-> n2 को पढ़ना चाहता हूं।vim - वर्तमान बफर

मैंने कोशिश की: 147,227r /path/to/foo/foo.c

लेकिन मैं मिलता है: "E16: अमान्य रेंज", हालांकि मैं कुछ कर रहा हूँ कि foo.c 1000 से अधिक पंक्तियां हैं।

उत्तर

74
:r! sed -n 147,227p /path/to/foo/foo.c 
+0

किसी भी मौके पर आप एक फ़ाइल से दूसरे में चिपकाने में सक्षम, tmux में एकाधिक vim के लिए एक प्रतिलिपि/पेस्ट मैक्रो बनाने का तरीका जानते हैं? – serup

+0

मैंने ऊपर की कोशिश की, हालांकि 217 लाइनों को पढ़ने की कोशिश करते समय, आखिरी 18 लाइनें विम में सम्मिलन बिंदु के सामने चारों ओर बदल गईं - क्या आपको पता है कि ऐसा क्यों हो सकता है? क्या 200 लाइनों तक पहुंचने पर चारों ओर एक लपेटा है? – serup

17

{रेंज} वर्तमान फ़ाइल में गंतव्य को संदर्भित करता है, न कि स्रोत फ़ाइल में रेखाओं की सीमा।

कुछ प्रयोग करने के बाद, ऐसा लगता है

:147,227r /path/to/foo/foo.c 

मतलब है इस फ़ाइल में लाइन 227 के बाद /path/to/foo/foo.c की सामग्री सम्मिलित। अर्थात्: यह 147.

2

आप की आवश्यकता होगी पर ध्यान नहीं देता:

:r /path/to/foo/foo.c 
:d 228,$ 
:d 1,146 

तीन कदम है, लेकिन यह यह किया हो जाएगी ...

+4

यह इतना टाइपिंग है, क्षमा करें :) –

+3

कोई अच्छा समाधान नहीं - sed समाधान से तुलना नहीं की गई। –

2

एक सीमा एक कमांड परमिट वर्तमान बफर में लाइनों के समूह पर लागू किया जाना है।

तो, पढ़ने के निर्देश की सीमा का मतलब है कि वर्तमान फ़ाइल में सामग्री को कहां डालना है, लेकिन फ़ाइल की सीमा नहीं जिसे आप पढ़ना चाहते हैं।

1

मैं सिर्फ मेरा एक कोड परियोजना में यह करने के लिए था और यह इस तरह से किया था: /path/to/foo/foo.c खुला साथ

बफर में:

:

:147,227w export.txt 

बफर में मैं के साथ काम कर रहा हूँ

:r export.txt 

मेरी पुस्तक में बहुत आसान है ... इसमें दोनों फाइलें खोलने की आवश्यकता है, लेकिन यदि मैं लाइनों का एक सेट आयात कर रहा हूं, तो आमतौर पर मैं उन्हें दोनों को खोलता हूं। यह विधि मेरे लिए याद रखने के लिए अधिक सामान्य और आसान है, खासकर यदि मैं g/<search_criteria/:.w >> export.txt का उपयोग करके लाइनों के एक ट्रिकियर सेट को निर्यात/आयात करने की कोशिश कर रहा हूं या लाइनों का चयन करने का कुछ और जटिल तरीका है।

+0

यह सवाल पूछता है - यदि आपके पास फ़ाइल खुली है और आप सीमा को इनपुट करने जा रहे हैं, तो क्यों न केवल उस सीमा को यंक करें और इसे लक्षित बफर में क्यों डालें? –

19

आप शुद्ध Vimscript में कर सकते हैं, जैसे किसी बाहरी उपकरण का उपयोग किए बिना sed:

:put =readfile('/path/to/foo/foo.c')[146:226] 

ध्यान दें कि हम लाइन नंबर से एक घटती क्योंकि सरणियों 0 से शुरू करते हुए लाइन नंबर शुरू करनी चाहिए 1.

नुकसान: यह समाधान स्वीकृत उत्तर से 7 वर्ण लंबा है, और यह अस्थायी रूप से अन्य फ़ाइल के आकार के सापेक्ष स्मृति का उपभोग करेगा।

+0

ओपी द्वारा प्रस्तावित एक के समान वाक्यविन्यास के साथ, इसे एक आरामदायक vim कमांड में बदलने का कोई तरीका नहीं है? जैसे : '147,227ri /path/to/foo/foo.c '(पढ़ने के लिए नोटिस' ri ') –

+0

हाँ आप निश्चित रूप से ऐसा कर सकते हैं। हालांकि उपयोगकर्ता द्वारा बनाए गए आदेशों को पूंजी पत्र से शुरू होना चाहिए, इसलिए आपकी 'ri' को 'Ri' या' RI 'होना आवश्यक होगा। – joeytwiddle

+0

यह $ HOME निर्देशिका के लिए tilde '~ /' का उपयोग करते समय काम नहीं करता है, उदाहरण के लिए: 'readfile ("~/दस्तावेज़/something.txt")' e484 में परिणाम: 'फ़ाइल नहीं खोल सकता' ~/दस्तावेज़/something.txt'। – f1lt3r

1

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

:r !head -20 xyz.xml 

वर्तमान बफर में xyz.xml से पहले 20 लाइनों को पढ़ने जाएगा जहां कर्सर है

:r !tail -10 xyz.xml 

वर्तमान बफर में xyz.xml से पिछले 10 लाइनों को पढ़ने जाएगा जहां कर्सर

है

सिर और पूंछ के आदेश बेहद तेज़ हैं, इसलिए उन्हें भी संयोजित करना बहुत बड़ी फ़ाइलों के लिए अन्य दृष्टिकोणों की तुलना में बहुत तेज़ हो सकता है।

:r !head -700030 xyz.xml| tail -30 

वर्तमान बफर

इस आपरेशन में फ़ाइल xyz.xml से 700000 से 700,030 करने के लिए लाइन नंबर पढ़ा भी काफी बड़ी फ़ाइलों के लिए तुरन्त पूरा करना चाहिए होगा।