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

105

Я пишу код Python с помощью Vim, и каждый раз, когда я хочу запустить свой код, я набираю это внутри Vim:

:w !python

Это расстраивает, поэтому я искал более быстрый способ запустить код Python внутри Vim. Может быть, запускать скрипты Python с терминала? Я использую Linux.

мультигудвселенная
источник

Ответы:

146

Как насчет добавления 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> ....
Kent
2
Если вы используете os x (и я предполагаю, что это unix) ".vimrc" находится в домашнем каталоге. Вы можете проверить это, набрав ': version' в командном режиме, чтобы убедиться, что вы увидите строку с именем 'user vimrc file: "..."'
ThinkBonobo
Есть ли способ сохранить и запустить один и тот же файл вместо того, чтобы просто запускать его?
Бхарат
5
nnoremap <buffer> <F9> :!python %<cr>похоже, работает в Vim 7.4.1689. Зачем нужен шелковый пейзаж?
Мэтт
33

Просто перейдите в нормальный режим, нажав <esc>и набрав:

! clear; python %

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

Пошаговое объяснение:

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

clear очистит экран вашего терминала

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

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

%объединяет текущее имя файла, передавая его в качестве параметра pythonкоманде

Флавио Вуэнше
источник
28

У меня есть это в моем файле .vimrc:

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

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

czayas
источник
Спасибо! Работает очень хорошо. Интересно, как я могу установить ярлык на mклавишу плюс ,вместо F5клавиши?
Джей Вонг,
Я не вижу, как это сначала сохраняет файл?
Томас Браун
Извините, я забыл добавить ": w". Я поправил и добавил <Esc>.
czayas 01
2
Следует отметить, что это выполняется в Insertрежиме. Для выполнения в Normalрежиме используйте nmapвместо imap.
Марчин
17

Я предпочитаю перенаправлять вывод 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? (Здесь
Бенджамин
1
@BenjaminChausse Извините за задержку с ответом. Я провел тест с .vimrc, который содержал исключительно этот код, и он работал, насколько я мог сказать. Мое тестирование ограничивалось открытием файла .py и нажатием F5, в результате чего вывод python отображался в отдельном окне vim. "как передать этот скрипт vim?". Это зависит от вашей ОС. Я использую Windows, поэтому у меня есть текстовый файл C: \ Program Files (x86) \ Vim \ .vimrc, который содержит этот код (вы также можете назвать его «_vimrc» в Windows). В Linux или Mac у вас будет текстовый файл .vimrc в вашей домашней папке, т.е. ~ / .vimrc
FocusedWolf
4
Хотя мы понимаем, что это, возможно, потребовало от вас много работы, вставлять ссылки PayPal в ответ на самом деле неуместно.
Мартейн Питерс
11

Основываясь на предыдущих ответах, если вы хотите увидеть код, глядя на его вывод, вы можете найти полезную команду :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>

Это не испортило мою строку состояния powerline / vim-Airlines.

Джабба
источник
3

Плагин: jupyter-vim

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

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

Я предпочитаю разделить редактор и интерпретатор (каждый в своей оболочке). Представьте, что вы отправляете неверную команду чтения ввода ...

Тинмарино
источник
2

Для общего использования (запускайте python / haskell / ruby ​​/ C ++ ... из vim на основе filetype) есть хороший плагин vim-quickrun . По умолчанию он поддерживает множество языков программирования. Его также легко настроить, поэтому при необходимости можно определить предпочтительное поведение для любого типа файла. В репозитории github нет навороченного readme, но он хорошо документирован с помощью файла документации.

Йош
источник
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
Đạt Nguyễn Thành
источник
1

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

Добавление shebang:

Добавьте это в первую строку вашего скрипта:

#!/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-terminal
  • Ожидает подтверждения для выхода
  • Окно закрывается автоматически при выходе

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

user2587717
источник
0

Поместите курсор куда-нибудь в код. Щелкните правой кнопкой мыши и выберите один из вариантов «Выбрать», чтобы выделить код. Затем нажмите Ctrl: и вы увидите новую подсказку '<,>'

Теперь введите! Python и посмотрите, работает ли это.

Я просто провожу дни, пытаясь решить ту же проблему !!! Я использовал кодировку:

s='My name'
print (s) 

После того, как я вырвал все свои волосы, я наконец получил это право!

Боб Крессман
источник
5
Использование мыши не так, как в vim
0xc0de
1
Но это возможно :% !python. %просто означает все строки.
Т.Чмелевский
0

Вместо того, чтобы помещать отображение команд в ваш .vimrc, поместите отображение в свой ~/.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>
Нео Мозаид
источник