समस्या की संभावित व्याख्या
मुझे लगता है कि :g/;/j
काम नहीं करने का कारण यह है क्योंकि :g
कमांड 2-पास एल्गोरिथ्म के साथ काम करता है:
- पहले पास के दौरान यह पैटर्न वाली लाइनों को चिह्नित करता है
;
- दूसरे पास के दौरान यह चिह्नित लाइनों पर संचालित होता है
दूसरे पास के दौरान, :g
लाइन के 1;
साथ लाइन जुड़ती है 2;
क्योंकि 1;
पहले पास के दौरान चिह्नित किया गया था। हालाँकि मुझे संदेह है (निश्चित नहीं) कि यह 1; 2;
साथ नहीं जुड़ता 3;
क्योंकि लाइन 2;
अब मौजूद नहीं है, इसकी सामग्री को उस लाइन के साथ मिला दिया गया है 1;
जो पहले ही संसाधित हो चुकी है।
तो :g
अगली पंक्ति के लिए लग रहा है जो पहली पास ( 3;
) के दौरान चिह्नित किया गया था और इसे निम्नलिखित एक ( 4;
) के साथ जोड़ता है । उसके बाद समस्या दोहराई जाती है, यह 3; 4;
साथ नहीं जुड़ सकता 5;
क्योंकि लाइन 4;
अब मौजूद नहीं है।
समाधान 1 (विमस्क्रिप्ट के साथ)
हो सकता है कि आप किसी फ़ंक्शन को कॉल कर सकें, जब ;
यह पाया जाए कि पिछली पंक्ति में अर्धविराम शामिल है या नहीं
function! JoinLines()
if getline(line('.')-1) =~ ';'
.-1join
endif
endfunction
फिर निम्न वैश्विक कमांड का उपयोग करें:
:g/;/call JoinLines()
या एक समारोह के बिना:
:g/;/if getline(line('.')-1) =~ ';' | -j | endif
समाधान 2 (विस्मार्क रहित)
:g/;/.,/^[^;]*$/-1j
जब भी वैश्विक कमांड :g
पैटर्न को ;
निष्पादित करता है तो वह कमांड को निष्पादित करता है: .,/^[^;]*$/-1j
इसे इस तरह तोड़ा जा सकता है:
:g/pattern/a,bj
कहाँ पे :
pattern = ;
a = . = number of current line
b = /^[^;]*$/-1 = number of next line without any semicolon minus one
b
इस तरह आगे टूट सकता है:
/ = look for the number of the next line matching the following pattern
^ = a beginning of line
[^;] = then any character except a semicolon
* = the last character can be repeated 0 or more times
$ = an end of line
/ = end of pattern
-1 = removes one to the number you just got
j
पूर्व कमान का संक्षिप्त रूप है, :join
जो अन्य पूर्व कमांडों की तरह एक सीमा से पहले हो सकता है।
: यहाँ यह सीमा से पहले है .,/^[^;]*$/-1
( a,b
)
एक सीमा प्रपत्र इस प्रकार a,b
जहां a
और b
आम तौर पर 2 लाइन नंबर हैं, और आप लाइनों जिनकी संख्या के बीच है के एक समूह पर संचालित करने के लिए अनुमति देता है a
और b
सिर्फ एक के बजाय,।
तो j
कमांड वर्तमान एक ( a
) और अगले एक के बीच सभी लाइनों को जोड़ता है जिसमें कोई अर्धविराम ऋण एक ( b
) नहीं है।
अधिक जानकारी के लिए देखें:
:help :global
:help :join
:help :range
:g/;/j
काम नहीं करता है क्योंकि यह दो पास में किया जाता है: पहले बफर को स्कैन किया जाता है, फिर कमांड को मिलान लाइनों पर लागू किया जाता है।