我正在使用Vim编写Python代码,每次我想运行我的代码时,我都会在Vim中输入:
:w !python
这令人沮丧,所以我一直在寻找一种更快的方法来在Vim中运行Python代码。从终端执行Python脚本可能吗? 我正在使用Linux。
答案 0 :(得分:106)
在autocmd
时添加FileType python
如何创建映射:
nnoremap <buffer> <F9> :exec '!python' shellescape(@%, 1)<cr>
然后您可以按<F9>
以python
答案 1 :(得分:22)
我的.vimrc文件中有这个:
imap <F5> <Esc>:w<CR>:!clear;python %<CR>
当我完成编辑Python脚本时,我只需按<F5>
。保存脚本,然后在空白屏幕中执行。
答案 2 :(得分:12)
我更喜欢将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
答案 3 :(得分:10)
只需按<esc>
进入普通模式并输入:
! clear; python %
分步说明:
!
允许您运行终端命令
clear
将清空您的终端屏幕
;
结束第一个命令,允许您引入第二个命令
python
将使用python运行脚本(可以将其替换为 例如ruby
%
合并当前文件名,并将其作为参数传递给python
命令
答案 4 :(得分:5)
基于先前的答案,如果您希望在查看代码输出时看到代码,则可以发现: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 :(得分:4)
请记住,您可以使用@:
重复上次使用的命令,因此您需要重复的是这两个字符。
或者您可以将字符串w !python
保存到其中一个寄存器中(例如"a
),然后点击:<C-R>a<CR>
将寄存器a
的内容插入到命令行并运行它。
或者您可以执行我的操作并将<leader>z
映射到:!python %<CR>
以运行当前文件。
答案 6 :(得分:3)
插件:jupyter-vim
因此,您可以向正在运行的<leader>E
(替换<leader>e
)发送行(jupyter-client
),视觉选择(ipython
)
我更喜欢将编辑器和解释器分开(每个都在其外壳中)。想象一下,您发送了错误的输入阅读命令...
答案 7 :(得分:2)
如果您不希望每次都看到“:exec python file.py
”,请使用:
nnoremap <F9> :echo system('python2 "' . expand('%') . '"')<cr>
nnoremap <F10> :echo system('python3 "' . expand('%') . '"')<cr>
它也没有弄乱我的powerline / vim-airline状态栏。
答案 8 :(得分:2)
我用
:! [filename.py]; python %
那是对我有用的
答案 9 :(得分:2)
可接受的答案对我有效(在Linux上),但是我希望此命令在运行之前也可以保存缓冲区,因此我对其进行了一些修改:
nnoremap <buffer> <F9> :w <bar> :exec '!python' shellescape(@%, 1)<cr>
:w <bar>
保存缓冲区,然后在其中运行代码。
答案 10 :(得分:1)
对于泛型使用(基于filetype
从vim运行python / haskell / ruby / C ++ ...),有一个很好的插件叫vim-quickrun。它默认支持许多编程语言。它也很容易配置,因此可以根据需要为任何文件类型定义首选行为。 github repo没有花哨的自述文件,但doc文件中有详细记录。
答案 11 :(得分:1)
我在.vimrc上有这个:
"map <F9> :w<CR>:!python %<CR>"
保存当前缓冲区并执行仅使用Esc + F9
的代码答案 12 :(得分:1)
如果您想快速跳回:w
命令,最好输入:w
,然后按向上箭头。它只会循环显示以w
开头的命令。
答案 13 :(得分:1)
一种简单的方法是在正常模式下键入:
,然后按键盘上的向上箭头键并按Enter键。这将重复VIM上最后输入的命令。
答案 14 :(得分:1)
您也可以使用skywind3000/asyncrun.vim。它类似于@FocusedWolf列出的内容。
答案 15 :(得分:0)
cd
vim .vimrc
nmap <F4> <Esc>:w<CR>:!clear;python %<CR>
ZZ
下次要运行代码时,只需在“正常模式”下按F4
。如果要在“插入模式”下运行代码,请将nmap
替换为imap
。
答案 16 :(得分:0)
考虑使用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
答案 17 :(得分:0)
你有没有试过只使用:
:!python nameofyourfile.py
示例:https://www.youtube.com/watch?v=mjUxEX4OssM
这可能只是您的语法,也可能是您缺少其他人使用过的插件或软件包。您是使用普通终端还是其他类似 MobaXterm 的终端? 上面的代码适用于在 vim 中使用终端运行 python 脚本(输出将显示在 vim 会话中)。
答案 18 :(得分:0)
您可以使用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
答案 19 :(得分: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>
答案 20 :(得分: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>
答案 21 :(得分:0)
这个.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; \" "')
答案 22 :(得分:-1)
将光标放在某处的代码中。右键单击并选择“选择”选项之一以突出显示您的代码。然后按Ctrl:,您将看到新提示“&lt ;,&gt;”
现在输入!python并查看是否有效。
我只是花了几天时间试图弄清楚同样的问题!我用了编码:
s='My name'
print (s)
在我拔掉所有头发之后,我终于把它弄好了!