विम में पायथन कोड चल रहा है


104

मैं विम का उपयोग करके पायथन कोड लिख रहा हूं, और हर बार जब मैं अपना कोड चलाना चाहता हूं, तो मैं इसे विम के अंदर टाइप करता हूं:

:w !python

यह निराशाजनक हो जाता है, इसलिए मैं विम के अंदर पायथन कोड चलाने के लिए एक तेज विधि की तलाश कर रहा था। शायद एक टर्मिनल से पायथन लिपियों को निष्पादित करना? मैं लिनक्स का उपयोग कर रहा हूं।

जवाबों:


145

कैसे autocmdअपने जोड़ने के लिए ~/.vimrc, एक मानचित्रण बनाने के लिए:

autocmd FileType python map <buffer> <F9> :w<CR>:exec '!python3' shellescape(@%, 1)<CR>
autocmd FileType python imap <buffer> <F9> <esc>:w<CR>:exec '!python3' shellescape(@%, 1)<CR>

तब आप <F9>वर्तमान बफर को निष्पादित करने के लिए दबा सकते हैंpython

स्पष्टीकरण:

  • autocmd: आज्ञा दें कि विम स्वचालित रूप से निष्पादित करेगा {event}(यहां: यदि आप एक अजगर फ़ाइल खोलते हैं)
  • [i]map: <F9>इन्सर्ट / सामान्य मोड में एक कीबोर्ड शॉर्टकट बनाता है
  • <buffer>: यदि कई बफ़र्स / फ़ाइलें खुली हैं: बस सक्रिय एक का उपयोग करें
  • <esc>: इन्सर्ट मोड छोड़ना
  • :w<CR>: आपकी फ़ाइल सहेजता है
  • !: आपके शेल में निम्न कमांड चलाता है (कोशिश करें :!ls)
  • %: आपके सक्रिय बफर के फ़ाइल नाम से बदल दिया गया है। लेकिन चूंकि इसमें व्हॉट्सएप और अन्य "खराब" चीजें हो सकती हैं, इसलिए इसे लिखना बेहतर है :python %, लेकिन इसका उपयोग न करें:
  • shellescape: विशेष वर्णों से बचकर रहें। 1बैकस्लैश वाला साधन

TL; DR: पहली पंक्ति सामान्य मोड में काम करेगी और एक बार जब आप <F9>इसे दबाएंगे तो यह पहले आपकी फाइल को सेव करेगी और फिर अजगर के साथ फाइल को चलाएगी। दूसरा एक ही काम करता है, लेकिन पहले इन्सर्ट मोड छोड़ देता है


6
क्या आप कृपया अपने उत्तर का विस्तार कर सकते हैं और समझा सकते हैं कि मुझे उस पंक्ति को कहाँ जोड़ना चाहिए। शायद एक Vim विन्यास फाइल के अंदर? मैं एक नवजात हूं।
मल्टीगुडवर्स

5
अपनी vimrc फ़ाइल में @ArditSulce, एक पंक्ति जोड़ें:autocmd FileType python nnoremap <buffer> ....
Kent

2
यदि आप ओएस एक्स पर हैं (और मैं यूनिक्स मानता हूं) ".vimrc" होम डायरेक्टरी में है। आप यह जाँच कर सकते हैं कि कमांड मोड में ': वर्जन' टाइप करके जाँच करें कि आपको 'यूजर vimrc फाइल: "..." "नामक एक लाइन दिखाई देगी
ThinkBonobo

क्या एक ही फाइल को सहेजने और चलाने का एक तरीका है, केवल इसे चलाने के बजाय
Bharat

5
nnoremap <buffer> <F9> :!python %<cr>Vim 7.4.1689 में काम करने लगता है। इसके लिए शेलस्केप क्या है?
मैट क्लिंसमिथ

32

बस दबाकर सामान्य मोड पर जाएं <esc>:

! clear; python %

यहां छवि विवरण दर्ज करें

चरण दर चरण स्पष्टीकरण:

! आपको एक टर्मिनल कमांड चलाने की अनुमति देता है

clear आपकी टर्मिनल स्क्रीन खाली कर देगा

; पहले कमांड को समाप्त करता है, जिससे आप दूसरी कमांड शुरू कर सकते हैं

pythonअपनी स्क्रिप्ट को चलाने के लिए अजगर का उपयोग करेंगे (इसे rubyउदाहरण के साथ बदला जा सकता है )

%वर्तमान फ़ाइल नाम को समाप्‍त करता है, इसे pythonकमांड के पैरामीटर के रूप में पास करता है


27

मेरे पास मेरी .vimrc फ़ाइल में यह है:

imap <F5> <Esc>:w<CR>:!clear;python %<CR>

जब मैं पायथन स्क्रिप्ट का संपादन कर रहा होता हूं, तो मैं सिर्फ प्रेस करता हूं <F5>। स्क्रिप्ट को सहेजा जाता है और फिर रिक्त स्क्रीन में निष्पादित किया जाता है।


धन्यवाद! यह बहुत अच्छी तरह से काम करता है। मुझे आश्चर्य है कि मैं कुंजी के बजाय शॉर्टकट को mकुंजी प्लस ,कुंजी पर कैसे सेट कर सकता हूं F5?
जे वोंग

मैं यह नहीं देख रहा हूं कि यह फ़ाइल को पहले कैसे सहेज रहा है?
थॉमस ब्राउन ने

क्षमा करें, मैं ": w" जोड़ना भूल गया। मैंने इसे ठीक किया, और <Esc> को भी जोड़ा।
czayas

1
ध्यान दिया जाना चाहिए कि यह Insertमोड में निष्पादित होता है। के बजाय Normalमोड उपयोग में निष्पादन nmapके लिए imap
मार्सिन

16

मैं पायथन आउटपुट को एक नई विम विंडो पर पुनर्निर्देशित करना पसंद करता हूं (और यदि वह विंडो खुली रह जाती है तो अगली बार जब आप इस फ़ंक्शन के साथ पायथन कोड निष्पादित करते हैं, तो इसकी सामग्री को अपडेट करें):

" Bind F5 to save file if modified and execute python script in a buffer.
nnoremap <silent> <F5> :call SaveAndExecutePython()<CR>
vnoremap <silent> <F5> :<C-u>call SaveAndExecutePython()<CR>

function! SaveAndExecutePython()
    " SOURCE [reusable window]: https://github.com/fatih/vim-go/blob/master/autoload/go/ui.vim

    " save and reload current file
    silent execute "update | edit"

    " get file path of current file
    let s:current_buffer_file_path = expand("%")

    let s:output_buffer_name = "Python"
    let s:output_buffer_filetype = "output"

    " reuse existing buffer window if it exists otherwise create a new one
    if !exists("s:buf_nr") || !bufexists(s:buf_nr)
        silent execute 'botright new ' . s:output_buffer_name
        let s:buf_nr = bufnr('%')
    elseif bufwinnr(s:buf_nr) == -1
        silent execute 'botright new'
        silent execute s:buf_nr . 'buffer'
    elseif bufwinnr(s:buf_nr) != bufwinnr('%')
        silent execute bufwinnr(s:buf_nr) . 'wincmd w'
    endif

    silent execute "setlocal filetype=" . s:output_buffer_filetype
    setlocal bufhidden=delete
    setlocal buftype=nofile
    setlocal noswapfile
    setlocal nobuflisted
    setlocal winfixheight
    setlocal cursorline " make it easy to distinguish
    setlocal nonumber
    setlocal norelativenumber
    setlocal showbreak=""

    " clear the buffer
    setlocal noreadonly
    setlocal modifiable
    %delete _

    " add the console output
    silent execute ".!python " . shellescape(s:current_buffer_file_path, 1)

    " resize window to content length
    " Note: This is annoying because if you print a lot of lines then your code buffer is forced to a height of one line every time you run this function.
    "       However without this line the buffer starts off as a default size and if you resize the buffer then it keeps that custom size after repeated runs of this function.
    "       But if you close the output buffer then it returns to using the default size when its recreated
    "execute 'resize' . line('$')

    " make the buffer non modifiable
    setlocal readonly
    setlocal nomodifiable
endfunction

क्या मुझे अपने अधिकार में प्रवेश करना चाहिए .vimrc? यदि नहीं, तो मुझे यह स्क्रिप्ट कैसे देनी चाहिए? (नोब यहाँ)
बेंजामिन चौसे

1
देरी से प्रतिक्रिया के लिए @BenjaminChausse क्षमा करें। मैंने एक .vimrc के साथ एक परीक्षण किया था जिसमें विशेष रूप से उस कोड को शामिल किया गया था और यह उस काम से था जो मैं बता सकता था। मेरा परीक्षण एक .py फ़ाइल खोलने और F5 मारने तक सीमित था जिसके परिणामस्वरूप अजगर उत्पादन एक अलग विम विंडो में दिखाई दे रहा था। "मुझे यह स्क्रिप्ट कैसे देनी चाहिए?" यह आपके OS पर निर्भर करता है। मैं Windows का उपयोग कर रहा हूं, इसलिए मेरे पास C: \ Program Files (x86) \ Vim \ .vimrc पाठ फ़ाइल है जिसमें वह कोड है (आप इसे "_vimrc" भी नाम दे सकते हैं)। लिनक्स या मैक में आपके पास अपने होम फोल्डर में एक .vimrc टेक्स्ट फाइल होगी अर्थात ~ / .vimrc
FocusedWolf

2
जबकि हम सराहना करते हैं कि यह आपको बनाने में बहुत काम ले सकता है, एक जवाब में पेपैल लिंक में डालना वास्तव में उचित नहीं है।
मार्टिन पीटर्स

10

पिछले जवाब पर बिल्डिंग, यदि आप कोड को देखने के लिए जब तुम मिल सकता है अपने 'आउटपुट को देखकर पसंद :ter( :terminal) उपयोगी होती है।

autocmd Filetype python nnoremap <buffer> <F5> :w<CR>:ter python2 "%"<CR>
autocmd Filetype python nnoremap <buffer> <F6> :w<CR>:vert ter python3 "%"<CR>

vertदूसरी पंक्ति में उपयोग करना क्षैतिज के बजाय ऊर्ध्वाधर विभाजन में कोड चलाता है।

इसका नकारात्मक यह है कि यदि आप विभाजित-विंडो को बंद नहीं करते हैं, जहां कोड चलता था, तो कई रन के बाद आपके पास कई विभाजन होंगे (जो मूल अजगर IDLE में नहीं होता है जहां समान आउटपुट विंडो का पुन: उपयोग होता है)।

(मैं इन पंक्तियों को अंदर रखता हूं /home/user/.vimrc)


5

ध्यान रखें कि आप अंतिम उपयोग किए गए आदेश को दोहराने में सक्षम हैं @:, इसलिए आपको केवल उन दो चरित्रों को दोहराना होगा।

या आप w !pythonरजिस्टरों में से एक में स्ट्रिंग को बचा सकते हैं ( "aउदाहरण के लिए) और फिर कमांडलाइन में :<C-R>a<CR>रजिस्टर की सामग्री डालने aऔर इसे चलाने के लिए हिट करें ।

या फिर आप मुझे क्या करना है और नक्शा कर सकते हैं <leader>zकरने के लिए :!python %<CR>वर्तमान फ़ाइल को चलाने के लिए।


3

यदि आप :exec python file.pyहर बार मुद्रित नहीं देखना चाहते हैं , तो इसका उपयोग करें:

nnoremap <F9> :echo system('python2 "' . expand('%') . '"')<cr>
nnoremap <F10> :echo system('python3 "' . expand('%') . '"')<cr>

इसने मेरी पॉवरलाइन / विम-एयरलाइन स्टेटसबार को भी गड़बड़ नहीं किया।


3

प्लगइन: जुपिटर-विम

आप लाइनों (भेज सकते हैं तो <leader>E), दृश्य चयन ( <leader>eएक चल रहा है करने के लिए) jupyter-client(के प्रतिस्थापन ipython)

यहां छवि विवरण दर्ज करें

मैं अलग संपादक और दुभाषिया (इसके खोल में प्रत्येक) को पसंद करता हूं। कल्पना कीजिए कि आप एक खराब इनपुट रीडिंग कमांड भेजते हैं ...


2

जेनेरिक उपयोग (चलाने के लिए अजगर / रूबी / रूबी / सी ++ ... विम के आधार पर filetype), एक अच्छा प्लगइन है जिसे विम-क्व्रुन कहा जाता है । यह डिफ़ॉल्ट रूप से कई प्रोग्रामिंग भाषाओं का समर्थन करता है। यह आसानी से कॉन्फ़िगर करने योग्य है, इसलिए, यदि आवश्यक हो तो कोई भी किसी भी फ़ाइल प्रकार के लिए पसंदीदा व्यवहारों को परिभाषित कर सकता है। गितुब रेपो में एक फैंसी रीमेक नहीं है, लेकिन यह डॉक फ़ाइल के साथ अच्छी तरह से प्रलेखित है।


2

स्वीकृत उत्तर मेरे लिए (लिनक्स पर) काम करता है, लेकिन मैं चाहता था कि यह कमांड चलने से पहले बफर को भी बचा ले, इसलिए मैंने इसे थोड़ा संशोधित किया:

nnoremap <buffer> <F9> :w <bar> :exec '!python' shellescape(@%, 1)<cr>

:w <bar>फिर बफर की बचत होती है उस में कोड चलाता है।


1

एक साधारण विधि :सामान्य मोड में रहते हुए टाइप करना होगा , और फिर कीबोर्ड पर अप एरो की दबाएं और एंटर दबाएं। यह VIM पर अंतिम टाइप किए गए आदेशों को दोहराएगा।


आप ऊपर के तीर को दबाने से पहले कमांड के शुरुआती अक्षरों को टाइप करके एक वृद्धिशील खोज कर सकते हैं। अगर कई आदेशों से पहले मैंने किया था! अजगर%, मैं कर सकता था:! फिर ऊपर तीर दबाएं, केवल उन कमांड के माध्यम से चक्र करें जो इसके साथ शुरू होते हैं!
shmup

1

यदि आप जल्दी से अपने :wआदेशों के माध्यम से वापस कूदना चाहते हैं , तो एक अच्छी बात यह है कि टाइप करें :wऔर फिर अपने ऊपर तीर दबाएं। यह केवल उन कमांड के माध्यम से चक्र करेगा जो इसके साथ शुरू होते हैं w


1

मेरे पास मेरे .vimrc पर है:

"map <F9> :w<CR>:!python %<CR>"

जो वर्तमान बफ़र को बचाता है और केवल Esc + F9 के साथ कोड निष्पादित करता है



1

आप उदाहरण के लिए, एग्रुप कमांड के साथ 1 कीबाइंडिंग के साथ किसी भी भाषा के लिए विस्तार कर सकते हैं:

augroup rungroup
    autocmd!
    autocmd BufRead,BufNewFile *.go nnoremap <F5> :exec '!go run' shellescape(@%, 1)<cr>
    autocmd BufRead,BufNewFile *.py nnoremap <F5> :exec '!python' shellescape(@%, 1)<cr>
augroup END

1

शेबंग लाइन का उपयोग करने के बारे में सोचें, ताकि आप पायथन ही नहीं, किसी भी भाषा के साथ इसका उपयोग कर पाएंगे।

शेबंग जोड़ना:

इसे अपनी स्क्रिप्ट की पहली पंक्ति में जोड़ें:

#!/usr/bin/env python3

या यह, यदि आप पायथन 2 का उपयोग कर रहे हैं:

#!/usr/bin/env python2

विम कीमैप:

इसे अपने में जोड़ें ~/.vimrc:

nmap <F7> :w<cr>:!clear;"%:p"<cr>

फ़ाइल निष्पादन योग्य बनाएं:

विम में टाइप करें:

:!chmod +x %

या टर्मिनल में:

chmod +x script_name.py

स्पष्टीकरण:

जब F7 को सामान्य मोड में दबाया जाता है, तो विम वर्तमान फ़ाइल को बैश स्क्रिप्ट के रूप में निष्पादित करने का प्रयास करेगा। फिर बैश दुभाषिया शेबंग लाइन को देखेगा और समझेगा, कि इस फाइल को पाइथन (या किसी अन्य प्रोग्राम की आवश्यकता होने पर) पास किया जाना चाहिए।

इसके अलावा, आप टर्मिनल से अपनी स्क्रिप्ट को चलाने में सक्षम होंगे इसका नाम:

./script_name.py

इस तरह के बजाय (यह भी काम करेगा):

python3 script_name.py

0

इस .vimrc मानचित्रण को Conque Shell की आवश्यकता है , लेकिन यह Geany (और अन्य X संपादकों के) व्यवहार की नकल करता है:

  • निष्पादित करने के लिए एक कुंजी दबाएं
  • सूक्ति-टर्मिनल में निष्पादित
  • बाहर निकलने के लिए पुष्टि की प्रतीक्षा करता है
  • बाहर निकलने पर विंडो अपने आप बंद हो जाती है

    :let dummy = conque_term#subprocess('gnome-terminal -e "bash -c \"python ' . expand("%") . '; answer=\\\"z\\\"; while [ $answer != \\\"q\\\" ]; do printf \\\"\nexited with code $?, press (q) to quit: \\\"; read -n 1 answer; done; \" "')


0

अपना कर्सर कहीं कोड में रखें। अपने कोड को हाइलाइट करने के लिए "चयन करें" विकल्पों में से एक पर राइट क्लिक करें और चुनें। इसके बाद Ctrl दबाएं: और आपको नया प्रांप्ट '<,>' दिखाई देगा

अब टाइप करें! अजगर और देखें कि क्या काम करता है।

मैं सिर्फ उसी समस्या का पता लगाने के लिए दिन बिताता हूँ !!! मैंने कोडिंग का उपयोग किया:

s='My name'
print (s) 

अपने सारे बाल बाहर निकालने के बाद, मैंने आखिरकार इसे सही कर लिया!


5
एक
अजीब

1
लेकिन ऐसा करना संभव है :% !python%बस सभी लाइनों का मतलब है।
टी। शेमलेव्स्क

0

कमांड मैपिंग को अपने में डालने के बजाय .vimrc, मैपिंग को अपनी ~/.vim/ftplugin/python.vimफ़ाइल (विंडोज $HOME\vimfiles\ftplugin\python.vim) में डालें । यदि आपके पास यह फ़ाइल या निर्देशिका नहीं है, तो बस उन्हें बनाएं। इस तरह से कुंजी केवल मैप की जाती है जब आप किसी .pyफ़ाइल या किसी फ़ाइल को खोलते हैं filetype=python, क्योंकि आप केवल पायथन स्क्रिप्ट पर इस कमांड को चला रहे होंगे।

वास्तविक मानचित्रण के लिए, मुझे स्क्रिप्ट चलाने के दौरान विम में संपादन करने में सक्षम होना पसंद है। @Cazyas के उत्तर से हटकर, मेरे पास मेरे ftplugin\python.vim(विंडोज) में निम्नलिखित हैं :

noremap <F5> <Esc>:w<CR>:!START /B python %<CR>

यह पृष्ठभूमि में वर्तमान पायथन लिपि को चलाएगा। लिनक्स के लिए बस इसे इसे बदलें:

noremap <F5> <Esc>:w<CR>:!python % &<CR>

0
" run current python file to new buffer
function! RunPython()
    let s:current_file = expand("%")
    enew|silent execute ".!python " . shellescape(s:current_file, 1)
    setlocal buftype=nofile bufhidden=wipe noswapfile nowrap
    setlocal nobuflisted
endfunction
autocmd FileType python nnoremap <Leader>c :call RunPython()<CR>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.