2010-01-15 13 views
13

क्या विम में सबसे लंबी लाइन की लंबाई निर्धारित करने के लिए कोई आदेश है? और फ़ाइल की शुरुआत में उस लंबाई को जोड़ने के लिए?विम में सबसे लंबी लाइन?

+2

यह विम में किया जाना चाहिए? मैं पूछता हूं क्योंकि यह करना एक विशिष्ट बात है, और यदि आप इसे कई फाइलों पर करने की ज़रूरत है तो यह संभवतः पाइथन/पर्ल/रूबी स्क्रिप्ट को एक साथ रखना मुश्किल होगा। – ZoogieZork

+0

यह आपकी वास्तविक समस्या के गलत समाधान के लिए पूछने जैसा लगता है। आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं? – soulmerge

+0

@ZoogieZork: कभी-कभी विम पर्याप्त है, और साथ ही सरल भी है, बाहरी उपकरणों का उपयोग करने की कोई आवश्यकता नहीं है। –

उत्तर

18

जीएनयू के डब्ल्यूसी कमांड में एल-एमएक्स-लाइन-लम्बाई विकल्प है जो फ़ाइल की अधिकतम रेखा लंबाई को प्रिंट करता है। gnu man wc देखें। फ्रीब्सड डब्ल्यूसी में भी -एल है, लेकिन नहीं - मैक्स-लाइन-लम्बाई, freebsd man wc देखें।

इन्हें विम से कैसे उपयोग करें? आदेश:

:%!wc -L 

wc -L के माध्यम से खुली फ़ाइल को फ़िल्टर करेगा और फ़ाइल की सामग्री को अधिकतम पंक्ति लंबाई बना देगा।

फ़ाइल सामग्री बनाए रखने के लिए और पहली पंक्ति पर अधिकतम लाइन की लंबाई रखूँ:

:%yank 
:%!wc -L 
:put 

इसके बजाय WC का उपयोग कर के, Find length of longest line - awk bash वर्णन करता है कि सबसे लंबे समय तक लाइन की लंबाई को खोजने के लिए awk उपयोग करने के लिए।

ठीक है, अब शुद्ध विम समाधान के लिए। मैं स्क्रिप्टिंग के लिए कुछ नया हूँ, लेकिन यहां जाता है। निम्नानुसार 0Lसे फ़िल्टरLongestLineLength फ़ंक्शन पर आधारित है।

function! PrependLongestLineLength () 
    let maxlength = 0 
    let linenumber = 1 
    while linenumber <= line("$") 
    exe ":".linenumber 
    let linelength = virtcol("$") 
    if maxlength < linelength 
     let maxlength = linelength 
    endif 
    let linenumber = linenumber+1 
    endwhile 

    exe ':0' 
    exe 'normal O' 
    exe 'normal 0C'.maxlength 
endfunction 

command PrependLongestLineLength call PrependLongestLineLength() 

इस कोड को एक .vim फ़ाइल (या अपने .vimrc) में रखें और: फ़ाइल को स्रोत दें। फिर नए कमांड का उपयोग करें:

:PrependLongestLineLength 

धन्यवाद, यह पता लगाना मजेदार था।

+1

मैं कुछ ऐसा था! Awk '{प्रिंट (लंबाई ($ 0))}' stacker

+0

भले ही जोनाथन (प्री-विम -7) समाधान थोड़ा जटिल है, फिर भी वह 'virtcol()' का उपयोग करने में सही है, टैबलेट को '1' के रूप में नहीं गिना जाएगा। मुझे डर है कि wc, awk, perl, आदि के आधार पर अन्य सभी समाधान सही उत्तरों नहीं देंगे। –

5

आप विस्तार tabulations के साथ काम करते हैं, तो एक सरल

:0put=max(map(getline(1,'$'), 'len(v:val)')) 

पर्याप्त है।

अन्यथा, मुझे लगता है कि हम निम्न (आप :h virtcol() में पिछले उदाहरण के रूप में मिल सकता है कि, शून्य -1) की आवश्यकता होगी:

0put=max(map(range(1, line('$')), "virtcol([v:val, '$'])-1")) 
+0

मैं उस पंक्ति को "सरल" नहीं कहूंगा। हालांकि यह काम करता है, इसलिए कोई शिकायत नहीं है। – sleske

2

: WC एल%
बजाय
:%! wc -L

फ़ाइल की शुरुआत में उस लंबाई को जोड़ने के लिए:
: 0r! wc -L% | कट-डी '' -एफ 1

+0

'%! Wc -L' का लाभ यह है कि यह सहेजे गए या अज्ञात बफर पर काम करता है। – wchargin

संबंधित मुद्दे