Answers:
如何将-添加autocmd
到您的~/.vimrc
-file,创建映射:
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>
:保存文件!
:在您的shell中运行以下命令(尝试:!ls
)%
:替换为活动缓冲区的文件名。但是由于它可以包含空格和其他“坏”的东西,所以最好不要写:python %
,而要使用:shellescape
:转义特殊字符。该1
用反斜杠手段TL; DR:第一行将在正常模式下工作,一旦按下<F9>
它,首先保存文件,然后使用python运行文件。第二个做同样的事情,但是先离开插入模式
autocmd FileType python nnoremap <buffer> ....
nnoremap <buffer> <F9> :!python %<cr>
似乎可以在Vim 7.4.1689中使用。shellescape是做什么用的?
只需按<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
.vimrc
吗?如果没有,我应该如何将此脚本提供给vim?(Noob在这里)
基于前面的答案,如果您希望在查看代码输出时看到代码,则可以找到: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中不会发生,在该Python IDLE中重复使用了相同的输出窗口)。
(我将这些行留在里面/home/user/.vimrc
)
请记住,您可以使用来重复上次使用的命令@:
,因此您只需要重复这两个字符即可。
或者,您可以将字符串保存w !python
到其中一个寄存器中("a
例如),然后单击:<C-R>a<CR>
以将寄存器的内容插入a
命令行并运行它。
或者你可以做我想做的,并映射<leader>z
到:!python %<CR>
运行当前文件。
插件:jupyter-vim
因此,您可以向正在运行的行(替换)发送行(<leader>E
),视觉选择()<leader>e
jupyter-client
ipython
我更喜欢将编辑器和解释器分开(每个都在其外壳中)。假设您发送了错误的输入阅读命令...
对于一般用途(基于,从vim运行python / haskell / ruby / C ++ ... filetype
),有一个不错的插件,称为vim-quickrun。默认情况下,它支持多种编程语言。它也很容易配置,因此可以根据需要为任何文件类型定义首选行为。github仓库没有花哨的自述文件,但doc文件对此进行了很好的记录。
可接受的答案对我有用(在Linux上),但是我希望此命令在运行之前也可以保存缓冲区,因此我对其进行了一些修改:
nnoremap <buffer> <F9> :w <bar> :exec '!python' shellescape(@%, 1)<cr>
该:w <bar>
然后保存缓冲中运行的代码。
您也可以使用skywind3000 / asyncrun.vim。它类似于@FocusedWolf列出的内容。
您可以使用augroup命令通过1个键盘绑定扩展到任何语言,例如:
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
考虑使用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
此.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; \" "')
将光标放在代码中的某个位置。右键单击并选择“选择”选项之一以突出显示您的代码。然后按Ctrl:您将看到新的提示“ <,>”
现在输入!python,看看是否可行。
我只是花几天的时间来找出同样的问题!!!我使用了编码:
s='My name'
print (s)
拔完头发后,我终于弄对了!
:% !python
。%
仅表示所有行。
不要将命令映射放入您的中.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>
" 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>