আমি কীভাবে কোনও ত্রুটি না ছুঁড়েই ভিমকে ফাইল লেখা থেকে বাধা দিতে পারি?


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

BufWritePreস্বতঃআসকেএমডি ব্যবহার না করে আপনি অটোকিমডি ব্যবহার করতে পারেন BufWriteCmd , এ থেকে :help BufWriteCmd:

ফাইলটি লেখার কাজটি করা উচিত এবং সফল হলে 'সংশোধিত' পুনরায় সেট করা উচিত, যদি না '+' 'সিপিও'তে থাকে এবং অন্য ফাইলটি সিপিও- + এ লেখা হয়।

আমরা কেবল :writeঅটোকিমডি থেকে কল করতে পারি। এটি সেটিংয়ের যত্ন নেবে modified

সুতরাং :writeডিরেক্টরিটি ইতিমধ্যে বিদ্যমান থাকলে কলটি যুক্ত হয়ে সংশোধন করা হবে এবং ডিরেক্টরিটি :writeতৈরি করার পরে কল করা আছে যদি এটি উপস্থিত না থাকে। আপনি চাপলে nআমরা কিছুই করি না do এটি বাফারকে যেমন রয়েছে তেমন ছেড়ে দেবে এবং পুনরায় সেট হবে না 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
ভিমস্ক্রিপ্ট ফাইলগুলিতে, :কমান্ডগুলির জন্য নেতৃস্থানীয় কখনই প্রয়োজন হয় না।
tommcdo

ধন্যবাদ টমমকডো কোনও কারণে আমার মস্তিষ্ক এটি কখনও কখনও> _ <
মার্টিন টর্নয়েজ

2
@ toro2k ধন্যবাদ আমি এটা সম্পর্কে জানতাম না। আমি আমার উত্তরটি সম্পাদনা করেছি, আমি আরও যুক্ত করেছি silentযাতে আপনি এটি ব্যবহার না করে আপনি কোনও বার্তা পাবেন না autogroup। আমি আরও একটি সমস্যার সমাধান করেছি যা আমি লক্ষ্য করেছি: :w another_nameকাজ করে না (এটি কাজ করে না)।
মার্টিন টর্নোইজ

2
@ toro2k কারন অন্যথায় writeকেবল বর্তমান ফাইলনামে লিখবে (ঠিক আপনার টাইপ করার সময় :write) এবং :write another_filenameকাজ করবে না (এটি এখনও মূল ফাইলের নাম ব্যবহার করবে) use
মার্টিন টর্নয়েজ

1
@ হোয়েটসিরোই bufypeবাফার টাইপটি পেতে আপনি সেটিংসটি ব্যবহার করতে পারেন । একটি সংশোধন সহ পোস্টটি সম্পাদন করতে নির্দ্বিধায় (বা যদি আপনি না করেন তবে আমি পরের সপ্তাহে করব)।
মার্টিন টর্নয়েজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.