2010-11-10 8 views
5

मैं विम में फ़ाइलों को संपादित करता हूं, क्या मैंने टर्मिनल कमांड लाइनों को लॉग इन किया था, जो मैंने किया था। मेरे सभी कमांड लाइन $ के साथ शुरू है, तो मेरी फ़ाइलें इस तरह दिखेगा:मैं विम में लाइन ब्रेक के लिए अपवाद कैसे परिभाषित करूं?

This is a description of what this 
command does, it can be quite long and 
should have line breaks. 

$ ./the_command.sh 

ये वास्तव में Viki फ़ाइलें हैं, लेकिन मुझे लगता है कि इस सवाल का किसी भी फ़ाइल प्रकार के लिए लागू करना चाहिए। मेरे पास फ़ाइल टाइप पहचान है और फ़ाइलों को सही ढंग से पहचाना जाता है।

सवाल है:

मैं चाहता हूँ (हार्ड) लाइन कमांड लाइन की वास्तविक प्रतियां, जो आसानी से अग्रणी $ से पहचाना जा सकता है के अलावा सभी पाठ में सम्मिलित करने के टूट जाता है।

क्या विम में पैटर्न के आधार पर लाइन ब्रेक नियम लागू करने के लिए अपवाद को परिभाषित करना संभव है? क्या मैं इसे विकी फाइलों के लिए सिंटैक्स फ़ाइल में करूंगा?

अद्यतन क्या हर्बर्ट और Jefromi सुझाव का एक संयोजन का उपयोग करना, अब मैं अपने .vimrc में यह है:

au CursorMovedI *.viki call SetTextWidth() 

function! SetTextWidth() 
    if getline(".")=~'^\$' 
     set textwidth=1000 
    else 
     set textwidth=80 
    endif 
endfunction 

यह बिल्कुल करता है कि मैं क्या चाहता हूँ। धन्यवाद दोस्तों!

+0

साथ लिखना बस स्पष्ट करने के लिए इस आवेदन कर सकता है: मैं चाहता हूँ लाइनब्रेक स्वचालित रूप से सम्मिलित करने के लिए के रूप में मैं टाइप करें। मेरे .vimrc में मेरे पास विशेष रूप से विकी फ़ाइलों के लिए टेक्स्टविड्थ सेट करने के लिए "autocmd FileType viki setlocal textwidth = 80" एक पंक्ति है, जो ठीक काम करता है सिवाय इसके कि यह मेरी "$ COMMAND" लाइनों को भी तोड़ देता है। – tospo

उत्तर

3

मैं इकट्ठा जब आप कहते हैं आप चाहते हैं "हार्ड लाइन टूट जाता है" क्या आपका मतलब आप विम, स्वचालित रूप से एक लाइन को तोड़ने के लिए जब यह एक textwidth स्तंभ तक पहुँच जाता है के रूप में चाहते हैं। ऐसा करने का सबसे अच्छा तरीका, मुझे लगता है कि, 'au' कमांड को परिभाषित करना है जो टेक्स्टविड्थ को उच्चतम संख्या (सबसे लंबी संभव लाइन से अधिक) पर सेट करता है जब यह "$" से शुरू होने वाली रेखा पर होता है।

तो कुछ इस तरह textwidth बदल जाएगा जब भी आप एक लाइन पर या उनसे निकलना डालने मोड:

au InsertEnter call SetTextWidth() 
au InsertLeave call SetTextWidth() 

function! SetTextWidth() 
    if getline(line('.')) =~ '^\$' 
     " [edit: 'set textwidth = 0' is preferable to line below] 
     set textwidth =1000 
    else 
     set textwidth=78 
    endif 
endfunction 

आप InsertEnter के बजाय CursorMoved/CursorMovedI समूहों का उपयोग करना चाह सकते हैं/छोड़ दो के बाद से वे और अधिक ठीक हो -grained। जब भी आप कर्सर को ले जाते हैं तो वे ट्रिगर हो जाते हैं, इसलिए फ़ंक्शन को कई बार बुलाया जाता है, लेकिन फ़ंक्शन इतना आसान है कि संभवतः यह प्रदर्शन में किसी भी ध्यान देने योग्य गिरावट को पेश नहीं करेगा।

सभी में आयोजित एक समारोह के बिना कर आप शायद कुछ इस तरह इस्तेमाल कर सकते हैं के लिए:

au InsertEnter exec "set tw=" . getline(line('.'))=~'^\$' ? 1000 : 78 
au InsertLeave exec "set tw=" . getline(line('.'))=~'^\$' ? 1000 : 78 
+0

आप लाइन रैपिंग मैन्युअल रूप से कार्यान्वित करने के लिए शायद 'CursorMovedI' का उपयोग कर सकते हैं, और अकेले टेक्स्टविड्थ छोड़ सकते हैं। – Cascabel

+0

इस समाधान के लिए बहुत बहुत धन्यवाद। क्या यह गेटलाइन (लाइन ('।') के बजाय "गेटलाइन ('।')" नहीं होना चाहिए) हालांकि? इस दृष्टिकोण के साथ समस्या यह है कि यह केवल तभी काम करता है जब आप एक लाइन संपादित करना शुरू करते हैं, "$" टाइप करें और फिर सम्मिलित मोड में से बाहर निकलें। अन्यथा जब आप INSERT दर्ज करते हैं तो लाइन की शुरुआत में कोई "$" नहीं होता है, जिसका अर्थ है कि लाइन ब्रेक डाले जाएंगे और इसलिए जब आप INSERT मोड से बाहर निकलेंगे तो वर्तमान लाइन में कोई अग्रणी "$" नहीं है। मुझे अब कर्सरमोडआई के साथ प्रयास करना है, मुझे लगता है कि काम करना चाहिए। – tospo

+0

ठीक है, यह CursorMovedI के साथ ठीक काम करता है - बहुत बहुत धन्यवाद! – tospo

0

हालांकि मुझे यकीन है कि आप क्या चाहते हैं नहीं कर रहा हूँ, लेकिन आप

:v:^\s*$: <Your command to insert line break, e.g. s/something/\r/ > 
की तरह एक आदेश जारी कर सकते हैं (आप जहां (क्यों, कैसे) आप हार्ड पंक्ति विराम सम्मिलित करना चाहते हैं पर थोड़ा और अधिक विशिष्ट होना चाहिए)

यह उपरोक्त आदेश किसी भी पंक्ति के लिए खोज करता है जो $ के बाद किसी भी व्हाइटस्पेस से शुरू नहीं होता है, फिर आपके द्वारा निर्दिष्ट आदेश निष्पादित करता है।

HTH

+0

जैसा कि मैंने कहा था, मैं चाहता हूं कि फ़ाइल में हर जगह हार्ड लाइन ब्रेक हो जाए, इसके अलावा $ (कमांड लाइनों की प्रतियां) से शुरू होने वाली लाइनों को छोड़कर। मैं चाहता हूं कि उन रेखाओं को फ्लाई पर डाला जाए, यानी टेक्स्टविड्थ वैरिएबल सेट करके (जिसे मैंने विशेष रूप से विकी फ़ाइल टाइप के लिए किया है)। तो आप जो सुझाव देते हैं वह वह नहीं है जो मैं खोज रहा था, वैसे भी धन्यवाद! – tospo

+0

ठीक है, अब मुझे मिल गया। इस मामले में, आपको अन्य उत्तरों पर विचार करना चाहिए। –

2

मेरा मानना ​​है कि यह अपने मानदंडों को पूरा होगा:

set textwidth=78 
v/^$/normal gq/^$\|\%$^M 

^Mctrl-venter

द्वारा पीछा किया है

इसे छोटे पेइस में तोड़ दें

/^$\|\%$ एक ऐसा पैटर्न है जो प्रत्येक लाइन से मेल खाता है जो $ $ से शुरू नहीं होता है। \%$ में अंतिम $ आरंभ लाइन और फ़ाइल के अंत के बीच की रेखाएं शामिल होंगी। पैटर्न /^$\|\%$

:normal {cmd} अप करने के लिए वर्तमान पंक्ति से

gq/^$\|\%$ प्रारूपों वर्तमान लाइन पर एक सामान्य मोड आदेशों निष्पादित करता है।

:v/pattern/:g!/pattern/ जो हर पंक्ति बहुत मिलान/तर्ज पर एक कमांड निष्पादित करता है/

यह समाधान के रूप में आपके द्वारा लिखते ही @Herbert Sitz समाधान करता है स्वरूपित नहीं है के बराबर है। इसके बजाय पाठ में स्वरूप स्वरूप अंत में झुकाव गिर गया।

आप निश्चित रूप से पहले प्रत्येक

au BufWritePre filename-pattern-here set textwidth=78 | v/^$/normal gq/^$\|\%$^M 
au BufWritePost filename-pattern-here set textwidth=0 
+0

समाधान के लिए धन्यवाद। मैं हर्बर्ट के साथ बस जाऊंगा क्योंकि मैं लिखने के दौरान उन लाइनब्रेक को लागू करना पसंद करता हूं लेकिन स्पष्टीकरण के लिए धन्यवाद !! – tospo

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