Запуск коду Python у Vim


104

Я пишу код Python за допомогою Vim, і кожного разу, коли я хочу запустити свій код, я ввожу це всередині Vim:

:w !python

Це засмучує, тому я шукав більш швидкий метод для запуску коду Python всередині Vim. Виконання скриптів Python з терміналу, можливо? Я використовую Linux.

Відповіді:


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: команда, яку Vim буде виконувати автоматично {event}(тут: якщо ви відкриваєте файл python)
  • [i]map: створює комбінацію клавіш <F9>у режимі вставки / нормальному режимі
  • <buffer>: Якщо відкрито кілька буферів / файлів: просто використовуйте активний
  • <esc>: вихід із режиму вставки
  • :w<CR>: зберігає ваш файл
  • !: запускає наступну команду у вашій оболонці (спробуйте :!ls)
  • %: замінюється на ім'я файлу вашого активного буфера. Але оскільки він може містити такі речі, як пробіли та інші "погані" речі, то краще не писати :python %, а використовувати:
  • shellescape: уникнути спеціальних символів. Засіб 1із зворотною рискою рискою

TL; DR: Перший рядок буде працювати в звичайному режимі, і після натискання <F9>він спочатку зберігає ваш файл, а потім запускає файл за допомогою python. Другий робить те саме, але залишає спочатку режим вставки


6
Чи можете ви, будь ласка, розширити свою відповідь і пояснити, де я повинен додати цей рядок? Усередині файлу конфігурації Vim, можливо? Я новачок.
multigoodverse

5
@ArditSulce у своєму файлі vimrc, додайте рядок:autocmd FileType python nnoremap <buffer> ....
Кент

2
Якщо ви користуєтеся ОС x (і я припускаю unix), ".vimrc" знаходиться в домашній директорії. Ви можете перевірити це, ввівши ': version' у командному режимі, щоб переконатися, що ви побачите рядок, що називається 'user vimrc file: "..."'
ThinkBonobo,

Чи є спосіб зберегти та запустити той самий файл, а не просто запускати його
Бхарат,

5
nnoremap <buffer> <F9> :!python %<cr>здається, працює у Vim 7.4.1689. Для чого потрібен шелловий пейзаж?
Метт Клейнсміт,

32

Просто перейдіть у звичайний режим, натиснувши <esc>і введіть:

! clear; python %

введіть тут опис зображення

Покрокове пояснення:

! дозволяє запустити команду терміналу

clear очистить екран терміналу

; закінчує першу команду, дозволяючи ввести другу команду

pythonбуде використовувати python для запуску вашого сценарію (його можна замінити, rubyнаприклад)

%кокатує поточне ім'я файлу, передаючи його як параметр pythonкоманді


27

У мене це є у моєму файлі .vimrc:

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

Коли я закінчую редагувати сценарій Python, я просто натискаю <F5>. Сценарій зберігається, а потім виконується на порожньому екрані.


Дякую! Це працює досить добре. Цікаво, як я можу встановити ярлик на mклавішу плюс ,клавіша замість F5клавіші?
Джей Вонг,

Я не бачу, як це спочатку зберігає файл?
Томас Браун,

Вибачте, я забув додати ": w". Я виправив це і додав також <Esc>.
czayas

1
Слід зазначити, що це виконується в Insertрежимі. Для виконання в Normalрежимі використовуйте nmapзамість imap.
Марсін

16

Я вважаю за краще вихід Python перенаправити в нове вікно Vim (і якщо це вікно залишається відкритим, оновіть його вміст під час наступного запуску коду Python за допомогою цієї функції):

" 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? Якщо ні, як мені передати цей сценарій vim? (Noob here)
Бенджамін Чаус

1
@BenjaminChausse Вибачте за затримку відповіді. Я зробив тест із .vimrc, який містив виключно цей код, і він працював з того, що я міг сказати. Моє тестування обмежилося відкриттям файлу .py та натисканням клавіші F5, що призвело до появи вихідних даних python в окремому вікні vim. msgstr "як мені передати цей сценарій vim?". Це залежить від вашої ОС. Я використовую Windows, тому у мене є текстовий файл C: \ Program Files (x86) \ Vim \ .vimrc, який містить цей код (ви також можете назвати його "_vimrc" у Windows). У Linux або mac у вас був би текстовий файл .vimrc у вашій домашній папці, тобто ~ / .vimrc
FocusedWolf

2
Хоча ми розуміємо, що це, можливо, зайняло у вас багато роботи для створення, введення посилань на paypal у відповідь насправді не є доречним.
Мартін Пітерс

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у другому рядку запускає код у вертикальному розбитті замість горизонтального.

Негатив цього полягає в тому, що якщо ви не закриєте вікно розділення, де виконувався код, у вас буде багато розбиттів після декількох запусків (чого не відбувається в оригінальному python 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>

Це також не зіпсувало мій рядок стану на лінії електропередач / vim-airline.


3

Плагін: jupyter-vim

Таким чином, ви можете надіслати рядки ( <leader>E), візуальний вибір ( <leader>e) запущеному jupyter-client(заміна ipython)

введіть тут опис зображення

Я вважаю за краще розділяти редактор та інтерпретатор (кожен у своїй оболонці). Уявіть, що ви надіслали погану команду зчитування вводу ...


2

Для загального використання (запустити python / haskell / ruby ​​/ C ++ ... з vim на основі filetype) існує гарний плагін, який називається vim-quickrun . Він підтримує багато мов програмування за замовчуванням. Він також легко налаштовується, тому за потреби можна визначити бажану поведінку для будь-якого типу файлу. У репозиторії github немає вигадливого readme, але він добре задокументований файлом doc.


2

Прийнята відповідь працює для мене (в Linux), але я хотів, щоб ця команда також зберегла буфер перед запуском, тому я трохи його змінив:

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

:w <bar>Зберігає буфер ТОДІ запускає код в ньому.


1

Простим методом може бути набір :тексту в звичайному режимі, а потім натискання клавіші зі стрілкою вгору на клавіатурі та натискання клавіші Enter. Це повторить останні введені команди на VIM.


Ви можете зробити додатковий пошук, набравши початкові символи команди перед натисканням стрілки вгору. Якщо багато команд тому я робив! python%, я міг би:! потім натисніть стрілку вгору, щоб прокручувати лише команди, які починаються з!
shmup

1

Якщо ви хочете швидко перейти до своїх :wкоманд, класно ввести, :wа потім натиснути стрілку вгору. Він буде циклічно переглядати лише команди, які починаються з w.


1

У мене є на моєму .vimrc:

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

що зберігає поточний буфер і виконує код, натискаючи лише Esc + F9



1

Ви можете розширити для будь-якої мови за допомогою 1 прив'язки клавіш за допомогою команди augroup, наприклад:

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

Подумайте про використання рядка shebang, щоб ви могли використовувати його з будь-якою мовою, не тільки з Python.

Додавання шебанга:

Додайте це до першого рядка вашого сценарію:

#!/usr/bin/env python3

або це, якщо ви використовуєте Python 2:

#!/usr/bin/env python2

Карта клавіш Vim:

Додайте це до свого ~/.vimrc:

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

Зробити файл виконуваним:

Введіть Vim:

:!chmod +x %

або в терміналі:

chmod +x script_name.py

Пояснення:

Коли F7 натискається в звичайному режимі, Vim спробує виконати поточний файл як скрипт bash. Тоді інтерпретатор bash побачить рядок shebang і зрозуміє, що цей файл слід передати Python (або будь-якій іншій програмі, якщо це потрібно).

Також ви зможете запустити свій скрипт із терміналу, використовуючи його ім'я:

./script_name.py

замість цього (що теж буде працювати):

python3 script_name.py

0

Це відображення .vimrc потребує Conque Shell , але воно відтворює поведінку Geany (та інших редакторів X):

  • Натисніть клавішу, щоб виконати
  • Виконується в gnome-терміналі
  • Чекає підтвердження для виходу
  • Вікно автоматично закривається при виході

    :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: і ви побачите нову підказку '<,>'

Тепер введіть! Python і перевірте, чи це працює.

Я просто цілими днями намагаюся з’ясувати ту саму проблему !!! Я використовував кодування:

s='My name'
print (s) 

Після того, як я вирвав все своє волосся, нарешті я все зрозумів!


5
Використання миші не vim способом
0xc0de

1
Але це можливо зробити :% !python. %просто означає всі рядки.
Т.Чмелевський

0

Замість того, щоб поміщати команду mapping у свій файл .vimrc, помістіть mapping у свій ~/.vim/ftplugin/python.vimфайл (Windows $HOME\vimfiles\ftplugin\python.vim). Якщо у вас немає цього файлу або каталогів, просто створіть їх. Таким чином, ключ відображається лише при відкритті .pyфайлу або будь-якого файлу filetype=python, оскільки ця команда виконується лише на сценаріях Python.

Що стосується фактичного відображення, мені подобається мати можливість редагувати у Vim під час запуску сценарію. Виходячи з відповіді @cazyas, у мене ftplugin\python.vim(Windows) є таке:

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

Це запустить поточний скрипт Python у фоновому режимі. Для Linux просто змініть його на таке:

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.