এমন একটি ডিরেক্টরিতে কীভাবে একটি ফাইল সংরক্ষণ করব যা এখনও বিদ্যমান নেই?


35

মনে করুন যে আমি এখনও তৈরি হয়নি এমন একটি ডিরেক্টরিতে একটি নতুন ফাইল সম্পাদনা করার জন্য ভিম শুরু করি:

vim nonExisitingDirectory/newFile.txt

ভিম খুশিতে আমাকে একটি খালি বাফার দেখাবে এবং আমি আমার নতুন ফাইলটি লেখা শুরু করতে পারি। তবে আমি যখন ডিস্কে ফাইলটি লিখতে চাই তখন আমি এই ত্রুটিটি পাই:

E212: Can't Open file for writing.

আমার ধারনা এটি কারণ কারণ ডিরেক্টরিটি এখনও বিদ্যমান নেই। আমার জন্য ডিরেক্টরি তৈরি করতে ভিমকে বাধ্য করার কোনও উপায় আছে?

উত্তর:


37

আমি যতদূর জানি এখানে এটি করার মতো কোনও সেটিংস বা কিছু নেই। তবে সব হারিয়ে যায় না, আমরা অবশ্যই BufWritePreঅটোমন্ডমটি ব্যবহার করতে পারি।
এটি ডিস্কে বাফার লেখার আগেই কার্যকর করা হয়। সুতরাং আমরা যদি ডিরেক্টরিটি উপস্থিত না থাকি তবে এটি তৈরি করতে পারি।

উদাহরণ স্বরূপ:

augroup Mkdir
  autocmd!
  autocmd BufWritePre *
    \ if !isdirectory(expand("<afile>:p:h")) |
        \ call mkdir(expand("<afile>:p:h"), "p") |
    \ endif
augroup END
  • ডিরেক্টরিটি উপস্থিত রয়েছে কিনা তা আমরা প্রথমে যাচাই করি isdirectory, অন্যথায় mkdirত্রুটি দেয়।
  • <afile>আমরা সংরক্ষণ করতে চাইছি ফাইল বোঝায়; :pএটি পুরো :hপথের নাম (আপেক্ষিকের পরিবর্তে) এ প্রসারিত করার জন্য একটি পরিবর্তনকারী এবং শেষ পাথের উপাদানটি (ফাইল) সরিয়ে দেয়।
  • আমরা mkdir()প্রয়োজন হলে কল । সমস্ত অভিভাবককে ডিরেক্টরি তৈরি করার pজন্য আমাদের পতাকাটি প্রয়োজন mkdir()(যেমন: এর ক্ষেত্রে nonexistent/more_nonexisting/file

আপনি অবশ্যই, mkdir()ভিম কমান্ডলাইন থেকে কমান্ডটি চালাতে পারেন , বা এটি একটি কী-বাইন্ডে আবদ্ধ করতে পারেন, যেমন:

nnoremap <Leader>m :call mkdir(expand("%:p:h"), "p")<CR>

আমি %পরিবর্তে এখানে ব্যবহার করেছি <afile>, যেহেতু এটি কেবলমাত্র স্বতঃআপনার মধ্যেই বৈধ ( %বর্তমানে সক্রিয় বাফারকে বোঝায়, :waউদাহরণস্বরূপ এটি কাজ করবে না ; <afile>অটোকএমডি ট্রিগারকারী বাফারের ফাইলনামকে বোঝায়)।

আপনি চাইলে ডিরেক্টরি লেখার আগে একটি নিশ্চয়তাও চাইতে পারেন। আরও বিশদের জন্য এই প্রশ্নটি দেখুন: আমি কীভাবে ভিফকে বুফরাইটপ্রে অটোকমন্ডে কোনও ফাইল লেখা থেকে আটকাতে পারি?


উপরের স্নিপেট প্রথম লেখায় ডিরেক্টরি তৈরি করবে ( :w)। আপনি চাইলে ডিরেক্টরিটি তৈরি করতে পারবেন যখন আপনি প্রথমে এটি খোলার সময় (অর্থাত্ টাইপ করার ঠিক পরে vim ...) এর BufNewFileপরিবর্তে অটোসএমডি ব্যবহার করে BufWritePre


Auto_mkdir নামে একটি প্লাগইন রয়েছে যা কার্যকরভাবে উপরেরটির মতো

এই পৃষ্ঠায় কিছুটা প্রসারিত স্নিপেট রয়েছে যা আপনাকে জিজ্ঞাসা করে যে আপনি ডিরেক্টরিটি প্রথমে তৈরি করতে চান, যা কিছুকে দরকারী হিসাবে বিবেচনা করতে পারে। এটি এনকোডিংয়ের ফাইল নাম লেখার আগে এটি রূপান্তরিত করেছে:

call mkdir(iconv(expand("%:p:h"), &encoding, &termencoding), 'p')

এটি নিশ্চিত হওয়া দরকার কিনা তবে আমি নিশ্চিত নই তবে আপনি যদি অনেকগুলি এনকোডিংগুলি মিশ্রিত করেন এবং অদ্ভুত ফাইলের নাম পান তবে আপনি এটি চেষ্টা করতে পারেন।


উপরের auto_mkdir2.vimসমস্তগুলি সহজ ইনস্টলেশনের জন্য একটি প্লাগইনে রেখেছি ।


3

আমি টিম পোপের কাছ থেকে একটি ভিআইএম প্লাগইন সুপারিশ করতে পারি যার নাম ভিম-নপুংসক যা অনেক চূড়ান্ত কার্যকর কমান্ডগুলি সংজ্ঞায়িত করে যখন উইমের সাথে ইউনিক্স / লিনাক্সে আপনার কাজ করা হয় ( এর বৈশিষ্ট্যগুলি দেখুন !)

ধরা যাক আপনি উইম দিয়ে খুলেন vim this/is/a/testএবং এর মধ্যে কোনও ডিরেক্টরি আগেই বিদ্যমান ছিল না। কেবল চালান :Mkdir!<CR>এবং ভিএম-হিজড়া এগুলি আপনার জন্য তৈরি করে (সহ mkdir -p), যাতে আপনি এখন নিজের ফাইলটি সংরক্ষণ করতে পারেন :w<CR>


2

:Wএকটি ফাইল এবং এর মূল ডিরেক্টরি তৈরি করতে ব্যবহার করুন :

function! s:WriteCreatingDirs()
  let l:file=expand("%")
  if empty(getbufvar(bufname("%"), '&buftype')) && l:file !~# '\v^\w+\:\/'
    let dir=fnamemodify(l:file, ':h')
    if !isdirectory(dir)
      call mkdir(dir, 'p')
    endif
  endif
  write
endfunction
command! W call s:WriteCreatingDirs()

(আপনার যোগ করুন vimrcজাইএক্স এর উত্তর এবং ড্যামিয়েন পোলেটের উত্তরগুলির সংমিশ্রণের ভিত্তিতে )।


1

ভ্যানিলা ভিমের সাথে অন্য কোনও উপায় (অতিরিক্ত কনফার্ট বা প্লাগইন ছাড়াই)। ভিমে:

:!mkdir -p /folder/you/want/
:w  #save file

অথবা

$ vim /folder/you/want/myfile.conf
$ ctrl+z # switch to the terminal then create the folders
$ mkdir -p /folder/you/want/
$ fg # return to Vim
$ :w  #save file

1

আমি আশা করি এমন একটি সংস্করণ অবদান রাখব যা উপরের উত্তরের উপর ভিত্তি করে কার্যপ্রবাহকে আরও অনেকগুলি প্রবাহিত করার জন্য অবদান রাখবে। আমি প্রায়শই বিভিন্ন প্রকল্প কাঠামোর বিস্তৃত নতুন ফাইল তৈরি করি। এই টুইটটি আমার যথেষ্ট পরিমাণ সময় সাশ্রয় করবে।

এখানে দুটি নির্ভরতা রয়েছে যা আমি ভাবতে পারি:

  1. আমার আমদানির বিবৃতিগুলির autochdirসাথে এটি কীভাবে কাজ করে তার কারণে আমি সেট করেছিলাম <C-x><C-f>
  2. saveas"পিছনে পাতার" (যদি আপনি হবে) এ একটি লুকানো বাফার শেষ বাফার তালিকার। আমি নিশ্চিত নই যে এটি যদি এমন সমস্ত আচরণ হয় যা সমস্ত ভিএম / এনভিম দৃষ্টান্ত উপভোগ করে।
  3. অন্যান্য এফওয়াইআই: আমি একটি ম্যাক ওএসে এনভিআইএম ব্যবহার করি

    " Auto magically Mkdir
    " ====================
    
    autocmd BufWritePre * call MkDir()
    
    function! MkDir()
       if !isdirectory(expand("<afile>:p:h"))
          let confirmation=confirm("Create a new directory?", "&Yes\n&No")
          if confirmation == 1
             call mkdir(expand("<afile>:p:h"), "p")
             lcd %:p:h
             saveas %:t
             echom "Created a new directory:" expand("<afile>:p:h")
             let buf_del = bufnr("$")
             exe "bd" . buf_del
          endif
          redraw
       endif
    endfunction
    
    " Conditionaly create the parent directory when writing to disk
    " <afile> refers to the file we are saving
    " :p is a modifier that expands to full filename
    " :h is a modifier that removes the file from full filename
    " :t is a modifier that generates the filename with extension
    " "p" is the flag that will create all the parent directories
    
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.