2010-02-26 7 views
13

मेरे वर्तमान काम पर, हमारे पास कोडिंग-शैली मानकों हैं जो सामान्य रूप से अनुसरण किए जाने वाले लोगों से भिन्न होते हैं। सौभाग्य से, हमारे पास perltidy के लिए एक डिब्बाबंद आरसी फ़ाइल है जिसे मैं अपनी समीक्षा प्रक्रिया में सबमिट करने से पहले फ़ाइलों को दोबारा सुधारने के लिए आवेदन कर सकता हूं।मैं एक बफर पर perltidy चलाने के लिए कैसे स्क्रिप्ट कर सकते हैं?

मेरे पास emacs के लिए कोड है जिसका उपयोग मैं एक बफर पर कमांड चलाने के लिए करता हूं और बफर को आउटपुट के साथ प्रतिस्थापित करता हूं, जिसे मैंने इसके लिए अनुकूलित किया है। लेकिन मैं कभी-कभी emacs और vim के बीच वैकल्पिक होता हूं, और वहां वही क्षमताएं रखना चाहूंगा। मुझे यकीन है कि यह या कुछ समान सरल है और कई बार किया गया है और फिर से किया गया है। लेकिन मुझे विम-स्क्रिप्ट के किसी भी उदाहरण को खोजने में बहुत भाग्य नहीं मिला है जो मुझे लगता है कि ऐसा करने के लिए प्रतीत होता है। संक्षेप में, एक कुंजी कॉम्बो (जैसे Ctrl-F6, जो मैं emacs में उपयोग करता हूं) को हिट करने में सक्षम होने के लिए और perltidy द्वारा बफर को स्थानांतरित किया जा सकता है। जबकि मैं एक आरामदायक विम-उपयोगकर्ता हूं, मैं इस तरह की चीज को लिखने के लिए पूरी तरह से अनजान हूं।

+3

साथ संगतता के लिए @ mikew की टिप्पणी को शामिल करने हालांकि यह इस सवाल से संबंधित नहीं है, डेमियन कोनवे सब दिखा कर दिया गया है डेवलपर वर्क्स के लिए श्रृंखला में कूल विम चीजों के प्रकार: http://www.ibm.com/developerworks/linux/library/l-vim-script-1/index.html –

उत्तर

8

आदेश एक बाहरी कार्यक्रम के माध्यम से पूरे बफर फिल्टर करने के लिए है:

:nmap <C-F6> :%!command<CR> 

जोड़ा मस्ती के लिए:

:%!command 

सामान्य मोड में Ctrl-F6 करने के लिए इसे बाध्य करने के लिए ~/.vimrc में निम्नलिखित रखो :

:au Filetype perl nmap <C-F6> :%!command<CR> 

यह केवल एक पर्ल फ़ाइल संपादित करते समय फ़िल्टर को मानचित्र करेगा।

+1

प्रारंभिक निकालें: यदि इसे .vimrc में डालना है। संपादक के भीतर कमांड लाइन शुरू करने के लिए केवल इसकी आवश्यकता है। –

8

मेरे साफ आदेश:

command -range=% -nargs=* Tidy <line1>,<line2>! 
    \perltidy (your default options go here) <args> 

आप एक दृश्य चयन का उपयोग करें या एक श्रृंखला प्रदान करते हैं, तो यह चयनित श्रेणी साफ करेगा, अन्यथा यह पूरी फ़ाइल का प्रयोग करेंगे। आप उस बिंदु पर डिफ़ॉल्ट विकल्पों का सेट सेट कर सकते हैं (यदि आपके पास कोई है) जहां मैंने (your default options go here) लिखा था, लेकिन :Tidy पर आपके द्वारा प्रदान किए गए किसी भी तर्क को perltidy कमांडलाइन में जोड़ा जाएगा, जो आपके डिफ़ॉल्ट को ओवरराइड कर देगा। (यदि आप .perltidyrc का उपयोग करते हैं तो आपके पास डिफ़ॉल्ट तर्क नहीं हो सकते हैं - यह ठीक है - लेकिन फिर आप --profile=vim जैसे डिफॉल्ट को डिफ़ॉल्ट रूप से सेट करना चाहते हैं, जो केवल वही काम करता है जब आप vim में काम कर रहे हों।)

0

मैं लाइन उन्मुख दृश्य शिफ्ट + वी का उपयोग कर पाठ का चयन करने के लिए इस्तेमाल कर रहा हूँ और फिर मैं प्रेस: ​​ एक मैं !perltidy -pbp -et4 कहीं इतिहास में तो मैं एक बार या मारा तीर ऊपर अधिक है।

command -range=% -nargs=* Tidy <line1>,<line2>!perltidy -q 
noremap <C-F6> :Tidy<CR> 

और आगे एक और कदम:

4

हॉब्स 'जवाब एक कदम और आगे ले रहा है, तो आप एक शॉर्टकट कुंजी है कि आदेश मैप कर सकते हैं केवल आदेश के नक्शे जब आप (आप के बाद से शायद एक पर्ल बफर में हैं किसी भी अन्य भाषा पर perltidy चलाने के लिए) नहीं चाहता:

autocmd BufRead,BufNewFile *.pl,*.plx,*.pm command! -range=% -nargs=* Tidy <line1>,<line2>!perltidy -q 
autocmd BufRead,BufNewFile *.pl,*.plx,*.pm noremap <C-F6> :Tidy<CR> 

अब आप पूरी फ़ाइल का प्रारूपण करने के लिए एक सक्रिय चयन के बिना Ctrl-F6 दबा सकते हैं, या एक सक्रिय चयन के साथ सिर्फ इतना है कि खंड फ़ॉर्मेट करने के लिए।

10

@ हॉब्स उत्तर की कोशिश करने के बाद मैंने देखा कि perltidy के माध्यम से पूरे बफर को फ़िल्टर करते समय कर्सर बाइट 1 पर लौट आया, और मुझे मूल लाइन नंबर का मानसिक नोट बनाना पड़ा ताकि मैं :Tidy पूरा करने के बाद वापस जा सकूं।

तो @hobbs 'पर और @ इग्नेसियो के जवाब का निर्माण, मैं अपने .vimrc के लिए निम्न कहा:

"define :Tidy command to run perltidy on visual selection || entire buffer" 
command -range=% -nargs=* Tidy <line1>,<line2>!perltidy 

"run :Tidy on entire buffer and return cursor to (approximate) original position" 
fun DoTidy() 
    let l = line(".") 
    let c = col(".") 
    :Tidy 
    call cursor(l, c) 
endfun 

"shortcut for normal mode to run on entire buffer then return to current line" 
au Filetype perl nmap <F2> :call DoTidy()<CR> 

"shortcut for visual mode to run on the the current visual selection" 
au Filetype perl vmap <F2> :Tidy<CR> 

(बंद करने " अतः वाक्य रचना हाइलाइटिंग प्रयोजनों (आवश्यक नहीं के लिए टिप्पणी करने के लिए जोड़ा है, लेकिन वैध vim वाक्य रचना))

DoTidy() सबसे X बाइट्स पर अपनी मूल स्थिति प्लस या माइनस के लिए कर्सर वापस आ जाएगी, जहां X जोड़ा बाइट्स/मूल कर्सर की स्थिति के लिए perltidy रिश्तेदार द्वारा हटा दिया की संख्या है। लेकिन जब तक आप चीजों को साफ रखते हैं तब तक यह काफी मामूली है :)।

[विम संस्करण: 7.2]

संपादित करें: अपडेट किया गया DoTidy() पठनीयता के लिए और विम 7.0

+0

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

+0

मुझे नहीं पता कि कर्सर बचत कोड मेरे लिए क्यों काम नहीं कर रहा था। मैंने 'चलो पॉज़ = लाइन 2byte (लाइन ("।")) '' L = line ("।")' के साथ 'और' c = col ("।") 'फिर' कर्सर को कॉल करें (एल, सी) ' और वह काम करता है। शायद विम बहुत पुराना है? v7.0 – mikew

+0

@mikew का उपयोग करके मुझे लगता है कि आपका संस्करण वैसे भी अधिक समझ में आता है :) – hobbs

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