विम में स्मार्ट लपेटें


80

मुझे आश्चर्य हो रहा है कि क्या विम के पास कोड की स्मार्ट रैप लाइनों की क्षमता है, जिससे कि वह उसी इंडेंटेशन को बनाए रखता है जिस लाइन को इंडेंट कर रहा है। मैंने इसे कुछ अन्य टेक्स्ट एडिटर पर देखा है, जैसे ई-टेक्स्ट एडिटर, और पाया कि इससे मुझे यह समझने में मदद मिली कि मैं क्या आसान देख रहा हूं।

के बजाय उदाहरण के लिए

<p>
    <a href="http://www.example.com">
        This is a bogus link, used to demonstrate
an example
    </a>
</p>

ऐसा प्रतीत होगा

<p>
    <a href="somelink">
        This is a bogus link, used to demonstrate
        an example
    </a>
</p>


जैसे-जैसे चीजें बदली हैं, आपको जवाबों की फिर से समीक्षा करनी चाहिए।

1
का प्रयोग करें :set autoindentऔर:set smartindent
Shammel ली

जवाबों:


62

यह सुविधा 25 जून 2014 को पैच 7.4.338 के रूप में लागू की गई है । फीचर को परिष्कृत करने वाले कुछ पैच का अनुसरण किया गया, जिसमें से एक 7.4.354 है, इसलिए यह वह संस्करण है जो आप चाहते हैं।

:help breakindent
:help breakindentopt

नीचे दिए गए मदद से अंश:

'breakindent'     'bri'   boolean (default off)
                          local to window
                          {not in Vi}
                          {not available when compiled without the |+linebreak|
                          feature}
        Every wrapped line will continue visually indented (same amount of
        space as the beginning of that line), thus preserving horizontal blocks
        of text.

'breakindentopt' 'briopt' string (default empty)
                          local to window
                          {not in Vi}
                          {not available when compiled without the |+linebreak|
                          feature}
        Settings for 'breakindent'. It can consist of the following optional
        items and must be seperated by a comma:
                  min:{n}     Minimum text width that will be kept after
                              applying 'breakindent', even if the resulting
                              text should normally be narrower. This prevents
                              text indented almost to the right window border
                              occupying lot of vertical space when broken.
                  shift:{n}   After applying 'breakindent', wrapped line
                              beginning will be shift by given number of
                              characters. It permits dynamic French paragraph
                              indentation (negative) or emphasizing the line
                              continuation (positive).
                  sbr         Display the 'showbreak' value before applying the 
                              additional indent.
        The default value for min is 20 and shift is 0.

यह भी प्रासंगिक है कि यह showbreakसेटिंग है, यह आपके द्वारा निर्दिष्ट वर्ण (एस) के साथ आपकी शिफ्ट राशि का प्रत्यय होगा।

उदाहरण विन्यास

" enable indentation
set breakindent

" ident by an additional 2 characters on wrapped lines, when line >= 40 characters, put 'showbreak' at start of line
set breakindentopt=shift:2,min:40,sbr

" append '>>' to indent
set showbreak=>>   

व्यवहार पर ध्यान दें

यदि आप sbrविकल्प निर्दिष्ट नहीं करते हैं , तो किसी showbreakभी वर्ण को इंडेंटेशन में जोड़ा जाता है। sbrउपरोक्त उदाहरण से हटाने से 4 वर्णों का एक प्रभावी इंडेंट बनता है; उस सेटिंग के साथ, यदि आप showbreakबिना अतिरिक्त इंडेंटेशन के उपयोग करना चाहते हैं, तो निर्दिष्ट करें shift:0

आप एक नकारात्मक बदलाव भी दे सकते हैं, जो showbreakकिसी भी उपलब्ध इंडेंट स्पेस में वापस खींचने वाले पात्रों और लिपटे पाठ का प्रभाव होगा ।

जब कोई minमूल्य निर्दिष्ट करता है , तो स्थानांतरित की गई राशि को हटा दिया जाएगा यदि आप टर्मिनल की चौड़ाई संकीर्ण हैं, लेकिन showbreakवर्ण हमेशा संरक्षित होते हैं।


2
संक्षेप में, set breakindentअपने विम कॉन्फिग में जोड़ने से इंडेंट में लाइन ब्रेक और रैप हो जाएगी - अगली लाइन को तोड़ने और शुरू करने के बजाय जैसे कि यह एक नई लाइन थी।
james2doyle

3
और set breakindentopt=shift:4आपके vim config में जोड़ने से अतिरिक्त 4 रिक्त स्थान आ जाएंगे।
फ्रिट्ज़ो

इस उत्तर के लिए अधिक उदाहरण जोड़कर मदद की जाएगी breakindentopt। सिंटैक्स मदद डॉक्टर से स्पष्ट नहीं है। आपकी टिप्पणी में उदाहरण के लिए @fritzo धन्यवाद।
Mnebuerquo

33

इसके लिए एक पैच है, लेकिन यह वर्षों से सुस्त है और पिछली बार जब मैंने जाँच की तो सफाई से लागू नहीं हुई। Http://groups.google.com/group/vim_dev/web/vim-patches में "सही रूप से इंडेंट लिपटे लाइनों" प्रविष्टि देखें - मैं वास्तव में यह चाहता हूं कि यह मेनलाइन में मिलेगा।

अद्यतन: उस लिंक को बिट्रोट किया गया लगता है। यहाँ पैच का अधिक अद्यतित संस्करण है

अपडेट 2: इसे अपस्ट्रीम में मर्ज कर दिया गया है (7.4.345 के अनुसार), तो अब आपको केवल करना है :set breakindent


मुझे वह बहुत पसंद है, मैं html मार्कअप रास्ता अधिक पठनीय
बनाऊंगा

मुझे उस साइट पर कोई पैच नहीं दिख रहा है। क्या कोई और पुष्टि कर सकता है?
PUK

जाहिरा तौर पर हाल ही में साइट का पुनर्निर्माण किया गया था और वे लिंक टूट गए हैं। उसी साइट पर एक नए पैच के साथ हाल ही में एक ब्लॉग प्रविष्टि है।
मिटता है

1
यह वास्तव में गायब है। मुझे नहीं लगता कि यह मेनलाइन, एस्प में क्यों नहीं है। चूंकि पैच बहुत अच्छी तरह से लिखा गया है।
सेसेलस 6

2
अपडेट के लिए @Vitor Eiji को धन्यवाद। यह कमाल की खबर है।
जूल

17

मुझे नहीं लगता कि वास्तव में एक ही इंडेंटेशन होना संभव है, लेकिन आप 'शोब्रेक' विकल्प सेट करके एक बेहतर दृश्य प्राप्त कर सकते हैं।

:set showbreak=>>>

उदाहरण:

<p>
    <a href="http://www.example.com">
        This is a bogus link, used to demonstrate
>>>an example
    </a>
</p>

ऊपर दी गई उदाहरण कोड की तुलना में असली चीज़ बेहतर है, क्योंकि विम '>>>' के लिए एक अलग रंग का उपयोग करता है।


5
आप उपयोग भी कर सकते हैं :set showbreak=\ \ \ \ \ \ \ \ \ \ \ \ \ \ (बैकस्लैश स्पेस कॉम्बिनेशन ब्रेक कैरेक्टर स्पेस बनाता है। इस प्रकार, आप अपने लिपटे हुए कोड की तुलना में अधिक गहरे होने के लिए पर्याप्त स्थान जोड़ सकते हैं (उदाहरण के लिए, 10 स्पेस 2 चार स्पेस टैब से अधिक गहरा होगा और 14 से अधिक गहरा होगा) 3 चार अंतरिक्ष टैब); अंतरिक्ष की एक अच्छी विशेषता यह है कि यह नेत्रहीन ध्यान भंग करने वाला है (यदि आप चाहते हैं कि यह)
जेरोमी एंग्लिम

7
@ जेरेमी एंग्लिम एक मामूली सुधार: set showbreak=\ \ \ \ \ \ \ \ \ \ \ \ \ \ तब बहुत कम पठनीय होता हैlet &showbreak=repeat(' ', 14)
ZyX

8

अद्यतन: जून 2014 में, एक विकल्प का समर्थन करने के लिएbreakindent एक पैच को विम (संस्करण 7.4.346 या बाद में सर्वश्रेष्ठ समर्थन के लिए) में विलय कर दिया गया था।


आप यह भी कोशिश कर सकते हैं :set nowrapजो दाईं ओर स्क्रॉल करके लंबी लाइनों को प्रदर्शित करने की अनुमति देगा। यह किसी दस्तावेज़ की समग्र संरचना की जांच के लिए उपयोगी हो सकता है, लेकिन वास्तव में संपादन के लिए कम सुविधाजनक हो सकता है।

अन्य विकल्प जो आप देख रहे हैं, उसके करीब हैं linebreakऔर showbreak। इसके साथ showbreak, आप संशोधित कर सकते हैं कि जो लिपटे हुए हैं, उनके बाएं मार्जिन पर क्या प्रदर्शित होता है, लेकिन दुर्भाग्य से यह वर्तमान संदर्भ के आधार पर एक वैरिएंट इंडेंट की अनुमति नहीं देता है।


5

एक ही तरीका है कि मुझे पता है कि आप ऐसा कर सकते हैं एक वापसी चरित्र का उपयोग करना होगा (जैसा कि Cfreak द्वारा उल्लेख किया गया है) और textwidthविकल्प को विभिन्न इंडेंटेशन विकल्पों के साथ मिलाएं । यदि आपका इंडेंट सही तरीके से कॉन्फ़िगर किया गया है (जैसा कि मैं डिफ़ॉल्ट रूप से html सिंटैक्स के साथ मानता हूं, लेकिन अन्यथा विकल्प autoindentऔर smartindentविकल्प देखें ), आप निम्नलिखित हैं:

:set formatoptions = tcqw
:set textwidth = 50
gggqG

यदि आपके पास formatoptionsसेटिंग का कोई अनुकूलन है , तो बस करना बेहतर हो सकता है:

:set fo += w
:set tw = 50
gggqG

यह क्या करता है:

:set fo+=w  " Add the 'w' flag to the formatoptions so 
            " that reformatting is only done when lines
            " end in spaces or are too long (so your <p>
            " isn't moved onto the same line as your <a...).
:set tw=50  " Set the textwidth up to wrap at column 50
gg          " Go to the start of the file
gq{motion}  " Reformat the lines that {motion} moves over.
G           " Motion that goes to the end of the file.

ध्यान दें कि यह एक नरम लपेट के समान नहीं है: यह स्रोत फ़ाइल के साथ-साथ स्क्रीन पर भी लाइनों को लपेट देगा (जब तक कि आप इसे निश्चित रूप से नहीं बचाते हैं!)। formatoptionsआपके द्वारा टाइप किए जाने पर ऑटो-फॉर्मेट में अन्य सेटिंग्स भी जोड़ी जा सकती हैं : विवरण :help fo-table

अधिक जानकारी के लिए देखें:

:help 'formatoptions'
:help fo-table
:help 'textwidth'
:help gq
:help gg
:help G
:help 'autoindent'
:help 'smartindent'

3
:set smartindent
:set autoindent

मुझे लगता है कि आपको अभी भी एक वापसी का उपयोग करना होगा


2

यदि आपका HTML पर्याप्त रूप से अच्छी तरह से बना है, तो इसे xmllint के माध्यम से चलाने में मदद मिल सकती है:

:%!xmllint --html --format

2

एक मैक्रो समाधान:


संपादित करें:

gq{motion}चर "टेक्स्ट एक्सपोज़र" के लिए जो कुछ भी सेट किया गया है उसे ऑटो-फॉरमेट संचालित करें। यह 80lBi^Mमेरे मैक्रो के लिए उपयोग करने की तुलना में आसान / बेहतर है ।


यदि आपके पास autoindent सक्षम है

:set autoindent

फिर एक पंक्ति के अंत में एक रिटर्न दर्ज करने से अगली राशि उसी राशि पर आ जाएगी। यदि आप चाहें तो आप इसे linewraps में हार्ड दर्ज करने के लिए उपयोग कर सकते हैं। निम्नलिखित मैक्रो इसका लाभ उठाकर स्वचालित रूप से आपके पाठ को इंडेंट करता है:

रजिस्टर z सेट करें:

gg/\v^.{80,}$^M@x (change 80 to whatever length you want your text to be)

और रजिस्टर x को इस पर सेट करें:

80lBi^M^[n@x (change 80 to whatever length you want your text to be)

फिर करो

@x   

मैक्रोज़ को सक्रिय करने के लिए। कुछ सेकंड के बाद आप पाठ कर रहे हैं सभी 80 वर्ण या उससे कम की ठीक से इंडेंटेड लाइनों में होंगे।

स्पष्टीकरण:

यहाँ मैक्रोज़ का विच्छेदन है:

भाग 1 (स्थूल z):

gg/\v^.{80,}$^M@x

gg - start at the top of the file (this avoids some formatting issues)
/  - begin search
\v - switch search mode to use a more generic regex input style - no weird vim 'magic'
^.{80,}$ - regex for lines that contain 80 or more characters
^M - enter - do the search (don't type this, you can enter it with ctrl+v then enter)
@x - do macro x

भाग 2 (मैक्रो x):

80lBi^M^[n@x

80l - move right 80 characters
B   - move back one WORD (WORDS include characters like "[];:" etc.)
i^M - enter insert mode and then add a return (again don't type this, use ctrl+v)
^[  - escape out of insert mode (enter this with ctrl+v then escape)
@x  - repeat the macro (macro will run until there are no more lines of 80 characters or more)

कैविट्स:

  • अगर 80 अक्षर या उससे अधिक समय का WORD है तो यह मैक्रो टूट जाएगा।

  • यह मैक्रो स्मार्ट चीजों जैसे इंडेंट लाइन्स पास्ट टैग नहीं करेगा।

  • इसे तेज करने के लिए lazyredraw सेटिंग (: lazyredraw) का उपयोग करें

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