ভিম: সেভের জন্য প্যারেন্ট ডিরেক্টরিগুলি তৈরি করা হচ্ছে


122

আমি যদি অনুরোধ করি vim foo/bar/somefileতবে foo/barইতিমধ্যে উপস্থিত না থাকলে ভিম সংরক্ষণ করতে অস্বীকার করে।

আমি জানি আমি কোনও শাঁলে স্যুইচ করতে পারি বা :!mkdir foo/barভিমের কাছ থেকে করতে পারি তবে আমি অলস :) যখন বাফারটি সংরক্ষণ হয় তখন ভিমকে স্বয়ংক্রিয়ভাবে এটি করার কোনও উপায় আছে কি?


13
mkdir -p %:hআরও ভাল কারণ এটি নেস্টেড অ-বিদ্যমান পাথের জন্য কাজ করে, পথটি ইতিমধ্যে উপস্থিত থাকলে ত্রুটি বাড়ায় না এবং %:hএটি বর্তমান ফাইলের পুরো পথ। তবে, কীভাবে এটি স্বয়ংক্রিয়ভাবে প্রার্থনা করতে হয় তা আমি জানি না। সাধারণত এটি অটোম্যান্ডস দিয়ে করা হয় তবে BufWritePreইভেন্টটি এখানে কাজ করবে বলে মনে হয় না।
কনরাড রুডল্ফ

কোনও ফাংশন সংজ্ঞায়িত করুন যা ফাইলটি উপস্থিত রয়েছে এবং বিল্টিনকে writeকল করে এবং সিস্টেমটিকে অন্যথায় কল করে কিনা তা পরীক্ষা mkdir -pকরে dirname, এটিকে মানচিত্র করুন W... বাক্য
গঠনটি

1
আমি উভয় আপনার পরামর্শ ও ওরফে একত্রিত পারে :wথেকে mkdir -p %:hbuilting দ্বারা অনুসরণ:write
ডেমিয়েন Pollet

উত্তর:


91
augroup BWCCreateDir
    autocmd!
    autocmd BufWritePre * if expand("<afile>")!~#'^\w\+:/' && !isdirectory(expand("%:h")) | execute "silent! !mkdir -p ".shellescape(expand('%:h'), 1) | redraw! | endif
augroup END

শর্তাদি নোট করুন: expand("<afile>")!~#'^\w\+:/'ভিআইএম এর মতো ফাইলগুলির জন্য ডিরেক্টরি তৈরি করতে বাধা দেবে ftp://*এবং !isdirectoryব্যয়বহুল এমকেডির কলটি রোধ করবে।

আপডেট : স্লিগলি ভাল সমাধান যা খালি খালি বুফটাইপ এবং ব্যবহারগুলি পরীক্ষা করে mkdir():

function s:MkNonExDir(file, buf)
    if empty(getbufvar(a:buf, '&buftype')) && a:file!~#'\v^\w+\:\/'
        let dir=fnamemodify(a:file, ':h')
        if !isdirectory(dir)
            call mkdir(dir, 'p')
        endif
    endif
endfunction
augroup BWCCreateDir
    autocmd!
    autocmd BufWritePre * :call s:MkNonExDir(expand('<afile>'), +expand('<abuf>'))
augroup END

1
ধন্যবাদ, আমার অনুমান-হ্যাকের চেয়ে অনেক বেশি পরিষ্কার মনে হচ্ছে :)
ড্যামিয়েন পোলেট

11
call mkdir(expand('%:h'), 'p')আরও বহনযোগ্য হতে পারে।
মারিউস গেডমিনাস

1
@ মারিয়াসজেডমিনাস আমি এই পরিবর্তনটির সাথে সম্পূর্ণ কোডটি দেখতে চাই। আপনি দয়া করে উত্তর হিসাবে পোস্ট করতে পারেন / এটি কোথাও আপলোড?
কিকিতো

আমার উত্তর দেখুন। এটি মন্তব্য করার কয়েক ঘন্টা পরে এটি সম্পাদিত হয়েছিল।
জাইএক্স

@ জাইক্স ধন্যবাদ! আমি কিছুটা খাটো করে কিছু শেষ করেছি (আমার উত্তরটি বর্তমানে সর্বশেষে শেষ হয়েছে) তবে মনে হচ্ছে এটি কৌশলটি দুর্দান্তভাবে করেছে।
কিকিতো

20

আমার প্রশ্নের পরামর্শের ভিত্তিতে, আমি এখানে কী শেষ করেছি:

function WriteCreatingDirs()
    execute ':silent !mkdir -p %:h'
    write
endfunction
command W call WriteCreatingDirs()

এটি :Wকমান্ডটি সংজ্ঞায়িত করে । আদর্শভাবে, আমি সব আছে চাই :w!, :wq, :wq!, :wallএকই কাজ ইত্যাদি, কিন্তু আমি নিশ্চিত যদি এটা মূলত তাদের সবাইকে কাস্টম ফাংশন সঙ্গে reimplementing ছাড়া সম্ভব নই।


2
আমি এই একই আদেশটি চেষ্টা করেছি এবং যতবার আমি ব্যবহার করি :W, আমার পর্দা প্রায় ফাঁকা হয়ে যায়। আমি চেষ্টা করব এবং আমার আগের বিকল্পগুলি মুছে ফেলব এবং প্রতিক্রিয়া জানাব।
moebius_eye

6

আমি এটি আমার। / .Vimrc এ যুক্ত করেছি

cnoremap mk. !mkdir -p <c-r>=expand("%:h")<cr>/

যদি আমি টাইপ করছি আমি যে ডিরেক্টরিটি টাইপ করছি তা তৈরি করতে :mk.হবে এবং এটি "!



3

এই কোডটি আপনাকে ডিরেক্টরিটি তৈরি করে :wবা কেবল এটির সাহায্যে নির্দেশ করবে :w!:

augroup vimrc-auto-mkdir
  autocmd!
  autocmd BufWritePre * call s:auto_mkdir(expand('<afile>:p:h'), v:cmdbang)
  function! s:auto_mkdir(dir, force)
    if !isdirectory(a:dir)
          \   && (a:force
          \       || input("'" . a:dir . "' does not exist. Create? [y/N]") =~? '^y\%[es]$')
      call mkdir(iconv(a:dir, &encoding, &termencoding), 'p')
    endif
  endfunction
augroup END

1

আমি মনে করি আমি এই উত্তরটিতে অন্যেরা কী বলছে তা সমন্বিত করে তিনটি লাইনে এটি করতে পেরেছি।

এটি কৌশলটি মনে হচ্ছে:

if has("autocmd")
  autocmd BufWritePre * :silent !mkdir -p %:p:h
end

এটি একটি বাফার সংরক্ষণের সময় স্বয়ংক্রিয়ভাবে ফোল্ডারটি তৈরি করার চেষ্টা করে। যদি কোনও খারাপ কিছু ঘটে (যেমন অনুমতি সংক্রান্ত সমস্যা) তবে এটি কেবল বন্ধ হয়ে যাবে এবং ফাইলটি লিখতে ব্যর্থ হতে দেবে।

কেউ যদি কোনও সুস্পষ্ট ত্রুটি দেখতে পান তবে একটি মন্তব্য পোস্ট করুন। আমি ভিমস্ক্রিপ্ট খুব পারদর্শী না।

সম্পাদনা: নোট জাইএক্সকে ধন্যবাদ

  • আপনার ফোল্ডারে যদি স্পেস থাকে তবে এটি কাজ করবে না (সম্ভবত তারা সঠিকভাবে পালাতে পারেনি বা কোনও কিছু)
  • অথবা আপনি যদি সিউডো ফাইলগুলি করছেন।
  • অথবা আপনি যদি আপনার ভিআরসিআর সসোর্স করছেন।
  • তবে পুত্র, এটি সংক্ষিপ্ত।

1
এই %ধরনের স্ক্রিপ্টগুলিতে কখনও ব্যবহার করবেন না। উদাহরণস্বরূপ, আপনার নামের একটি ফাইল সম্পাদনা করছেন যদি: তেজ কোন বিশেষ চিহ্ন অব্যাহতি যাচ্ছে না /mnt/windows/Documents and Settings/User/_vimrcআপনি চারটি নতুন ডিরেক্টরি থাকার শেষ হবে: /mnt/windows/Documents, ./and, ./Settingsএবং ./Settings/User। এবং, যাইহোক, আপনার :executeএখানে দরকার নেই।
জাইএক্স

1
নেই system()সম্পূর্ণরূপে নীরব শেল কলের জন্য ফাংশন, কিন্তু আপনি উভয় প্রয়োজন হবে না :executeএবং %:p:h: :silent !mkdir -p %:p:h(যদিও আপনি প্রয়োজন হতে পারে আপনি কি লিখেছে হিসেবে ঠিক কাজ করে :redraw!, শেষ এ এই ক্ষেত্রে :executeকুশলী আসে), কিন্তু এটা ব্যবহার করা উত্তম call system('mkdir -p '.shellescape(expand('%:p:h'))):execute '!command' shellescape(arg, 1)যদি এর পরিবর্তে আপনার ব্যাং ব্যবহার করতে হয় তবে (শেলসকেপে দ্বিতীয় যুক্তি সহ) ব্যবহার করবেন না system()। যদি পালানো যুক্তিতে নতুন লাইন থাকে তবে ব্যাংগুলি ব্যবহার করবেন না।
ZyX

এবং আপনি অন্য ঝামেলাগুলি এড়াতে পারবেন না আমি আমার প্রথম কোড স্নিপেটে এড়াচ্ছি: প্রতিটি ভিএমআরসি সসোর্সিংয়ের পরে একাধিকবার শেল প্রবর্তন করা (মনে করে আপনি ভিিমআরসি আপডেটগুলি টেনে টানছেন :source ~/.vimrc) (এটি যা augroupএবং autocmd!এর জন্য রয়েছে), শেল চালু করার পরে স্ক্র্যাপ করা ভিউ কমান্ডগুলি (সেটির redraw!জন্য এটিই), সিউডো-ফাইলগুলি ব্যবহার করার ক্ষেত্রে আবর্জনা ডিরেক্টরি তৈরি করা (প্রথম কোডে স্নিপড করা হয়েছে এটি কেবল কোনও প্যাটার্নের সাথে ফাইলের সাথে মিলে যাচাই করা হয়, তবে দ্বিতীয়টিতে আমি এটিও পরীক্ষা করি &buftype) এবং কেস ডিরেক্টরিতে অকেজো শেল কল বিদ্যমান ( isdirectory()শর্ত)
জাইএক্স

1
@ জাইএক্স আপনার মতামতের জন্য ধন্যবাদ আমার যে সমস্যা নেই তা আমি সমাধান করতে চাই না। আমি আমার ফোল্ডারে কখনও বিশেষ অক্ষর (অর্থাত্ স্পেস) ব্যবহার করি না, সুতরাং%: p: h আমার পক্ষে ঠিকঠাক করে। আমি কখনই ভিএমআরসি উত্স করি না (আমি এর পরিবর্তে ভিমকে হত্যা করি এবং আবার খুলি) এবং সিউডোফাইলগুলি কী তা আমি জানি না। পুনরায় আঁকুন! আমার কাছে কিছু করার মতো মনে হচ্ছে না। তবে আমি সমস্ত কিছু সংক্ষিপ্ত করে তুলতে এক্সিকিউটিভ সরানোর আপনার পরামর্শটি পছন্দ করি। চিয়ার্স!
কিকিতো

1
আপনার বিশেষ চরিত্র আছে বা না তা কিছু যায় আসে না, এটি আপনার যত্ন নেওয়া উচিত। %কারও কাছে এটি ব্যবহার করার পরামর্শ দেওয়ার জন্য সম্প্রসারণের সাথে অনেক বেশি সমস্যা রয়েছে । সিউডো ফাইলগুলি একটি বড় গুচ্ছ প্লাগইনগুলিতে ব্যবহৃত হয় (যেমন পলাতক বা আমার অরুম), সুতরাং এটি যত্নশীল worth রিসোর্সিং ভিএমআরসিও একটি সাধারণ অনুশীলন। আপনি ভিএমআরসি-তে যা খুশি থাকতে পারেন, কেবল এটি উত্তর হিসাবে প্রস্তাব করবেন না। :silent! call mkdir(expand('%:p:h'), 'p')বৈকল্পিকটি ব্যবহার করে আমি উল্লেখ করেছি এবং তৃতীয়টি উল্লেখ করি নি: দুটি পয়েন্ট সমাধান !mkdirকরে: উইন্ডোতে কাজ করছে না।
জাইএক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.