शुद्ध विंबस्क्रिप्ट (बिना `s: s) के साथ


12

मैं अपने vimrc में निम्नलिखित है:

func! AddSpaceBeforeEqual()
  s/\([a-z)_0-9"'\[\]]\)=/\1 =/ge
endfunc

मैं अपने vimrc को लिंट करने के लिए vint का उपयोग कर रहा हूं , और निम्नलिखित चेतावनी मिली:

ProhibitCommandWithUnintendedSideEffect अनपेक्षित साइड इफेक्ट्स वाले कमांड से बचें। उपयोग करने से बचें: s [ubstitute] क्योंकि यह कर्सर ले जाता है और एरर मैसेज को प्रिंट करता है। कार्यों को प्राथमिकता दें (जैसे खोज) () स्क्रिप्ट के लिए बेहतर अनुकूल हैं। कई vim कमांड के लिए, फ़ंक्शन मौजूद हैं जो कम साइड इफेक्ट के साथ एक ही काम करते हैं। देखें: मदद कार्यों () में निर्मित कार्यों की एक सूची के लिए। Google Vimscript स्टाइल गाइड

हालांकि, मुझे नहीं लगता कि वे :sकमांड का उपयोग किए बिना प्रतिस्थापन करने का एक तरीका है ।

उदाहरण के लिए, search()फ़ंक्शन एक पैटर्न से मेल खाती लाइनें देता है, लेकिन प्रतिस्थापन करने का कोई तरीका नहीं है। substitute()समारोह एक स्ट्रिंग पर चल रही है, और एक पूरी फाइल पर स्थानापन्न नहीं करता है।

क्या मुझे स्वयं एक विकल्प विधि को लागू करना चाहिए, या वे मेरे कार्य को फिर से लिखने का एक स्मार्ट तरीका है?

जवाबों:


10

यहाँ आपके फ़ंक्शन का एक सरलीकृत कार्यान्वयन है, जिसके साथ लिखा गया है substitute():

function! AddSpaceBeforeEqualInWholeBuffer()
    let l = 1
    for line in getline(1,"$")
        call setline(l, substitute(line, '\([^= ]\)=', '\1 =', "g"))
        let l = l + 1
    endfor
endfunction

स्वाद के लिए खोज पैटर्न को समायोजित करें।


10

इसका कारण यह है कि आप अनपेक्षित दुष्प्रभावों के बारे में चेतावनी दे रहे हैं, क्योंकि :substituteयह कर्सर को स्थानांतरित करता है और पिछली खोज को अधिलेखित करता है (यदि किसी फ़ंक्शन के बाहर उपयोग किया जाता है) । हालांकि, इसका मतलब यह नहीं है कि आपको इसका उपयोग नहीं करना चाहिए, क्योंकि आप इसके दुष्प्रभावों को उलट सकते हैं :substitute। उदाहरण के लिए, यहां एक फ़ंक्शन है जो मैंने बनाया है जो व्‍हाइटिंग स्‍पेस को दूर करने के लिए विकल्‍प कमांड का उपयोग करता है:

function! StripTrailingWhitespace()
    " Save cursor position
    let l:save = winsaveview()
    " Remove trailing whitespace
    %s/\s\+$//e
    " Move cursor to original position
    call winrestview(l:save)
    echo "Stripped trailing whitespace"
endfunction

ध्यान दें कि आप :markकर्सर स्थिति को बचाने के लिए कमांड का उपयोग भी कर सकते हैं , लेकिन इसका मतलब यह भी है कि आप उस चिह्न को ओवरराइट कर देंगे जिसका आप उपयोग करने का निर्णय लेते हैं। मैंने पहले कभी शीशी का इस्तेमाल नहीं किया है, लेकिन लिंटर पर एक टिप यह है कि आप नमक के दाने के साथ उनकी चेतावनी ले सकते हैं। इस मामले में, यह सच है कि :substituteइसके साइड इफेक्ट्स हैं, लेकिन वे साइड इफेक्ट्स हैं जिन्हें रोका जा सकता है। इसके अलावा, वास्तव में किसी भी फ़ाइल में खोज और प्रतिस्थापन करने का कोई बेहतर तरीका नहीं है।


6
किसी फ़ंक्शन को छोड़ने के बाद अंतिम-प्रयुक्त खोज शब्द स्वचालित रूप से पुनर्स्थापित हो जाता है, इसलिए किसी फ़ंक्शन के अंदर इसका उपयोग करते समय सहेजने और पुनर्स्थापित करने की आवश्यकता नहीं होनी चाहिए। देखें:help function-search-undo
मार्टिन टूरनोइज

1
बल्कि कर्सर के बजाय winaveview () / winrestview () का उपयोग करें
क्रिश्चियन Brabandt

1

:sआदेश एक शुद्ध Vimscript दृष्टिकोण है।

मेरा अनुमान केवल चेतावनी है, इसका मतलब यह है कि कर्सर को सबसे अधिक इसके मिसयूज के बाद गलत तरीके से पेश किया जाएगा (जिसे आप इसके उपयोग winsaveview()से पहले और winrestview()कमेंड को फ़ंक्शन का उपयोग करके दरकिनार कर सकते हैं )। इसके अलावा, आपको संभावित त्रुटियों का ध्यान रखने की आवश्यकता है जो हो सकती हैं। यह आमतौर पर eध्वज का उपयोग करके नियंत्रित किया जाता है । इसके अलावा किसी को सेटिंग जैसी कुछ सेटिंग्स का ध्यान रखना चाहिए gdefault, जो कि gध्वज के अर्थ को प्रभावित करता है ।

एक को उन बारीकियों का ध्यान रखना चाहिए और शायद उन चेतावनियों का मूल कारण है। लेकिन इसका मतलब यह नहीं है कि :sकमांड के उपयोग से बचें । :sयदि आप वर्तमान बफर में कुछ बदलना चाहते हैं, तो कमांड का उपयोग करना पूरी तरह से ठीक है ।

(ध्यान दें, सभी लाइनों के माध्यम से एक लूप हो सकता है और एक खोज () / getline () / setline () दृष्टिकोण का उपयोग कर सकता है। लेकिन यह आमतौर पर धीमा है।)

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