शब्द लपेटें विम में (इंडेंटेशन को संरक्षित करते हुए)


92

मैं बस इस पोस्ट को देख रहा था जिसमें बताया गया है कि कैसे पूरे शब्दों को विम में लपेटना है। स्वीकृत समाधान यह था:

:set formatoptions=l
:set lbr

यह पाठ लेता है (टैब \ t के रूप में दिखाए गए हैं):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will wr|ap here                            
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

यह इस तरह के व्यवहार को पूरा करता है (टैब को \ t के रूप में दिखाया गया है):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|wrap here                              |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

लेकिन मैं इस समारोह को फिर से परिभाषित करना चाहूंगा। मैं चाहूंगा कि लिपटी हुई रेखा के सामने एक ही संख्या में टैब हों, ऊपर की रेखा प्लस एक है। अर्थात:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|\t\t\twrap here                        |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

कोई विचार?


34
प्रश्न को यथासंभव स्पष्ट करने के लिए किए गए प्रयास के लिए +1।
जेफरी जोस

क्या आप चाहते हैं कि विंडो के किनारे पर टेक्स्ट सॉफ्ट-रैप हो, या लाइन एक निश्चित लंबाई तक पहुंचने पर हार्ड-रैप हो? मुझे लगता है कि आप हार्ड-रैपिंग चाहते हैं (जहां "वसीयत" शब्द के बाद आपके पाठ में एक नई पंक्ति डाली जाती है), लेकिन आपके उदाहरणों से यह बताना मुश्किल है।
बिल Odom

@ बिल, मुझे ज्यादातर सॉफ्टवेरपिंग में दिलचस्पी है, लेकिन एक हार्डवॉपरिंग समाधान भी स्वीकार्य होगा।
साठफुटर्सड्यूड

1
आप जो कार्यक्षमता चाहते हैं वह वर्तमान में विम में नहीं बनी है। एक पैच है जो करीब आता है, हालांकि: group.google.com/group/vim_dev/web/vim-patches (यह # 15 है, "सही रूप से इंडेंट लिपटे लाइनें")।
बिल Odom

संबंधित: इस समस्या को संभालने के लिए बाहरी यूनिक्स उपयोगिताओं का उपयोग करने पर विमकास्ट्स का एक अच्छा एपिसोड था: vimcasts.org/e/18
डेमियन विल्सन

जवाबों:


18

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

Homebrew के साथ OS X पर ब्रेकडेंट पैच के साथ Vim पैच करें

विशेष रूप से, इक्रिस्टोफ़र्सन के होमब्रेव सूत्र।

मुझे पता है कि यह धागा पुराना है, लेकिन यह गूगल पर लोकप्रिय है और मैं इसका हल खोजने की कोशिश करते समय कई बार आया।

EDIT: इस पैच को अब पैच 7.4.338 के रूप में विम के साथ शामिल किया गया है। देखें: https://retracile.net/blog/2014/07/18/18.00

योसेमाइट (मैक ओएस एक्स) पर, मैंने होमब्रे के साथ स्नोबाउंड की कमान का उपयोग किया:

brew install macvim --with-features=huge --override-system-vim --HEAD 

पैच homebrew पर नवीनतम macvim के साथ काम करने के लिए प्रतीत नहीं होता है? @ Exit42 आपको यह काम करने के लिए कैसे मिला?
बर्फ का गोला

nvm। मैं homebrew खून बह रहा बढ़त के साथ संकलित macvimbrew install macvim --with-features=huge --override-system-vim --HEAD
snowbound

1
नीचे मेरा जवाब देखें: stackoverflow.com/questions/2828174/… विम के नए संस्करणों में पैच की आवश्यकता नहीं है।
यहोशू

26

जब मूल रूप से सवाल पूछा गया था, तो यह काम नहीं किया, लेकिन 25 जून 2014 तक, यह काम करेगा। (यह मानते हुए कि आप उस तिथि से नए संस्करण में अपनी vim अपडेट करते हैं)

अपने .vimrc में जोड़ें:

" Indents word-wrapped lines as much as the 'parent' line
set breakindent
" Ensures word-wrap does not split words
set formatoptions=l
set lbr

और बस!

-

कुछ लोग (स्वयं शामिल) एक से अधिक कंप्यूटरों में एक .vimrc साझा करते हैं। उस स्थिति में, यह रेखा मजबूत होना महत्वपूर्ण है (कष्टप्रद त्रुटि संदेशों से बचने के लिए)। यह थोड़ा बेहतर है:

if has("patch-7.4.354")
    " Indents word-wrapped lines as much as the 'parent' line
    set breakindent
    " Ensures word-wrap does not split words
    set formatoptions=l
    set lbr
endif

इस तरह, यदि आप पुराने संस्करण पर हैं, तो आपको एक त्रुटि संदेश नहीं मिलता है।


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

1
Vim 7.4 @ ArchLinux में काम करता है।
एंडी मिखाइलेंको

1
आप इस परीक्षण का उपयोग कर सकते हैं:if has("patch-7.4.354")
लॉरेंस केस्टेलूट

यह ओपी की टिप्पणी के बारे में सवाल का जवाब नहीं देता है: टैब की एक ही संख्या (...) प्लस । यह मेरी राय में भी बहुत महत्वपूर्ण है, आप अक्सर अतिरिक्त इंडेंटेशन और वैकल्पिक रूप से लिपटे हुए खंडों को दाईं ओर रखना चाहते हैं (कसकर व्यवस्थित लिस्टिंग, नोट्स, आदि);
खूनी

8

आपको जो सबसे अच्छा मिलने वाला है, वह showbreakविकल्प है जो प्रत्येक लिपटे लाइन (मैं उपयोग set showbreak=...) के सामने एक निश्चित स्ट्रिंग लगाएगा ।


@AlexanderBird के अनुसार :help 'showbreak', नहीं, आप नहीं कर सकते - showbreakकेवल एक स्ट्रिंग है।
रोरी ओ'केन

4

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

इसलिए शो -ब्रेक का उपयोग करके एक (बदसूरत) इंडेंट जोड़ने का एक तरीका सिर्फ बहुत सारे वर्णों का उपयोग करना है। यह कुछ इस तरह से दिखाई देता है:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|>--------------->wrap here             |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

एक बेहतर विकल्प हो सकता है कि नॉनब्रेकिंग स्पेस कैरेक्टर का उपयोग किया जाए (यह मानते हुए कि विम का उदाहरण यूनिकोड सक्षम है), जिनमें से प्रत्येक को ctrl-v, 160 के प्रमुख अनुक्रम का उपयोग करके शो-स्ट्रीक में दर्ज किया जा सकता है। इस तरह आप एक शो-स्ट्रिंग स्ट्रिंग दर्ज कर सकते हैं जो बाईं ओर रिक्त है और एक वास्तविक इंडेंट प्रतीत होता है। जैसे, ": सेट शोब्रेक =। कमांड वास्तव में ctrl-V, 160 दबाकर दर्ज किया गया एक नॉनब्रेकिंग स्पेस कैरेक्टर है। इस तरह आप एक आवरण के साथ समाप्त होते हैं जो अच्छी तरह से इंडेंट होता है:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|            >>wrap here                |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

आपके पास अभी भी पिछली पंक्ति के इंडेंट के अनुसार इंडेंट के स्तर को अलग करने की कोई क्षमता नहीं है, लेकिन कम से कम आप खिड़की के बाएं मार्जिन के साथ बहुत सारे दृश्य अव्यवस्था के बिना लिपटे लाइनों के स्वच्छ इंडेंट प्राप्त करते हैं। अभी भी भ्रम हो सकता है यदि एक लिपटे लाइन का इंडेंट एक वास्तविक लाइन की शुरुआत से कम हो, लेकिन यह संभवतः शोकेस "इंडेंट" को काफी बड़ा बनाने से बचा जा सकता है (अर्थात, आमतौर पर आपके कोड में पाए जाने वाले किसी भी इंडेंट से अधिक है) ) लेकिन अभी भी काफी छोटा है कि यह पाठ के सुपाठ्य रैपिंग के लिए पर्याप्त स्थान प्रदान करता है। कई उपयोगों के लिए मुझे लगता है कि 40 या 50 रिक्त स्थान का शोकेस इंडेंट यह बहुत अच्छा करेगा।


7
आप उन्हें भागने से showbreak में रिक्त स्थान डाल कर सकते हैं: :set showbreak=\ \ \ \ । फिर भी, टैब के लिए काम नहीं करता है, हालांकि।
बिल Odom
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.