विम में लंबी लाइनें कैसे तोड़ें?


12

मेरे पास एक बहुत बड़ी टेक्स्ट फाइल है जैसे ब्लॉक

Short line.
Really long line.
Short line.

खाली लाइनों द्वारा अलग किया गया है, और मैं लंबी लाइनों को तोड़ने और ब्लॉक प्राप्त करने के लिए vim (लिनक्स पर) का उपयोग करना चाहूंगा

Short line.
This was
part of
a long line.
Short line.

gq(और gw) के साथ मेरी समस्या यह है कि यह प्रत्येक ब्लॉक को एक पूरे पैराग्राफ के रूप में संदर्भित करता है, अर्थात यह प्रत्येक ब्लॉक के भीतर दो लाइन ब्रेक को संरक्षित नहीं करता है, और :help fo-tableकिसी भी gqप्रारूप के विकल्प के अनुसार मुझे वह करने की अनुमति नहीं देगा जो मुझे चाहिए। मैंने यह भी सोचा कि मैं अपने लक्ष्य को प्राप्त कर सकता हूं यदि मैं नए-नए वर्णों को पैराग्राफ डेलिमिटर होने के लिए परिभाषित कर सकता हूं, लेकिन उनके अनुसार यह :help paragraphकठिन-कूटबद्ध है।

संपादित करें: मुझे पता है कि मैं प्रत्येक लंबी लाइन को एक-एक करके उपयोग gqया gwप्रारूपित कर सकता था, लेकिन जब से मेरी फ़ाइल कुछ हज़ार लाइनों से अधिक चलती है, तो मैं इसे स्वचालित रूप से प्राप्त करने का एक तरीका ढूंढ रहा हूं।


वैसे: मैंने अपनी समस्या के समाधान की तलाश की, यहाँ एसयू पर, और वेब पर, खाली आने पर। मैं स्पष्ट रूप से इस प्रश्न को हटा दूंगा यदि मैंने कुछ स्पष्ट अनदेखी की हो।
एपी


@ MartinSchröder: यह जानने के लिए खुशी है कि एक vi SE है! वे जवाब मेरे मुद्दे को संबोधित नहीं करते हैं, हालांकि, क्योंकि मैं पहले से ही जानता था gqऔर gw। मुझे खुशी है कि मैं वहां नहीं रुका, वरना मैं :gकमांड के बारे में नहीं जानता । :)
एपी

जवाबों:


16
:%norm! gww

यह पूरे बफर पर normalकमांड gww(जो वर्तमान लाइन को फॉर्मेट करता है gw) को लागू करता है, बिना कस्टमाइज़ किए मैपिंग को ध्यान में रखे (समस्याओं से बचने के लिए जैसे gwकि किसी और चीज़ से मैप किया गया है)।

देख

  • :help :%
  • :help :norm
  • :help gww

यह विकल्प टिप्पणियों में बेन के सुझाव के अनुसार है, और मूल समाधान की तुलना में अधिक सीधा है, जो नीचे से बचाया गया है क्योंकि यह नियमित अभिव्यक्ति मिलान क्षमता के कारण अन्य समान परिस्थितियों में बेहतर फिट हो सकता है। "सभी लाइनों के मैच" मामले में, यह अनावश्यक रूप से क्रूर है, हालांकि।


gwwकार्यक्रम में बफर में प्रत्येक व्यक्ति लाइन पर लागू :

:g/^/norm gww

देखें :help :gऔर :help norm^एक पंक्ति की शुरुआत से मेल खाता है, जो व्यवहार में इस मैच को हर पंक्ति बनाता है ।

कोई भी उदाहरण के साथ केवल 60 वर्णों की तुलना में लंबी लाइनों का चयन करने का विकल्प चुन सकता है

:g/\%>60v/norm gww

(देखें :help \%<) लेकिन व्यवहार में वैसे भी gwwकेवल सुधारक रेखाएँ अधिक लंबी होंगी textwidth, इसलिए यह न तो गति में ज्यादा मायने रखती है और न ही परिणाम में।

(मैं v"कॉलम" के बजाय "वर्चुअल कॉलम" के लिए उपयोग कर रहा हूं c, क्योंकि उत्तरार्द्ध वास्तव में लाइन में बायर्स की एक निश्चित संख्या की गणना करता है। यह मल्टीबाइट एन्कोडिंग्स का उपयोग करते समय अप्रत्याशित परिणाम पैदा कर सकता है, जो अक्सर सावधान रहने का एक कारण है। व्यवहार में यह ऊपर के रूप में एक ही कारण के लिए एक वास्तविक मुद्दा नहीं है, इसके बारे में वैसे भी gwwसुधार लाइनों को कम नहीं करेगा textwidth।)


जाहिरा तौर पर :gएक पैटर्न के बिना विफल रहता है, इसलिए :g//norm gwwकाम नहीं करता है लेकिन :g/.*/norm gwwकरता है।
एपी

@ आप: हुह, मेरे लिए काम करता है। मैं डेबियन अस्थिर से विम 7.4.488-6 का उपयोग कर रहा हूं।
डैनियल एंडरसन

4
:g//अंतिम खोज पैटर्न का पुन: उपयोग करता है; यदि कोई नहीं है, तो यह विफल रहता है। सभी लाइनों :g/^/पर लागू करने के लिए उपयोग करें ।
इंगो करकट

@IngoKarkat: आह, समझ में आता है, क्योंकि परीक्षणों के दौरान मेरा आखिरी पैटर्न रेखा की लंबाई से अवगत था जिसे मैंने बाद में प्रदर्शित किया। मैं जवाब अपडेट कर दूंगा। क्या आप जानते हैं कि इस "खाली प्रतिमान" के व्यवहार में मदद कहाँ मिलती है? मैं तुच्छ रूप से इसे नहीं पा सकता।
डैनियल एंडरसन

मैनुअल के माध्यम से देखते हुए, यह संभवतः निहित है कि :help last-patternसामान्य खोज के लिए दी गई जानकारी :globalकमांड पर भी लागू होती है ।
डैनियल एंडरसन

4

के बाद से आप पहले से ही के लिए मैनुअल पढ़ा है gqऔर gwआदेश, मैं समझ तो आप शायद मैन्युअल लंबी लाइनों में जाने और उसके बाद का उपयोग कर से अधिक सुविधाजनक कुछ चाहते हैं gw0, gw$या किसी अन्य gwआदेश केवल वर्तमान पंक्ति फ़ॉर्मेट करने के लिए।

मैं पाठ के एक ब्लॉक पर विम में लंबी लाइनों को तोड़ने का एक आसान तरीका नहीं जानता। हालाँकि, जब से आपने उल्लेख किया है कि आपका GNU / Linux सिस्टम पर Vim का उपयोग कर रहा है, मैं आपको अपने पाठ को GNU fmtकमांड के माध्यम से फ़िल्टर करने का सुझाव दूंगा ।

पूरी फाइल के लिए:

:%!fmt --width=75 --split-only

वर्तमान पैराग्राफ के लिए (छोटे विकल्पों का उपयोग करके):

:'{,'}!fmt -75 -s

प्रासंगिक fmtविकल्पों की व्याख्या इस प्रकार है:

  • -w, --width=WIDTH- अधिकतम लाइन चौड़ाई (75 कॉलम की डिफ़ॉल्ट)। विकल्प -WIDTHएक संक्षिप्त रूप है --width=DIGITS(यदि इस संक्षिप्त संस्करण का उपयोग किया जाता है, तो यह पहला विकल्प होना चाहिए)।

  • -s, --split-only- लंबी लाइनों को विभाजित करें, लेकिन फिर से भरना न करें; यह वह विकल्प है जो आपकी पहले से मौजूद हार्ड लाइन को सुरक्षित रखता है।


उल्लेख करने के लिए धन्यवाद fmt। मैंने अन्य उत्तर को स्वीकार करना पसंद किया, हालाँकि, इसके लिए केवल विम की आवश्यकता है।
एपी

@ आप को कोई चिंता नहीं है। यह एक बहुत अच्छा जवाब है और मैंने इसे स्वीकार कर लिया है। यह और आपका प्रश्न दोनों ही उत्थान करते हैं।
एंथोनी जोगेगन

1

से:

Short line.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Short line.

मार्कर को "लोरेम इप्सम" लाइन पर रखना और gwwपैदावार ( textwidth=40स्पष्टता के लिए) को दबाना :

Short line.
Lorem ipsum dolor sit amet, consectetur
adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.
Short line.

जो मुझे लगता है कि आप क्या मांग रहे हैं। यदि नहीं, तो कृपया स्पष्ट करने के लिए स्वतंत्र महसूस करें।

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