Chạy mã Python trong Vim


102

Tôi đang viết mã Python bằng Vim và mỗi khi tôi muốn chạy mã của mình, tôi nhập vào bên trong Vim:

:w !python

Điều này thật khó chịu, vì vậy tôi đang tìm một phương pháp nhanh hơn để chạy mã Python bên trong Vim. Có thể thực thi các tập lệnh Python từ một thiết bị đầu cuối? Tôi đang sử dụng Linux.

Câu trả lời:


144

Làm thế nào về việc thêm một -tệp autocmdcủa bạn ~/.vimrc, tạo ánh xạ:

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>

thì bạn có thể nhấn <F9>để thực thi bộ đệm hiện tại vớipython

Giải trình:

  • autocmd: lệnh mà Vim sẽ tự động thực thi {event}(tại đây: nếu bạn mở tệp python)
  • [i]map: tạo lối tắt bàn phím <F9>ở chế độ chèn / bình thường
  • <buffer>: Nếu nhiều bộ đệm / tệp đang mở: chỉ cần sử dụng bộ đệm hiện hoạt
  • <esc>: rời khỏi chế độ chèn
  • :w<CR>: lưu tệp của bạn
  • !: chạy lệnh sau trong trình bao của bạn (thử :!ls)
  • %: được thay thế bằng tên tệp của bộ đệm hoạt động của bạn. Nhưng vì nó có thể chứa những thứ như khoảng trắng và những thứ "xấu" khác, tốt hơn hết bạn không nên viết :python %mà hãy sử dụng:
  • shellescape: thoát các ký tự đặc biệt. Phương 1tiện có dấu gạch chéo ngược

TL; DR: Dòng đầu tiên sẽ hoạt động ở chế độ bình thường và khi bạn nhấn vào <F9>nó trước tiên sẽ lưu tệp của bạn và sau đó chạy tệp bằng python. Cái thứ hai làm điều tương tự, nhưng bỏ chế độ chèn trước


6
Bạn có thể vui lòng mở rộng câu trả lời của bạn và giải thích nơi tôi nên thêm dòng đó. Có thể bên trong một tệp cấu hình Vim? Tôi là một người mới.
multigoodverse

5
@ArditSulce trong tệp vimrc của bạn, thêm một dòng:autocmd FileType python nnoremap <buffer> ....
Kent

2
Nếu bạn đang sử dụng hệ điều hành x (và tôi cho rằng unix) ".vimrc" nằm trong thư mục chính. Bạn có thể kiểm tra điều này bằng cách gõ ': phiên bản' trong chế độ lệnh để kiểm tra chắc chắn bạn sẽ thấy một dòng gọi là 'tập tin người dùng vimrc: '...''
ThinkBonobo

Có cách nào để lưu và chạy cùng một tập tin, thay vì chỉ chạy nó
Bharat

5
nnoremap <buffer> <F9> :!python %<cr>dường như hoạt động trong Vim 7.4.1689. Shellescape để làm gì?
Matt Kleinsmith

31

Chỉ cần chuyển sang chế độ bình thường bằng cách nhấn <esc>và nhập:

! clear; python %

nhập mô tả hình ảnh ở đây

Giải thích từng bước:

! cho phép bạn chạy một lệnh đầu cuối

clear sẽ làm trống màn hình đầu cuối của bạn

; kết thúc lệnh đầu tiên, cho phép bạn giới thiệu lệnh thứ hai

pythonsẽ sử dụng python để chạy tập lệnh của bạn ( rubyví dụ: nó có thể được thay thế bằng )

%nối tên tệp hiện tại, chuyển nó dưới dạng tham số cho pythonlệnh


27

Tôi có cái này trong tệp .vimrc của mình:

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

Khi tôi hoàn tất việc chỉnh sửa tập lệnh Python, tôi chỉ cần nhấn <F5>. Tập lệnh được lưu và sau đó được thực thi trong một màn hình trống.


Cảm ơn bạn! Nó hoạt động khá tốt. Tôi tự hỏi làm thế nào tôi có thể đặt phím tắt thành mphím cộng ,phím thay vì F5phím?
Jay Wong

Tôi không biết cách này sẽ lưu tệp trước như thế nào?
Thomas Browne

Xin lỗi, tôi quên thêm ": w". Tôi đã sửa nó và thêm cả <Esc> nữa.
czayas

1
Cần lưu ý rằng điều này thực thi trong Insertchế độ. Để thực hiện trong Normalchế độ sử dụng nmapthay vì imap.
Marcin

16

Tôi thích đầu ra Python được chuyển hướng đến một cửa sổ Vim mới (và nếu cửa sổ đó vẫn mở thì hãy cập nhật nội dung của nó vào lần tiếp theo bạn thực thi mã Python với chức năng này):

" 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

Tôi có nên nhập quyền này vào của tôi .vimrckhông? Nếu không, tôi nên đưa script này vào vim như thế nào? (Noob ở đây)
Benjamin Chausse

1
@BenjaminChausse Xin lỗi vì phản hồi chậm trễ. Tôi đã thực hiện một bài kiểm tra với .vimrc chứa riêng mã đó và nó hoạt động theo những gì tôi có thể biết. Thử nghiệm của tôi bị giới hạn ở việc mở tệp .py và nhấn F5 dẫn đến kết quả đầu ra python xuất hiện trong cửa sổ vim riêng biệt. "làm thế nào tôi nên cung cấp cho kịch bản này để vim?". Nó phụ thuộc vào hệ điều hành của bạn. Tôi đang sử dụng Windows nên tôi có tệp văn bản C: \ Program Files (x86) \ Vim \ .vimrc có chứa mã đó (bạn cũng có thể đặt tên nó là "_vimrc" trong Windows). Trong Linux hoặc mac, bạn sẽ có tệp văn bản .vimrc trong thư mục chính của bạn, tức là ~ / .vimrc
FocusedWolf

2
Mặc dù chúng tôi đánh giá cao rằng điều này có thể khiến bạn mất nhiều công sức để tạo, nhưng việc đưa các liên kết paypal vào một câu trả lời không thực sự phù hợp.
Martijn Pieters

10

Dựa trên các câu trả lời trước, nếu bạn muốn xem mã trong khi xem đầu ra 'của nó, bạn có thể thấy lệnh :ter( :terminal) hữu ích.

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

Sử dụng verttrong dòng thứ hai chạy mã theo chiều dọc thay vì theo chiều ngang.

Tiêu cực của nó là nếu bạn không đóng cửa sổ phân tách nơi mã đã chạy, bạn sẽ có nhiều lần phân tách sau nhiều lần chạy (điều này không xảy ra trong IDLE python gốc nơi cùng một cửa sổ đầu ra được sử dụng lại).

(Tôi giữ những dòng này bên trong /home/user/.vimrc)


5

Hãy nhớ rằng bạn có thể lặp lại lệnh được sử dụng cuối cùng @:, vì vậy đó là tất cả những gì bạn cần lặp lại là hai ký tự đó.

Hoặc bạn có thể lưu chuỗi w !pythonvào một trong các thanh ghi (như "aví dụ) và sau đó nhấn :<C-R>a<CR>để chèn nội dung của thanh ghi avào dòng lệnh và chạy nó.

Hoặc bạn có thể làm những gì tôi làm và bản đồ <leader>zđể :!python %<CR>chạy file hiện hành.


3

Nếu bạn không muốn thấy " :exec python file.py" được in mỗi lần, hãy sử dụng cái này:

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

Nó cũng không làm rối thanh trạng thái powerline / vim-airline của tôi.


3

Plugin: jupyter-vim

Vì vậy, bạn có thể gửi các dòng ( <leader>E), lựa chọn trực quan ( <leader>e) để chạy jupyter-client(thay thế ipython)

nhập mô tả hình ảnh ở đây

Tôi thích tách trình soạn thảo và trình thông dịch (mỗi thứ trong trình bao của nó). Hãy tưởng tượng bạn gửi một lệnh đọc đầu vào không hợp lệ ...


2

Để sử dụng chung (chạy python / haskell / ruby ​​/ C ++ ... từ vim dựa trên filetype), có một plugin hay được gọi là vim-quickrun . Nó hỗ trợ nhiều ngôn ngữ lập trình theo mặc định. Nó cũng có thể dễ dàng cấu hình, vì vậy người ta có thể xác định các hành vi ưa thích cho bất kỳ loại tệp nào nếu cần. Github repo không có readme ưa thích, nhưng nó được ghi lại bằng tệp doc.


2

Câu trả lời được chấp nhận phù hợp với tôi (trên Linux), nhưng tôi muốn lệnh này cũng lưu bộ đệm trước khi chạy, vì vậy tôi đã sửa đổi nó một chút:

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

Bộ :w <bar>đệm lưu THEN chạy mã trong đó.


1

Một phương pháp đơn giản là nhập :khi ở chế độ bình thường, sau đó nhấn phím mũi tên lên trên bàn phím và nhấn Enter. Thao tác này sẽ lặp lại các lệnh đã nhập cuối cùng trên VIM.


Bạn có thể thực hiện tìm kiếm tăng dần bằng cách nhập các ký tự bắt đầu của lệnh trước khi nhấn mũi tên lên. Nếu nhiều lệnh trước đây tôi đã làm a! python%, tôi có thể:! sau đó nhấn mũi tên lên, để chỉ chuyển qua các lệnh bắt đầu bằng!
shmup

1

Nếu bạn muốn nhanh chóng quay lại các :wlệnh của mình , một điều thú vị là nhập :wvà sau đó nhấn mũi tên lên của bạn. Nó sẽ chỉ quay vòng qua các lệnh bắt đầu bằng w.


1

Tôi có cái này trên .vimrc của tôi:

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

giúp lưu bộ đệm hiện tại và thực thi mã chỉ với Esc + F9 đặt trước



1

Bạn có thể mở rộng cho bất kỳ ngôn ngữ nào bằng 1 keybinding bằng lệnh augroup, ví dụ:

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

Hãy nghĩ đến việc sử dụng dòng shebang, vì vậy bạn sẽ có thể sử dụng nó với bất kỳ ngôn ngữ nào, không chỉ Python.

Thêm shebang:

Thêm cái này vào dòng đầu tiên của tập lệnh của bạn:

#!/usr/bin/env python3

hoặc cái này, nếu bạn đang sử dụng Python 2:

#!/usr/bin/env python2

Sơ đồ bàn phím Vim:

Thêm cái này vào ~/.vimrc:

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

Làm cho tệp thực thi được:

Nhập Vim:

:!chmod +x %

hoặc trong thiết bị đầu cuối:

chmod +x script_name.py

Giải trình:

Khi nhấn F7 ở chế độ bình thường, Vim sẽ cố gắng thực thi tệp hiện tại dưới dạng tập lệnh bash. Sau đó, trình thông dịch bash sẽ thấy dòng shebang và hiểu rằng tệp này nên được chuyển sang Python (hoặc bất kỳ chương trình nào khác nếu cần).

Ngoài ra, bạn sẽ có thể chạy tập lệnh của mình từ thiết bị đầu cuối bằng cách sử dụng tên của nó:

./script_name.py

thay vì cách này (cách đó cũng sẽ hoạt động):

python3 script_name.py

0

Ánh xạ .vimrc này cần Conque Shell , nhưng nó sao chép hành vi của Geany (và các trình soạn thảo X khác):

  • Nhấn một phím để thực hiện
  • Thực thi trong gnome-terminal
  • Chờ xác nhận để thoát
  • Cửa sổ tự động đóng khi thoát

    :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

Đặt con trỏ của bạn vào mã ở đâu đó. Nhấp chuột phải và chọn một trong các lựa chọn "Chọn" để đánh dấu mã của bạn. Sau đó nhấn Ctrl: và bạn sẽ thấy lời nhắc mới '<,>'

Bây giờ hãy nhập! Python và xem nó có hoạt động không.

Tôi chỉ dành nhiều ngày để cố gắng tìm ra cùng một vấn đề !!! Tôi đã sử dụng mã hóa:

s='My name'
print (s) 

Sau khi tôi nhổ hết tóc, cuối cùng tôi đã làm đúng!


5
Sử dụng chuột trong không phải là một cách vim
0xc0de

1
Nhưng nó có thể làm được :% !python. %chỉ có nghĩa là tất cả các dòng.
T.Chmelevskij,

0

Thay vì đặt ánh xạ lệnh trong của bạn .vimrc, hãy đặt ánh xạ vào ~/.vim/ftplugin/python.vimtệp của bạn (Windows $HOME\vimfiles\ftplugin\python.vim). Nếu bạn không có tệp hoặc thư mục này, chỉ cần tạo chúng. Bằng cách này, khóa chỉ được ánh xạ khi bạn mở một .pytệp hoặc bất kỳ tệp nào bằng filetype=python, vì bạn sẽ chỉ chạy lệnh này trên các tập lệnh Python.

Đối với ánh xạ thực tế, tôi muốn có thể chỉnh sửa trong Vim trong khi tập lệnh chạy. Ngoài câu trả lời của @cazyas, tôi có phần sau trong ftplugin\python.vim(Windows) của mình:

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

Thao tác này sẽ chạy tập lệnh Python hiện tại trong nền. Đối với Linux, chỉ cần thay đổi nó thành thế này:

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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.