2011-05-19 19 views
9

मैं विम का उपयोग करता हूं और इसे मुझे php फ़ाइलों को सहेजने से रोकना चाहता हूं जिनमें पार्स त्रुटियां हैं। अगर मैं इसे प्राप्त करने के लिए "php -l < फ़ाइल >" उदाहरण के लिए उपयोग करना चाहूंगा, तो .vimrc में autocmd कैसा दिखता है?क्या वीम को एक php फ़ाइल की बचत को रोकना संभव है जिसमें पार्स त्रुटि है?

मैं जानता हूँ कि मैं

autocmd FileType php autocmd BufWritePre * !php -l % 

की तरह कुछ के साथ BufWritePre में हुक कर सकते हैं लेकिन मैं इसे निरस्त करने के लिए "लिखने" अगर php आदेश विफल रहता है चाहता हूँ।

+0

आप शायद कुछ शैल schript चला सकते हैं जो 'php -l% || chmod u-w% ' – Benoit

+0

देखें http://stackoverflow.com/questions/5542969/prevent-file-saving-during-bufwritepre –

उत्तर

4

आप हुक में न आया हुआ अपवाद फेंक सकते हैं और यह लिखने को रद्द कर देगा:

function s:RunPHP() 
    execute '!php -l' shellescape(@%, 1) 
    if v:shell_error | throw 'PHP failed' | endif 
endfunction 

function s:DefineBWPphpevent() 
    augroup Run_php 
     autocmd! BufWritePre <buffer> :call s:RunPHP() 
    augroup END 
endfunction 

augroup Run_php 
    autocmd! 
    autocmd FileType * :autocmd! Run_php BufWritePre <buffer> 
    autocmd FileType php :call s:DefineBWPphpevent() 
augroup END 

कोशिश यह भी ध्यान रखें

  1. shellescape: तुम यहाँ के रूप में :!shell_command % उपयोग नहीं करना चाहिए vim उचित एस्केपिंग नहीं करता है और यदि फ़ाइल नाम में स्पेस, उद्धरण, डॉलर, न्यूलाइन, जैसे विशेष नाम हैं, तो
  2. <buffer>* के स्थान पर दूसरे पैटर्न में फ़ाइल नाम शामिल हैं। आपका मूल आदेश php फ़ाइलों के लिए autocommand को परिभाषित नहीं करता है, इसके बजाय फ़ाइल फ़ाइल में से एक php है, तो यह सभी फ़ाइल प्रकारों के लिए autocommand को परिभाषित करता है।
  3. ऑटोकॉम समूह और :autocmd! एस टक्कर लगी है: वे डुप्लिकेटिंग ऑटोोकॉन्डैंड को रोकते हैं।

वैसे, क्या आप फ़ाइल के पुराने संस्करण पर php चलाकर हासिल करना चाहते हैं (यह BufWrite पूर्व घटना, है पहले फ़ाइल लिखा है तो यह होता है)? हो सकता है कि आपको कोड को प्रतिस्थापित करना चाहिए जो :w !php -l, :w !php -l - या :w !php -l /dev/stdin के साथ PHP को चलाता है, जो कि php स्वीकार करता है (मेरे पास यह मेरे सिस्टम पर नहीं है और वह नहीं चाहते हैं) के आधार पर चलाता है।

2

लेकिन मैं चाहता हूं कि PHP लिखने में विफल होने पर "लिखना" बंद कर दें।

जहां तक ​​मुझे पता है, यह वीआईएम के साथ संभव नहीं है। दस्तावेज़ीकरण इस क्षमता को या तो नहीं बताता है, इसलिए मुझे पूरा यकीन है कि बिना किसी हैक के किया जा सकता है। सवाल यह है कि आप क्या हासिल करने की कोशिश कर रहे हैं? मेरे पास एक स्क्रिप्ट है जो सुनिश्चित करता है कि जब मैं फ़ाइल को सहेजता हूं, तो मैं संस्करण नियंत्रण पर प्रतिबद्ध होने से पहले PHP में कोई पार्स त्रुटियां नहीं रखता हूं। यह एक साधारण पूर्व-प्रतिबद्ध हुक है, शायद वह कुछ जो काम करेगा?

यदि आप फ़ाइल को सहेजने से पहले वास्तव में लिनटिंग में रूचि रखते हैं, तो आप अपने आप को लिखे गए कमांड में "ZZ" और ": w" को फिर से लिखने में सक्षम हो सकते हैं, जो बदले में फाइल को लिफ्ट करता है (एक मामले में PHP फ़ाइल) और कोई त्रुटि पर बचाता है। मुझे यकीन नहीं है कि क्या आप इसे पुनः प्राप्त कर सकते हैं: डब्ल्यू, और इससे हल होने की तुलना में अधिक समस्याएं हो सकती हैं।

शायद एक सरल समाधान आपके द्वारा चुने गए कीस्ट्रोक पर एक कमांड बनाना होगा (उदा। एफ 5), और जो भी आप चाहते हैं उसे करें?