Python kodunu Vim'de çalıştırma


106

Vim kullanarak Python kodu yazıyorum ve kodumu her çalıştırmak istediğimde bunu Vim'e yazıyorum:

:w !python

Bu sinir bozucu oluyor, bu yüzden Vim içinde Python kodunu çalıştırmak için daha hızlı bir yöntem arıyordum. Python betiklerini bir terminalden çalıştırmak olabilir mi? Linux kullanıyorum.

Yanıtlar:


151

Nasıl ekleme hakkında autocmdsizin için ~/.vimrcbir eşleme oluşturarak, -File:

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>

o zaman <F9>mevcut arabelleği çalıştırmak için tuşuna basabilirsiniz .python

Açıklama:

  • autocmd: Vim'in otomatik olarak çalıştıracağı komut {event}(burada: bir python dosyası açarsanız)
  • [i]map: <F9>ekleme / normal mod için bir klavye kısayolu oluşturur
  • <buffer>: Birden fazla arabellek / dosya açıksa: sadece aktif olanı kullanın
  • <esc>: ekleme modundan çıkma
  • :w<CR>: dosyanızı kaydeder
  • !: kabuğunuzda aşağıdaki komutu çalıştırır (deneyin :!ls)
  • %: etkin arabelleğinizin dosya adı ile değiştirilir. Ancak boşluk ve diğer "kötü" şeyler gibi şeyler içerebileceğinden, yazmak yerine :python %şunları kullanmak daha iyidir :
  • shellescape: özel karakterlerden kaçın. 1Ters eğik çizgi araçları

TL; DR: İlk satır normal modda çalışır ve bir kez bastığınızda <F9>önce dosyanızı kaydeder ve ardından dosyayı python ile çalıştırır. İkincisi de aynı şeyi yapar, ancak önce ekleme modunu bırakır


6
Lütfen cevabınızı genişletin ve bu satırı nereye eklemem gerektiğini açıklar mısınız? Bir Vim yapılandırma dosyasının içinde belki? Ben yeniyim.
multigoodverse

5
@ArditSulce, vimrc dosyanıza bir satır ekleyin:autocmd FileType python nnoremap <buffer> ....
Kent

2
Os x kullanıyorsanız (ve unix olduğunu varsayıyorum) ".vimrc" ana dizinde. Bunu, komut modunda ': version' yazarak 'user vimrc dosyası: "..."' adlı bir satır göreceğinizi kontrol edebilirsiniz
ThinkBonobo

Aynı dosyayı çalıştırmak yerine kaydetmenin ve çalıştırmanın bir yolu var mı
Bharat

5
nnoremap <buffer> <F9> :!python %<cr>Vim 7.4.1689'da çalışıyor gibi görünüyor. Shellescape ne için?
Matt Kleinsmith

36

Düğmesine basarak normal moda gidin <esc>ve şunu yazın:

! clear; python %

görüntü açıklamasını buraya girin

Adım adım açıklama:

! bir terminal komutu çalıştırmanıza izin verir

clear terminal ekranınızı boşaltacak

; ilk komutu sona erdirerek ikinci bir komut vermenize

pythonbetiğinizi çalıştırmak için python kullanacak ( rubyörneğin ile değiştirilebilir )

%geçerli dosya adını bir parametre olarak pythonkomuta aktararak birleştirir


28

Bu .vimrc dosyamda var:

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

Bir Python komut dosyasını düzenlemeyi bitirdiğimde, sadece tuşuna basıyorum <F5>. Komut dosyası kaydedilir ve ardından boş bir ekranda yürütülür.


Teşekkür ederim! Oldukça iyi çalışıyor. Acaba kısayolu tuş yerine martı ,tuşu olarak ayarlayabilir miyim F5?
Jay Wong

Bunun önce dosyayı nasıl kaydettiğini görmüyorum?
Thomas Browne

Üzgünüm, ": w" eklemeyi unuttum. Düzeltdim ve <Esc> de ekledim.
czayas

2
Bunun Insertmodda yürütüldüğüne dikkat edilmelidir . NormalModda yürütmek için nmapyerine kullanın imap.
Marcin

17

Python çıktısının yeni bir Vim penceresine yönlendirilmesini tercih ederim (ve bu pencere açık bırakılırsa, bu işlevle Python kodunu bir sonraki çalıştırmanızda içeriğini güncelleyin):

" 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

Bunu doğrudan kendime .vimrcmi girmeliyim ? Değilse, bu komut dosyasını vim'e nasıl vermeliyim? (Noob burada)
Benjamin Chausse

1
@BenjaminChausse Geciken yanıt için özür dilerim. Bir .vimrc ile yalnızca bu kodu içeren bir test yaptım ve anlayabildiğim kadarıyla çalıştı. Testim, bir .py dosyasını açmak ve F5'e basmakla sınırlıydı, bu da python çıktısının ayrı bir vim penceresinde görünmesine neden oldu. "Bu betiği vim'e nasıl vermeliyim?". İşletim sisteminize bağlıdır. Windows kullanıyorum, bu yüzden bu kodu içeren bir C: \ Program Files (x86) \ Vim \ .vimrc metin dosyasına sahibim (Windows'ta "_vimrc" olarak da adlandırabilirsiniz). Linux veya Mac'te, ana klasörünüzde bir .vimrc metin dosyanız olur, yani ~ / .vimrc
FocusedWolf

4
Bunun yaratmanız için çok fazla çalışma gerektirdiğini takdir etsek de, bir cevaba paypal bağlantıları eklemek gerçekten uygun değildir.
Martijn Pieters

11

Önceki cevaplardan yola çıkarak, kodu çıktısına bakarken görmek isterseniz, :ter( :terminal) komutunu yararlı bulabilirsiniz .

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

vertİkinci satırda kullanmak , kodu yatay yerine dikey bölmede çalıştırır.

Bunun olumsuz yanı, kodun çalıştığı bölme penceresini kapatmazsanız, birden çok çalıştırmadan sonra birçok bölünmeye sahip olursunuz (bu, aynı çıktı penceresinin yeniden kullanıldığı orijinal python IDLE'de olmaz).

(Bu satırları içeride tutuyorum /home/user/.vimrc)


5

Son kullanılan komutu ile tekrarlayabileceğinizi unutmayın @:, böylece tekrarlamanız gereken tek şey bu iki karakterdir.

Veya dizeyi w !pythonkayıtlardan birine kaydedebilir ( "aörneğin) ve ardından :<C-R>a<CR>yazmaç içeriğini akomut satırına eklemek ve çalıştırmak için tuşuna basabilirsiniz.

Yoksa benim yapmak ve harita ne yapabilirim <leader>zetmek :!python %<CR>Geçerli dosyayı çalıştırın.


4

Eklenti: jupyter-vim

Eğer çizgiler (gönderebilir Yani <leader>E), görsel seçimi ( <leader>ebir hareketi sayesinde) jupyter-client(değiştirilmesini ipython)

görüntü açıklamasını buraya girin

Editör ve tercümanı ayırmayı tercih ederim (her biri kendi kabuğunda). Hatalı bir giriş okuma komutu gönderdiğinizi hayal edin ...


3

:exec python file.pyHer seferinde " " yazdırıldığını görmek istemiyorsanız , şunu kullanın:

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

Powerline / vim-airline durum çubuğumu da bozmadı.


2

Genel kullanım için (python / haskell / ruby ​​/ C ++ ... komutunu vim'den çalıştırınfiletype ), vim-quickrun adında güzel bir eklenti var . Varsayılan olarak birçok programlama dilini destekler. Ayrıca kolayca yapılandırılabilir, böylece gerekirse herhangi bir dosya türü için tercih edilen davranışlar tanımlanabilir. Github repo'sunun süslü bir benioku dosyası yoktur, ancak doc dosyasıyla iyi bir şekilde belgelenmiştir.


2

Kabul edilen cevap benim için çalışıyor (Linux'ta), ancak bu komutun çalıştırmadan önce tamponu da kaydetmesini istedim, bu yüzden onu biraz değiştirdim:

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

:w <bar>SONRA tampon kaydeder içinde kod çalışır.


2

Shebang satırını kullanmayı düşünün, böylece onu yalnızca Python'da değil, herhangi bir dilde de kullanabilirsiniz.

Shebang ekleniyor:

Bunu komut dosyanızın ilk satırına ekleyin:

#!/usr/bin/env python3

veya bu, Python 2 kullanıyorsanız:

#!/usr/bin/env python2

Vim tuş eşlemesi:

Bunu şuraya ekle ~/.vimrc:

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

Dosyayı yürütülebilir yapın:

Vim yazın:

:!chmod +x %

veya terminalde:

chmod +x script_name.py

Açıklama:

Normal modda F7'ye basıldığında, Vim mevcut dosyayı bash betiği olarak çalıştırmayı deneyecektir. Daha sonra bash yorumlayıcısı shebang satırını görecek ve bu dosyanın Python'a (veya gerekirse başka bir programa) aktarılması gerektiğini anlayacaktır.

Ayrıca komut dosyanızı terminalin adını kullanarak çalıştırabileceksiniz:

./script_name.py

bunun yerine (bu da işe yarar):

python3 script_name.py

1

Basit bir yöntem :, normal moddayken yazmak ve ardından klavyede yukarı ok tuşuna ve ardından Enter tuşuna basmak olabilir. Bu, VIM'de son yazılan komutları tekrarlayacaktır.


Yukarı oka basmadan önce komutun başlangıç ​​karakterlerini yazarak artımlı bir arama yapabilirsiniz. Birçok komut önce bir yaptım! python%, yapabilirim:! sonra sadece ile başlayan komutlar arasında geçiş yapmak için yukarı oka basın!
shmup

1

:wKomutlarınız arasında hızlıca geri dönmek istiyorsanız , harika bir şey yazıp :wyukarı okunuza basmaktır. Yalnızca ile başlayan komutlar arasında geçiş yapacaktır w.


1

Bu .vimrc dosyamda var:

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

bu, geçerli arabelleği kaydeder ve kodu yalnızca Esc + F9 öncesiyle çalıştırır



1

Augroup komutuyla 1 tuş bağlama ile herhangi bir dil için genişletebilirsiniz, örneğin:

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



0

Bu .vimrc eşlemesi Conque Shell gerektirir , ancak Geany (ve diğer X düzenleyicilerinin) davranışını kopyalar:

  • Yürütmek için bir tuşa basın
  • Gnome-terminalde yürütür
  • Çıkmak için onay bekler
  • Çıkışta pencere otomatik olarak kapanır

    :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

İmlecinizi kodun içinde bir yere koyun. Kodunuzu vurgulamak için sağ tıklayın ve "Seç" seçeneklerinden birini seçin. Sonra Ctrl: tuşuna basın, yeni '<,>' istemini göreceksiniz.

Şimdi! Python yazın ve işe yarayıp yaramadığını görün.

Günlerimi aynı sorunu çözmeye çalışarak geçiriyorum !!! Kodlamayı kullandım:

s='My name'
print (s) 

Tüm saçımı çıkardıktan sonra, sonunda doğru anladım!


5
Fareyi vim şeklinde kullanma
0xc0de

1
Ama yapmak mümkün :% !python. %sadece tüm satırlar anlamına gelir.
T.Chmelevskij

0

Komut eşlemesini .vimrckendi ~/.vim/ftplugin/python.vimdosyanıza koymak yerine, eşlemeyi dosyanıza yerleştirin (Windows $HOME\vimfiles\ftplugin\python.vim). Bu dosya veya dizinlere sahip değilseniz, sadece oluşturun. Bu şekilde, anahtar yalnızca bir .pydosyayı veya herhangi bir dosyayı açtığınızda eşlenir filetype=python, çünkü bu komutu yalnızca Python komut dosyalarında çalıştıracaksınız.

Gerçek eşleme için, komut dosyası çalışırken Vim'de düzenleme yapabilmeyi seviyorum. @Cazyas'ın cevabından çıkarak, ftplugin\python.vim(Windows) cihazımda aşağıdakilere sahibim :

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

Bu, mevcut Python betiğini arka planda çalıştıracaktır. Linux için bunu şu şekilde değiştirin:

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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.