2009-03-02 18 views
32

मैं बहुत पाइथन त्वरित सिमुलेशन सामान करता हूं और मैं लगातार बचत कर रहा हूं (: डब्ल्यू) और फिर चल रहा है (: !!)। मैं सोच रहा हूं, क्या इन कार्यों को गठबंधन करने का कोई तरीका है। शायद एक "सेव और रन" कमांड।वीआईएम: एक ही समय में सहेजें और चलाएं?

आपकी मदद के लिए धन्यवाद।

+0

से प्रेरित आप मेरी प्रतिक्रिया पर एक नज़र डालें सकते हैं? मुझे लगता है कि यह आपके प्रश्न का सही जवाब देता है। –

उत्तर

25

विकल्प 1:

एक समारोह इस के समान लिखें और अपने स्टार्टअप सेटिंग में रखें:

function myex() 
    execute ':w' 
    execute ':!!' 
endfunction 

तुम भी एक कुंजी कॉम्बो मैप कर सकते करने के लिए it-- एक डॉक्स देखो।


विकल्प 2 (बेहतर): कीस्ट्रोक्स remapping के लिए प्रलेखन पर

देखो - आप एक सरल कुंजी remap के माध्यम से इसे पूरा करने में सक्षम हो सकता है। निम्नलिखित कार्य करता है, लेकिन "filename.py" हार्डकोड किया गया है। शायद आप वर्तमान फ़ाइल के साथ इसे प्रतिस्थापित करने के तरीके में खोद सकते हैं और समझ सकते हैं?

:map <F2> <Esc>:w<CR>:!filename.py<CR> 

मैपिंग के बाद, आप केवल कमांड मोड में F2 दबा सकते हैं।

imap, vmap, आदि ... विभिन्न तरीकों से मैपिंग हैं। उपर्युक्त केवल कमांड मोड पर लागू होता है। निम्नलिखित भी डालने मोड में काम करना चाहिए: विम मैनुअल की

:imap <F2> <Esc>:w<CR>:!filename.py<CR>a 

धारा 40.1 बहुत उपयोगी है।

+1

फ़ाइल नाम के लिए, विस्तृत करने के लिए विकल्प देखें। मुझे लगता है कि विस्तार ("%: पी") आपको फ़ाइल नाम मिलेगा। –

+7

बस परीक्षण किया गया। बहुत अच्छा काम करता है। "मानचित्र : w :!%: पी " अपने vimrc (उद्धरण के बिना) में जोड़ें। ! एक्स बिट सेट और '#/bin/bash/env पहली पंक्ति के रूप python' साथ अजगर स्क्रिप्ट के लिए – bernie

5

कमांड संयोजन | चरित्र के माध्यम से काम करता प्रतीत होता है, तो शायद :w|!your-command-here को एक अलग कुंजी संयोजन में एलियासिंग की तरह कुछ ऐसा लगता है?

5

ये रहा:

:nmap <F1> :w<cr>:!%<cr>

बचाने & रन (आप हालांकि n मोड में रहना होगा - बस मैं मोड के लिए esc और एक जोड़ने)

+0

,' नक्शा : डब्ल्यू: ./% '$ HOME/.vimrc ठीक काम करता है में। (मानचित्र या एनएमएपी, एफ 1 या अन्य)। – lllluuukke

-12
  1. परिवर्तित करने पर विचार निष्क्रिय। एफ 5 सब कुछ करता है।

  2. कोमोडो में स्विच करने पर विचार करें। आप एक कमांड को परिभाषित कर सकते हैं ताकि F5 सब कुछ कर सके।

1

मैं vim सुझावों विकी है निम्नलिखित है:

command! -complete=file -nargs=+ shell call s:runshellcommand(<q-args>) 
function! s:runshellcommand(cmdline) 
    botright vnew 
    setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap 
    call setline(1,a:cmdline) 
    call setline(2,substitute(a:cmdline,'.','=','g')) 
    execute 'silent $read !'.escape(a:cmdline,'%#') 
    setlocal nomodifiable 
    1 
endfunction 

लेकिन वह तीसरी पंक्ति में vnew करने के लिए नए बदल गया है, तो अजगर के लिए मैं निम्नलिखित है

map <F9> :w:Shell python %<cr><c-w> 

F9 मार आसानी से यांकिंग/बचत इत्यादि के लिए आउटपुट को एक नए लंबवत विभाजित स्क्रैच बफर में सहेजता है, चलाता है और डंप करता है ... सीडब्ल्यू भी हिट करता है, इसलिए मुझे इसे बंद करने के लिए केवल एच/सी दबाकर/मेरे कोड पर वापस जाना होगा।

11

autowrite विकल्प का उपयोग करें: देने, पीछे:

:set autowrite 

,, फ़ाइल की सामग्री लिखें अगर यह संशोधन किया गया है पर प्रत्येक: अगले, पिछले,: पहला,: पिछले,: रोक ,: निलंबित, टैग: :!,: बनाना, Ctrl-] और Ctrl-^आदेश [...]

49

ठीक है, आप जो खोज रहे हैं का सबसे सरल रूप पाइप आदेश है। यह आपको एक ही पंक्ति पर एकाधिक cmdline आदेश चलाने की अनुमति देता है। आपके मामले में, दो आदेश 'w` लिखते हैं और वर्तमान फ़ाइल निष्पादित करते हैं'! %: P`। यदि आपके पास एक विशिष्ट कमांड है जो आप वर्तमान फ़ाइल के लिए चलाते हैं, तो दूसरा आदेश बन जाता है, उदा। `पाइथन%: पी`। तो, आपके लिए सबसे आसान जवाब बन जाता है:

:w | ! %:p 
^^^ 
| | |--Execute current file 
| |--Chain two commands 
|--Save current file 

नोट करने के लिए एक आखिरी बात यह है कि सभी आदेशों को जंजीर नहीं किया जा सकता है। Vim docs के अनुसार, कुछ आदेश एक तर्क के रूप में एक पाइप स्वीकार करते हैं, और इस तरह श्रृंखला को तोड़ने के ...

+0

सभी एक आदेश में। यही वह जवाब है जिसे मैं देखना चाहता हूं, स्क्रिप्टिंग या मैपिंग नहीं। मुझे चेन कमांड के लिए इस्तेमाल होने वाले '|' के बारे में पता नहीं था। धन्यवाद! – dwerner

4

एक और संभावना:

au BufWriteCmd *.py write | !! 

हालांकि इस run हर बार जब आप बचत होगी, नहीं हो सकता है जो क्या तुम्हें चाहिए।

0

इसे बैश के अंदर बनाने का प्रयास करें।

एक सी फ़ाइल के मामले में t.c कहा जाता है, यह बहुत सुविधाजनक है:

vi t.c && cc t.c -o t && ./t 

और प्रतीकों (&&) सुनिश्चित करना है कि एक त्रुटि संदेश कमान श्रृंखला टूट जाता है।

पायथन के लिए यह और भी आसान हो सकता है:

vi t.py && python t.py 
2

यह वही है मैं अपने .vimrc में डाल रहा है और एक आकर्षण की तरह काम करता

nnoremap <leader>r :w<CR>:!!<CR> 
बेशक आप से पहले एक बार अपने शेल कमांड चलाने की आवश्यकता के

यह इसलिए जानता है कि निष्पादन करने के लिए क्या आदेश है।

पूर्व:

:!node ./test.js 
2

vim में, आप बस अपने वर्तमान बफर के किसी भी श्रेणी के लिए एक बाहरी कमांड के लिए (चाहे वह पार्टी, अजगर, या आप अजगर स्क्रिप्ट के मालिक हैं) रीडायरेक्ट कर सकता है।

# redirect whole buffer to python 
:%w !python 

अपने वर्तमान बफर के रूप में नीचे दो पंक्तियाँ होती लगता है,

import numpy as np 
print np.arange(12).reshape(3,4) 

तो :%w !python, यह चलेगा यह बचाया या नहीं हो। और अपने टर्मिनल पर नीचे की तरह प्रिंट कुछ,

[[ 0 1 2 3] 
[ 4 5 6 7] 
[ 8 9 10 11]] 
बेशक

, आप कुछ लगातार, जैसे, कुछ keymaps बना सकता है।

nnoremap <F8> :.w !python<CR> 
vnoremap <F8> :w !python<CR> 

पहले एक रन वर्तमान लाइन, दूसरा एक दृश्य दृश्य चयन, पायथन दुभाषिया के माध्यम से।

#!! be careful, in vim ':w!python' and ':.w !python' are very different, the 
first write (create or overwrite) a file named 'python' with contents of 
current buffer, the second redirect the selected cmdline range (here dot ., 
which mean current line) to external command (here 'python'). 

cmdline श्रृंखला के लिए,

:h cmdline-ranges 

जो सामान्य आदेश के विषय में एक नहीं नीचे, देखते हैं, एक cmdline नहीं।

:h command-range 

https://stackoverflow.com/a/19883963/3625404

+0

दरअसल, यह उत्तर अधिक आईडीई समान जवाब है। आधुनिक आईडीई 'रन' से पहले फ़ाइल को सहेज नहीं पाएंगे। मैं इसे ऊपर उठाता हूं। – minion

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