Подтвердить что ты не робот

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

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

:w !python

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

4b9b3361

Ответ 1

как насчет добавления autocmd, когда FileType python, создайте сопоставление:

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

то вы можете нажать <F9>, чтобы выполнить текущий буфер с помощью python

Ответ 2

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

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

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

Ответ 3

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

! clear; python %

enter image description here

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

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

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

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

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

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

Ответ 4

Я предпочитаю вывод 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

Для этого потребовалось много усилий, поэтому, если вы чувствуете себя щедрым, отправьте PayPal.  пожертвование :)

Ответ 5

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

Ответ 6

Имейте в виду, что вы можете повторить последнюю использованную команду с @:, так что все, что вам нужно будет повторить, это два символа.

Или вы можете сохранить строку w !python в один из регистров (например, "a например), а затем нажать :<C-R>a<CR>, чтобы вставить содержимое регистра a в командную строку и запустить его.

Или вы можете делать то, что я делаю, и сопоставлять <leader>z с :!python %<CR> для запуска текущего файла.

Ответ 7

Если вы не хотите каждый раз печатать ":exec python file.py", используйте это:

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

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

Ответ 8

Простым методом было бы ввести : в нормальном режиме, а затем нажать клавишу со стрелкой вверх на клавиатуре и нажать Enter. Это повторит последние введенные команды на VIM.

Ответ 9

Если вы хотите быстро вернуться к своим командам :w, то классно набрать :w, а затем нажать стрелку вверх. Он будет работать только через команды, начинающиеся с w.

Ответ 10

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

Ответ 11

У меня есть это на моем .vimrc:

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

который сохраняет текущий буфер и выполняет код с использованием только Esc + F9

Ответ 12

Вы также можете использовать skywind3000/asyncrun.vim. Это похоже на то, что перечислил @FocusedWolf.

Ответ 13

Для этого .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; \" "')

Ответ 14

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

Ответ 15

Принятый ответ работает для меня (в Linux), но я хотел, чтобы эта команда также сохраняла буфер перед запуском, поэтому я немного его изменил:

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

:w <bar> сохраняет буфер, ТО затем запускает в нем код.

Ответ 16

" 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>

Ответ 17

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

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

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

s='My name'
print (s) 

После того как я вытащил все мои волосы, я, наконец, понял это правильно.