Menjalankan kode Python di Vim

105

Saya menulis kode Python menggunakan Vim, dan setiap kali saya ingin menjalankan kode saya, saya mengetik ini di dalam Vim:

:w !python

Ini membuat frustasi, jadi saya mencari metode yang lebih cepat untuk menjalankan kode Python di dalam Vim. Mungkin menjalankan skrip Python dari terminal? Saya menggunakan Linux.

multigoodverse
sumber

Jawaban:

146

Bagaimana menambahkan autocmdke ~/.vimrc-file Anda , membuat pemetaan:

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>

maka Anda dapat menekan <F9>untuk mengeksekusi buffer saat ini denganpython

Penjelasan:

  • autocmd: perintah yang akan dijalankan Vim secara otomatis {event} (di sini: jika Anda membuka file python)
  • [i]map: membuat pintasan keyboard ke <F9>dalam mode sisip / normal
  • <buffer>: Jika beberapa buffer / file terbuka: cukup gunakan yang aktif
  • <esc>: keluar dari mode penyisipan
  • :w<CR>: menyimpan file Anda
  • !: menjalankan perintah berikut di shell Anda (coba :!ls)
  • %: diganti dengan nama file dari buffer aktif Anda. Tetapi karena dapat berisi hal-hal seperti spasi dan hal-hal "buruk" lainnya, praktik yang lebih baik adalah tidak menulis :python %, tetapi menggunakan:
  • shellescape: melarikan diri dari karakter khusus. The 1berarti dengan garis miring terbalik

TL; DR: Baris pertama akan bekerja dalam mode normal dan setelah Anda menekannya <F9>pertama-tama simpan file Anda dan kemudian jalankan file dengan python. Yang kedua melakukan hal yang sama, tetapi meninggalkan mode penyisipan terlebih dahulu

Kent
sumber
6
Bisakah Anda memperluas jawaban Anda dan menjelaskan di mana saya harus menambahkan baris itu. Di dalam file konfigurasi Vim mungkin? Saya seorang pendatang baru.
multigoodverse
5
@ArditSulce di file vimrc Anda, tambahkan baris:autocmd FileType python nnoremap <buffer> ....
Kent
2
Jika Anda menggunakan os x (dan saya menganggap unix) ".vimrc" ada di direktori home. Anda dapat memeriksanya dengan mengetik ': version' dalam mode perintah untuk memastikan Anda akan melihat baris bernama 'user vimrc file: "..."'
ThinkBonobo
Apakah ada cara untuk menyimpan dan menjalankan file yang sama, daripada hanya menjalankannya
Bharat
5
nnoremap <buffer> <F9> :!python %<cr>tampaknya bekerja di Vim 7.4.1689. Untuk apa shellescape itu?
Matt Kleinsmith
33

Masuk saja ke mode normal dengan menekan <esc>dan ketik:

! clear; python %

masukkan deskripsi gambar di sini

Penjelasan langkah demi langkah:

! memungkinkan Anda untuk menjalankan perintah terminal

clear akan mengosongkan layar terminal Anda

; mengakhiri perintah pertama, memungkinkan Anda untuk memperkenalkan perintah kedua

pythonakan menggunakan python untuk menjalankan skrip Anda (bisa diganti dengan rubymisalnya)

%menggabungkan nama file saat ini, meneruskannya sebagai parameter ke pythonperintah

Flavio Wuensche
sumber
28

Saya memiliki ini di file .vimrc saya:

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

Setelah saya selesai mengedit skrip Python, saya tinggal menekan <F5>. Skrip disimpan dan kemudian dieksekusi di layar kosong.

czayas
sumber
Terima kasih! Ini bekerja dengan cukup baik. Saya bertanya-tanya bagaimana cara mengatur pintasan ke mkunci plus ,kunci bukan F5kunci?
Jay Wong
Saya tidak melihat bagaimana ini menyimpan file terlebih dahulu?
Thomas Browne
Maaf, saya lupa menambahkan ": w". Saya mengoreksinya, dan menambahkan <Esc> juga.
czayas
2
Perlu dicatat bahwa ini dijalankan dalam Insertmode. Untuk eksekusi di Normalmodus penggunaan nmapbukan imap.
Marcin
17

Saya lebih suka keluaran Python dialihkan ke jendela Vim baru (dan jika jendela itu dibiarkan terbuka, perbarui isinya saat Anda menjalankan kode Python dengan fungsi ini):

" 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
FocusedWolf
sumber
Haruskah saya memasukkan ini ke dalam saya .vimrc? Jika tidak, bagaimana cara memberikan skrip ini ke vim? (Noob di sini)
Benjamin Chausse
1
@BenjaminChausse Maaf atas tanggapan yang tertunda. Saya melakukan tes dengan .vimrc yang berisi kode itu secara eksklusif dan bekerja dari apa yang saya tahu. Pengujian saya terbatas pada membuka file .py dan menekan F5 yang mengakibatkan keluaran python muncul di jendela vim terpisah. "bagaimana saya harus memberikan skrip ini ke vim?". Itu tergantung pada OS Anda. Saya menggunakan Windows jadi saya memiliki file teks C: \ Program Files (x86) \ Vim \ .vimrc yang berisi kode itu (Anda juga bisa menamainya "_vimrc" di Windows). Di Linux atau mac Anda akan memiliki file teks .vimrc di folder rumah Anda yaitu ~ / .vimrc
FocusedWolf
4
Meskipun kami menghargai bahwa ini mungkin membutuhkan banyak pekerjaan untuk Anda buat, memasukkan tautan paypal ke jawaban tidak terlalu tepat.
Martijn Pieters
11

Berdasarkan jawaban sebelumnya, jika Anda ingin melihat kode sambil melihat pada outputnya, Anda dapat menemukan perintah :ter( :terminal) yang berguna.

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

Menggunakan vert di baris kedua menjalankan kode dalam pemisahan vertikal, bukan horizontal.

Negatifnya adalah jika Anda tidak menutup jendela terpisah tempat kode dijalankan, Anda akan mengalami banyak pemisahan setelah beberapa kali proses (yang tidak terjadi dalam IDLE python asli di mana jendela keluaran yang sama digunakan kembali).

(Saya menyimpan garis-garis ini di dalam /home/user/.vimrc)

Senin
sumber
5

Ingatlah bahwa Anda dapat mengulangi perintah yang terakhir digunakan dengan @:, jadi yang perlu Anda ulangi hanyalah kedua karakter tersebut.

Atau Anda bisa menyimpan string w !pythonke salah satu register (seperti "amisalnya) dan kemudian tekan :<C-R>a<CR>untuk memasukkan konten register ake dalam baris perintah dan menjalankannya.

Atau Anda dapat melakukan apa yang saya lakukan dan peta <leader>zuntuk :!python %<CR>menjalankan file saat ini.

TankorSmash
sumber
3

Jika Anda tidak ingin melihat " :exec python file.py" dicetak setiap kali, gunakan ini:

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

Itu juga tidak mengacaukan statusbar powerline / vim-airline.

Jabba
sumber
3

Plugin: jupyter-vim

Jadi Anda bisa mengirim lines ( <leader>E), visual selection ( <leader>e) ke running jupyter-client(penggantian ipython)

masukkan deskripsi gambar di sini

Saya lebih suka memisahkan editor dan interpreter (masing-masing di cangkangnya). Bayangkan Anda mengirim perintah membaca input yang buruk ...

Tinmarino
sumber
2

Untuk penggunaan umum (jalankan python / haskell / ruby ​​/ C ++ ... dari vim berdasarkan filetype), ada plugin bagus yang disebut vim-quickrun . Ini mendukung banyak bahasa pemrograman secara default. Ini juga mudah dikonfigurasi, sehingga seseorang dapat menentukan perilaku yang disukai untuk jenis file apa pun jika diperlukan. Repo github tidak memiliki readme yang mewah, tetapi didokumentasikan dengan baik dengan file doc.

Yosh
sumber
2

Jawaban yang diterima berfungsi untuk saya (di Linux), tetapi saya ingin perintah ini juga menyimpan buffer sebelum dijalankan, jadi saya mengubahnya sedikit:

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

The :w <bar>menyimpan buffer KEMUDIAN menjalankan kode di dalamnya.

Alijah O'Connor
sumber
1

Metode sederhana adalah mengetik :saat dalam mode normal, lalu tekan tombol panah atas pada keyboard dan tekan Enter. Ini akan mengulangi perintah yang diketik terakhir di VIM.

multigoodverse
sumber
Anda dapat melakukan pencarian tambahan dengan mengetikkan karakter awal dari perintah sebelum menekan panah atas. Jika banyak perintah yang lalu saya melakukan a! python%, saya bisa:! lalu tekan panah atas, untuk hanya menelusuri perintah yang dimulai dengan!
shmup
1

Jika Anda ingin cepat melompat kembali melalui :wperintah Anda , hal yang keren adalah mengetik :wdan kemudian tekan panah atas Anda. Ini hanya akan menggilir perintah yang dimulai dengan w.

shmup
sumber
1

Saya memiliki ini di .vimrc saya:

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

yang menyimpan buffer saat ini dan menjalankan kode dengan hanya menampilkan Esc + F9

derwin
sumber
1

Anda juga dapat menggunakan skywind3000 / asyncrun.vim . Ini mirip dengan yang terdaftar di @FocusedWolf.

Mike
sumber
1

Anda dapat memperluas untuk bahasa apa pun dengan 1 pengikatan tombol dengan perintah augroup, misalnya:

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
Đạt Nguyễn Thành
sumber
1

Pikirkan tentang menggunakan garis shebang, sehingga Anda akan dapat menggunakannya dengan bahasa apa pun, tidak hanya Python.

Menambahkan shebang:

Tambahkan ini ke baris pertama skrip Anda:

#!/usr/bin/env python3

atau ini, jika Anda menggunakan Python 2:

#!/usr/bin/env python2

Peta kunci Vim:

Tambahkan ini ke Anda ~/.vimrc:

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

Jadikan file dapat dieksekusi:

Ketik Vim:

:!chmod +x %

atau di terminal:

chmod +x script_name.py

Penjelasan:

Ketika F7 ditekan dalam mode normal, Vim akan mencoba menjalankan file saat ini sebagai skrip bash. Kemudian juru bahasa bash akan melihat baris shebang dan memahami, bahwa file ini harus diteruskan ke Python (atau program lain jika diperlukan).

Anda juga akan dapat menjalankan skrip Anda dari terminal menggunakan namanya:

./script_name.py

alih-alih cara ini (itu juga akan berhasil):

python3 script_name.py
Саша Кошкин
sumber
0

Pemetaan .vimrc ini membutuhkan Conque Shell , tetapi mereplikasi perilaku Geany (dan editor X lainnya):

  • Tekan sebuah tombol untuk mengeksekusi
  • Dijalankan di gnome-terminal
  • Menunggu konfirmasi untuk keluar
  • Jendela menutup secara otomatis saat keluar

    :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; \" "')

pengguna2587717
sumber
0

Letakkan kursor Anda di kode di suatu tempat. Klik kanan dan pilih salah satu pilihan "Pilih" untuk menyorot kode Anda. Kemudian tekan Ctrl: dan Anda akan melihat prompt baru '<,>'

Sekarang ketik! Python dan lihat apakah itu berhasil.

Saya hanya menghabiskan waktu berhari-hari mencoba mencari tahu masalah yang sama !!! Saya menggunakan pengkodean:

s='My name'
print (s) 

Setelah saya mencabut semua rambut saya, akhirnya saya melakukannya dengan benar!

Bob Cressman
sumber
5
Menggunakan mouse bukan dengan cara vim
0xc0de
1
Tapi itu mungkin untuk dilakukan :% !python. %hanya berarti semua baris.
T. Chmelevskij
0

Alih-alih menempatkan pemetaan perintah di Anda .vimrc, letakkan pemetaan di ~/.vim/ftplugin/python.vimfile Anda (Windows $HOME\vimfiles\ftplugin\python.vim). Jika Anda tidak memiliki file atau direktori ini, buat saja. Dengan cara ini, kunci hanya dipetakan saat Anda membuka .pyfile atau file apa pun denganfiletype=python , karena Anda hanya akan menjalankan perintah ini pada skrip Python.

Untuk pemetaan sebenarnya, saya ingin dapat mengedit di Vim saat skrip dijalankan. Keluar dari jawaban @cazyas, saya memiliki yang berikut ini di ftplugin\python.vim(Windows) saya:

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

Ini akan menjalankan skrip Python saat ini di latar belakang. Untuk Linux ubah saja menjadi ini:

noremap <F5> <Esc>:w<CR>:!python % &<CR>
jpyams.dll
sumber
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>
Neo Mosaik
sumber