2012-05-01 6 views
22

जबकि विम में मैं blog_spec.rb नामक एक नई फ़ाइल बनाना चाहता हूं [working directory]/spec/models/ के अंदर, लेकिन निर्देशिका अभी तक मौजूद नहीं है?एक चरण में vim में नई निर्देशिका के अंदर फ़ाइल बनाएँ?

निर्देशिका बनाने और फ़ाइल को संपादित करने का सबसे तेज़ तरीका क्या है? कोई ऑनलाइनर?

उत्तर

6

निम्न आदेश का प्रयास करें:

function s:MKDir(...) 
    if   !a:0 
      \|| stridx('`+', a:1[0])!=-1 
      \|| a:1=~#'\v\\@<![ *?[%#]' 
      \|| isdirectory(a:1) 
      \|| filereadable(a:1) 
      \|| isdirectory(fnamemodify(a:1, ':p:h')) 
     return 
    endif 
    return mkdir(fnamemodify(a:1, ':p:h'), 'p') 
endfunction 
command -bang -bar -nargs=? -complete=file E :call s:MKDir(<f-args>) | e<bang> <args> 

यह आदेश के लिए एक स्थानापन्न के रूप में भेजा जाता है में निर्मित :e

स्थितियां जिसमें mkdir (क्रम में) नहीं चला जाता है:

  1. कमान तर्क
  2. कमान `generate filename` या `=generate_filename()` बैकटिक फ़ाइल नाम जनरेटर के साथ या +command/++opt स्विच के साथ चलाया जाता है के बिना चला जाता है।
  3. कमांड में एक से अधिक तर्क होते हैं या अनचाहे विशेष वर्ण हैं।
  4. तर्क एक निर्देशिका है।
  5. तर्क एक मौजूदा फ़ाइल है।
  6. तर्क एक मौजूदा निर्देशिका में एक फ़ाइल है।

पिछले तीन मामलों में कुछ भी नहीं किया जाना चाहिए, दूसरा और तीसरा मामला संभालना असंभव नहीं है, बस अधिक जटिल है।

cnoreabbrev <expr> e ((getcmdtype() is# ':' && getcmdline() is# 'e')?'E':'e') 

-complete=file लूट बातें:

ऊपर एक cnoreabbrev जोड़ने के लिए तैयार है यह न केवल पूरा होने जोड़ने के लिए, लेकिन यह भी तर्क (प्रसंस्करण इस प्रकार ` विस्तार के लिए जाँच और विशेष वर्ण उपस्थिति नहीं है समझ में आता है) और कई "फ़ाइल नाम" होने से मना कर देता है (इस प्रकार कोई ++ विकल्प नहीं)।

-bar आपको `="String"` का उपयोग करने में असमर्थ बनाता है क्योंकि " अब एक टिप्पणी शुरू करता है। -bar के बिना यह :e इम्यूलेशन नहीं है क्योंकि आप E file | another command नहीं कर सकते हैं।

एक और संस्करण:

function s:MKDir(...) 
    if   !a:0 
      \|| isdirectory(a:1) 
      \|| filereadable(a:1) 
      \|| isdirectory(fnamemodify(a:1, ':p:h')) 
     return 
    endif 
    return mkdir(fnamemodify(a:1, ':p:h'), 'p') 
endfunction 
command -bang -bar -nargs=? -complete=file E :call s:MKDir(<f-args>) | e<bang> <args> 
+0

की बजाय' spec' टाइप करना होगा, इसके लिए एक उचित प्लगइन था। –

29
:!mkdir -p spec/models 
:w spec/models/blog_spec.rb 
+4

दो कदम है कि ... – notJim

17

यदि आप अक्सर इसका सामना करते हैं तो इसके लिए एक आदेश जोड़ने के लिए उपयुक्त हो सकता है।

command -nargs=1 E execute('silent! !mkdir -p "$(dirname "<args>")"') <Bar> e <args> 

आप अपने .vimrc फ़ाइल में है कि लाइन जोड़ने, तो आप बस इसे इस तरह का उपयोग कर सकते हैं:

:E spec/models/blog_spec.rb 

संपादित करें यह केवल पर लिनक्स/मैक, नहीं विंडोज काम करेंगे।

+3

यह वह जगह है, मेरी राय में, स्वीकार किए जाते हैं जवाब की तुलना में बेहतर। यह मेरे लिए वास्तव में अच्छा काम किया। आपका बहुत बहुत धन्यवाद! – nickcoxdotme

+4

एक बात यह है कि इस उत्तर में पथ के लिए टैब-पूर्णता नहीं है। उपर्युक्त उदाहरण में, यदि 'spec' मॉडल मौजूद था लेकिन' मॉडल' नहीं था, तो आपको 'sp ' – graysonwright

2

मैं आम तौर पर लगता है कि माता-पिता निर्देशिका पहले से ही मौजूद नहीं है केवल के बाद फ़ाइल सहेजने का प्रयास।

This code: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 
+0

यह वही है जो मैं ढूंढ रहा था! कई बार, मैं इस बारे में सोचना नहीं चाहता कि फ़ाइल को संपादित करने से पहले पथ मौजूद है या नहीं। मैं केवल इसके बारे में चिंता करता हूं जब मैं फ़ाइल को सहेजने के लिए तैयार हूं। – verboze

संबंधित मुद्दे