मैं फ़ाइल के एक हिस्से में शब्दों को कैसे गिनता हूं, बिना विम को छोड़े?


10

मेरे पास पाठ से भरी एक फ़ाइल है (मार्कडाउन या LaTeX कहते हैं)। मैं इस फाइल के एक हिस्से में शब्दों की संख्या गिनना चाहूंगा।

मुझे पता है कि मैं :! wc -w %वर्तमान बफर पर wc -w चलाने के लिए कर सकता हूं । और मुझे पता है कि मैं ब्याज की धारा को एक नामांकित रजिस्टर में डाल सकता हूं। मैं अनुमान लगा रहा हूं कि कमांड या पाइप में उपयोग के लिए ऑपरेटिंग सिस्टम को नामांकित रजिस्टर भेजने का एक तरीका है, लेकिन मैं एक खोजने में सक्षम नहीं हूं। या एक रजिस्टर में शब्दों को गिनने का बेहतर तरीका है?

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

जवाबों:


16

आप उपयोग कर सकते हैं gCTRL+g, जो आपको देगा:

Col 1 of 118-121; Line 1 of 5; Word 1 of 142; Byte 1 of 678

आप इसे दृश्य मोड से भी उपयोग कर सकते हैं, यदि आप केवल चयन के लिए शब्द गणना प्राप्त करना चाहते हैं, जो विशेष रूप से पाठ वस्तुओं जैसे संयुक्त के साथ उपयोगी है ip। (उदाहरण के लिए आप vipg<C-g>वर्तमान पैराग्राफ की शब्द गणना प्राप्त करने के लिए उपयोग कर सकते हैं )।

देखें: :help word-countऔर :help text-objects


उपरोक्त विकल्प शायद बेहतर है, लेकिन आप wcकिसी अनुभाग में शब्दों की संख्या की गणना करने के लिए उपयोगिता का उपयोग भी कर सकते हैं । :! wc -w %आपके द्वारा उपयोग किए जाने वाले फॉर्म के अलावा , आप भी उपयोग कर सकते हैं :%!wc -w। यह एक गति को शेल टूल (इस मामले में %, संपूर्ण बफर) को फ़िल्टर करेगा , लेकिन आप अन्य श्रेणियों (जैसे :1,5!wc -wकि पहले 5 लाइनों के !,+5!wc -wलिए, वर्तमान और अगली 5 लाइनों के लिए, आदि) का उपयोग कर सकते हैं। आप दृश्य मोड में पाठ का चयन भी कर सकते हैं, और :!wc -wअपने चयन को फ़िल्टर करने के लिए टाइप कर सकते हैं।

ध्यान दें कि यह गति को शेल टूल के आउटपुट से बदल देगा, लेकिन आप इसे uपूर्ववत कर सकते हैं ।

देखें :help :range!, :help rangeऔर यह उत्तर जहां मैं श्रेणियों के अधिक उदाहरण देता हूं।


मुझे खोज के दौरान ऐसा कुछ मिला था, लेकिन याद आया कि पहला जी गिनती कमांड का हिस्सा है, न कि कोई स्थान निर्दिष्ट करने वाला। यह समाधान अब समझ में आता है। मुझे स्पष्ट रूप से विजुअल मोड पर भी पढ़ना चाहिए; मैं अक्सर इसका इस्तेमाल नहीं करता।
कॉलिन मैकफॉल

1
मुझे इस बात का कोई अंदाजा नहीं था कि आप g<C-g>उस तरीके का इस्तेमाल कर सकते हैं । बहुत बढ़िया!
एवरग्रीनट्री

3

यह दो तरह से पूरा किया जा सकता है, विशुद्ध रूप से रास्ता और wcतरीका।

शुद्ध विम रास्ता

ऐसा करने के लिए आप खोज का उपयोग कर सकते हैं और कमांड को बदल सकते हैं। उदाहरण के लिए:

:%s/\<\w\{-}\>//gn

यह किसी चीज़ के साथ दिए गए पैटर्न को बदलने के बजाय क्या करता है, यह सिर्फ पैटर्न की घटनाओं को गिनता है। इसकी वजह है nझंडा। शब्दों को एक विशिष्ट खंड में गिनने के लिए (इस स्थिति में 5 को 15 के माध्यम से), आप कुछ इस तरह से कर सकते हैं:

:5,15s/\<\w\{-}\>//gn

यह एक चयन की सामग्री को एक रजिस्टर में जमा करने की आवश्यकता को हटा देता है। इसके स्थान पर क्या किया जा सकता है 5-15, इसके लिए अधिक संभावनाएं देखने के लिए , सहायता विषय पढ़ें cmdline-ranges। यदि आप अक्सर ऐसा करना चाहते हैं, तो संभवतः इसके लिए मैपिंग (या कमांड) बनाना अच्छा है। इसके अलावा, यदि आपने hlsearchसक्षम किया है, तो आप :nohlsearchहाइलाइटिंग को खाली करने के लिए बाद में चलाना चाह सकते हैं ।

जिस wcतरह से

एक ही चीज से पूरा किया जा सकता है wc। उसी तरह से आप कमांड के cmdline-rangesसाथ क्षेत्र का चयन करने के लिए उपयोग कर सकते हैं :s, आप बाहरी कमांड के साथ उनका उपयोग कर सकते हैं। उदाहरण के लिए:

:5,15!wc -w

यह wcकमांड के माध्यम से 15 के माध्यम से 5 लाइनों को चलाता है । इसका नकारात्मक पक्ष यह है कि यह कमांड के आउटपुट के साथ लाइनों की उस श्रेणी को बदल देता है। आप दबाकर इस परिवर्तन को पूर्ववत कर सकते हैं u। यह भी ध्यान दें कि विम्सस्क्रिप्ट समाधान विभिन्न भाषाओं के साथ काम नहीं कर सकता है, क्योंकि \wयह मेल नहीं खाता है कि सामान्य रूप से अन्य भाषाओं में शब्द वर्ण क्या होंगे। wcइससे बेहतर कर सकते हैं \w। इसके अलावा, यहाँ यह करने के लिए इसे तेज करने के लिए एक फैंसी कमांड है:

command -range=% -addr=lines WordCount execute '<count>!wc -w' | .y a | undo | echo @a

ध्यान दें कि यह aरजिस्टर को देखता है ।

ध्यान दें

ऐसा प्रतीत होता है कि यह g<C-g>कुंजी संयोजन के साथ दृश्य मोड में भी पूरा किया जा सकता है । इस की व्याख्या के लिए कार्पेटस्मोकर का जवाब देखें।


इन्हें वैश्विक बनाने के लिए एन के साथ-साथ एग की जरूरत है (अन्यथा, वे प्रति पंक्ति केवल एक शब्द से मेल खाते हैं)। दूसरे को भी शुरुआत में एक एस की जरूरत होती है।
कॉलिन मैकफॉल

1
निश्चित, इसके बारे में क्षमा करें।
एवरग्रीनट्री

1
का उपयोग करते हुए \wपहली बार में एक अच्छा विचार की तरह लगता है, लेकिन यह परीक्षण के बाद मैं समस्याओं का एक नंबर मिला। सबसे बड़ी बात यह है कि यह गैर-असि अक्षर से मेल नहीं खाता है, इसलिए एक शब्द जैसे überबस छोड़ दिया जाता है ( कल के बारे में एक सवाल था )। इसके अलावा, की तरह एक शब्द e-mailके बाद से, 2 शब्दों के रूप में गिना जाता है -में नहीं है \w(का उपयोग कर एक -अंग्रेजी में कुछ हद तक असामान्य है, लेकिन उदाहरण के लिए डच में बहुत आम है)। इस अंदाज में नजरअंदाज किए जाने वाले अन्य पात्र भी हो सकते हैं, जो हमें मेरे अंतिम बिंदु पर लाते हैं: जैसा कि "शब्द" माना जाता है,
वैसा ही

... विभिन्न भाषाओं में, और "उचित" उपकरण जैसे wcलोकल पर उठा सकते हैं (मुझे नहीं पता कि अगर GNU wcवास्तव में इस तरह से व्यवहार करता है, तो GNU उपकरण अपने उत्कृष्ट यूनिकोड समर्थन के लिए अच्छी तरह से ज्ञात नहीं हैं)।
मार्टिन टूरनोइज

यह दिलचस्प है। मैं wcसमाधान के लिए प्लस के रूप में जोड़ सकता हूं ।
एवरग्रीनट्री

1

शब्दों के उपयोग के लिए:

:.,+4 s/\i\+/&/gn

. वर्तमान लाइन को दर्शाता है।

इसके अलावा, मैंने अपनी .vimrc फ़ाइल में निम्नलिखित डाला:

:cabbrev zzcc   s/./&/gn

:cabbrev zzcw   s/\i\+/&/g

मैं टाइप कर सकता हूँ:

:.,+6 zzcw

और zzcwकरने के लिए विस्तार होगाs/\i\+/&/g

zzcwसिर्फ एक अजीब नाम है कि (मेरे लिए) कुछ भी मेल नहीं जाएगा।

एक साइड इफेक्ट है पूरी फाइल को चुना और हाइलाइट किया गया है।

मैं एक फ़ाइल में मल्टी-लाइन ट्वीट टाइप करने में सक्षम होना चाहता था, सुनिश्चित करें कि बहुत सारे वर्ण नहीं थे, और ट्विटर में ट्वीट पेस्ट करें।

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