Ответ 1
как насчет добавления autocmd
, когда FileType python
, создайте сопоставление:
nnoremap <buffer> <F9> :exec '!python' shellescape(@%, 1)<cr>
то вы можете нажать <F9>
, чтобы выполнить текущий буфер с помощью python
Я пишу код Python с помощью Vim, и каждый раз, когда я хочу запускать свой код, я набираю это внутри Vim:
:w !python
Это расстраивает, поэтому я искал более быстрый метод запуска кода Python внутри Vim. Возможно ли выполнить скрипты Python с терминала? Я использую Linux.
как насчет добавления autocmd
, когда FileType python
, создайте сопоставление:
nnoremap <buffer> <F9> :exec '!python' shellescape(@%, 1)<cr>
то вы можете нажать <F9>
, чтобы выполнить текущий буфер с помощью python
У меня это в файле .vimrc:
imap <F5> <Esc>:w<CR>:!clear;python %<CR>
Когда я закончил редактирование Python script, я просто нажимаю <F5>
. script сохраняется, а затем выполняется на пустом экране.
Просто перейдите в обычный режим, нажав <esc>
и набрав:
! clear; python %
Пошаговое объяснение:
!
позволяет запустить команду терминала
clear
экран вашего терминала
;
заканчивает первую команду, позволяя ввести вторую команду
python
будет использовать python для запуска вашего скрипта (его можно заменить наruby
например)
%
соответствует текущему имени файла, передавая его в качестве параметра командеpython
Я предпочитаю вывод 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. пожертвование :)
Основываясь на предыдущих ответах, если вы хотите увидеть код, глядя на его результаты, вы можете найти :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
)
Имейте в виду, что вы можете повторить последнюю использованную команду с @:
, так что все, что вам нужно будет повторить, это два символа.
Или вы можете сохранить строку w !python
в один из регистров (например, "a
например), а затем нажать :<C-R>a<CR>
, чтобы вставить содержимое регистра a
в командную строку и запустить его.
Или вы можете делать то, что я делаю, и сопоставлять <leader>z
с :!python %<CR>
для запуска текущего файла.
Если вы не хотите каждый раз печатать ":exec python file.py
", используйте это:
nnoremap <F9> :echo system('python2 "' . expand('%') . '"')<cr>
nnoremap <F10> :echo system('python3 "' . expand('%') . '"')<cr>
Это тоже не испортило мою строку состояния powerline/vim-авиакомпании.
Простым методом было бы ввести :
в нормальном режиме, а затем нажать клавишу со стрелкой вверх на клавиатуре и нажать Enter. Это повторит последние введенные команды на VIM.
Если вы хотите быстро вернуться к своим командам :w
, то классно набрать :w
, а затем нажать стрелку вверх. Он будет работать только через команды, начинающиеся с w
.
Для общего использования (запустите python/haskell/ruby /С++... из vim на основе filetype
), там есть хороший плагин под названием vim-quickrun. По умолчанию он поддерживает многие языки программирования. Он также легко настраивается, поэтому при необходимости можно определить предпочтительные типы поведения для любого типа файла. Репозиторий github не имеет причудливого readme, но он хорошо документирован с файлом doc.
У меня есть это на моем .vimrc:
"map <F9> :w<CR>:!python %<CR>"
который сохраняет текущий буфер и выполняет код с использованием только Esc + F9
Вы также можете использовать skywind3000/asyncrun.vim. Это похоже на то, что перечислил @FocusedWolf.
Для этого .vimrc-отображения требуется Conque Shell, но он реплицирует поведение Geany (и других X-редакторов):
Окно автоматически закрывается при выходе
: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; \" "')
Вместо того, чтобы помещать отображение команд в ваш .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>
Принятый ответ работает для меня (в Linux), но я хотел, чтобы эта команда также сохраняла буфер перед запуском, поэтому я немного его изменил:
nnoremap <buffer> <F9> :w <bar> :exec '!python' shellescape(@%, 1)<cr>
:w <bar>
сохраняет буфер, ТО затем запускает в нем код.
" 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>
Поместите курсор в код где-нибудь. Щелкните правой кнопкой мыши и выберите один из вариантов "Выбрать", чтобы выделить код. Затем нажмите Ctrl: и вы увидите новое приглашение '<, > '
Теперь введите! python и посмотрите, работает ли это.
Я просто трачу дни, пытаясь выяснить ту же проблему!!! Я использовал кодировку:
s='My name'
print (s)
После того как я вытащил все мои волосы, я, наконец, понял это правильно.