मैं एक त्रुटि फेंकने के बिना एक फ़ाइल लिखने से विम को कैसे रोक सकता हूं?


10

मैं लापता निर्देशिका बनाने से पहले पुष्टि करने के लिए इस उत्तर से कोड को बेहतर बनाने की कोशिश कर रहा हूं , यही मैं लिख रहा हूं:

function! CreateDirectoryAskConfirmation(path)
    if !isdirectory(a:path)
        echohl Question
        echo "Create directory " . a:path . "?"
        echohl None

        let response = nr2char(getchar())
        if response ==? "y"
            call mkdir(a:path, "p")
        endif
    endif
endfunction

autocmd BufWritePre * call CreateDirectoryAskConfirmation(expand("<afile>:p:h"))

एक चीज़ जो मुझे याद आ रही है: जब मैं yप्रॉम्प्ट पर प्रेस नहीं करता , तो मैं विम को लिखना छोड़ दूंगा ताकि मुझे त्रुटि न मिले E212: Can't open file for writingऔर मुझे त्रुटि संदेश को गायब करने के लिए किसी अन्य कुंजी को हिट करने की आवश्यकता न हो। इसे प्राप्त करने का एक तरीका है?

जवाबों:


9

उपयोग करने के बजाय BufWritePreautocmd, तो आप उपयोग कर सकते हैं BufWriteCmd autocmd, से :help BufWriteCmd:

फ़ाइल का लेखन करना चाहिए और यदि '+' को 'cpo' में और अन्य फ़ाइल cpo- + को लिखने तक सफल रहा है, तो 'संशोधित' रीसेट करें।

हम सिर्फ :writeऑटोकैम से कॉल कर सकते हैं । यह सेटिंग का ख्याल रखेगा modified

तो तर्क को तब कॉल करने के लिए संशोधित किया जाएगा :writeजब निर्देशिका पहले से मौजूद है, और :writeनिर्देशिका बनाने के बाद कॉल करें यदि यह अभी तक मौजूद नहीं है। यदि आप दबाते हैं n, तो हम कुछ नहीं करते हैं। यह बफ़र को छोड़ देगा, और फिर से सेट नहीं होगा modified, इसलिए :qफिर भी आपको एक E37: No write since last changeत्रुटि देगा।

function! CreateDirectoryAskConfirmation(path, dir)
    silent doautocmd BufWritePre

    " Directory exists, :write and return
    if isdirectory(a:dir)
        execute 'write ' . a:path
        silent doautocmd BufWritePost
        return
    endif

    " Ask for confirmation to create this directory
    echohl Question
    echo "Create directory `" . a:dir . "' [y/N]?"
    echohl None

    let response = nr2char(getchar())
    " mkdir() and :write if we want to make a directory
    if response ==? "y"
        call mkdir(a:dir, "p")
        execute 'write ' . a:path
        silent doautocmd BufWritePost
    endif
endfunction

autocmd BufWriteCmd * call CreateDirectoryAskConfirmation(expand("<amatch>:p"), expand("<amatch>:p:h"))

2
विमस्क्रिप्ट फ़ाइलों में, :कमांड के लिए अग्रणी कभी आवश्यक नहीं है।
13

@tommcdo धन्यवाद किसी कारण से मेरा मस्तिष्क कभी-कभी यह भूल जाता है> _ <
मार्टिन टूरनोइज

2
@ toro2k धन्यवाद। मुझे इसके बारे में पता नहीं था। मैंने अपना उत्तर संपादित किया, मैंने भी जोड़ा silentताकि आपको यह संदेश न मिले कि आप इसका उपयोग नहीं कर रहे हैं autogroup। मैंने एक और समस्या भी तय की जिसे मैंने देखा: :w another_nameकाम नहीं किया (यह काम नहीं करता है)।
मार्टिन टूरनोइज

2
@ toro2k क्योंकि अन्यथा writeकेवल वर्तमान फ़ाइल नाम (जैसे आप टाइप करते हैं :write) को लिखेंगे , और :write another_filenameयह काम नहीं करेगा (यह अभी भी मूल फ़ाइल नाम का उपयोग करेगा)।
मार्टिन टूरनोइज

1
@whitesiroi आप bufypeबफर प्रकार प्राप्त करने के लिए सेटिंग का उपयोग कर सकते हैं । पोस्ट को एक फिक्स के साथ संपादित करने के लिए स्वतंत्र महसूस करें (या यदि आप नहीं करते हैं, तो मैं अगले सप्ताह होगा)।
मार्टिन टूरनोइज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.