在 Vim 中运行 Python 代码

我正在使用 Vim 编写 Python 代码,每次我想运行我的代码时,我都会在 Vim 中键入以下内容:

:w !python

这令人沮丧,因此我正在寻找一种在 Vim 中运行 Python 代码的更快的方法。也许是从终端执行 Python 脚本? 我在用 Linux。

177730 次浏览

如何添加一个 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的当前缓冲区

说明:

  • 命令,Vim 将在 {event}上自动执行(在这里: 如果打开一个 python 文件)
  • 在插入/正常模式下创建到 <F9>的快捷键
  • <buffer>: 如果打开多个缓冲区/文件: 只使用活动缓冲区/文件
  • 离开插入模式
  • 保存文件
  • 在 shell 中运行以下命令(尝试 :!ls)
  • 由活动缓冲区的文件名替换。由于 但是可以包含空格和其他“坏”东西,所以最好不要写 :python %,而是使用:
  • 转义特殊字符。 1表示反斜杠

DR: 第一行将在正常模式下工作,一旦按下 <F9>,它首先保存文件,然后用 python 运行文件。 第二个模式执行同样的操作,但是将插入模式放在第一位

请记住,您可以使用 @:重复最后使用的命令,所以只需要重复这两个字符即可。

或者您可以将字符串 w !python保存到一个寄存器中(例如 "a) ,然后按 :<C-R>a<CR>将寄存器 a的内容插入到命令行中并运行它。

或者您可以像我一样,将 <leader>z映射到 :!python %<CR>以运行当前文件。

一个简单的方法是在正常模式下键入 :,然后按键盘上的向上箭头键并按 Enter。这将在 VIM 上重复上次输入的命令。

如果你想快速跳回到你的 :w命令,一个很酷的事情是键入 :w,然后按向上箭头。它只会循环执行以 w开始的命令。

我在我的.vimrc 文件中有这个:

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

编辑完 Python 脚本后,只需按 <F5>即可。保存脚本,然后在空白屏幕中执行。

把你的光标放在代码的某个地方。右键单击并选择一个“选择”选项来突出显示代码。然后按 Ctrl: 您将看到新的提示符“ < ,>”

现在输入! python,看看是否有效。

我只是花了几天的时间试图找出同样的问题! ! ! 我使用了代码:

s='My name'
print (s)

在我把头发都拔光之后,我终于做对了!

Vimrc 映射需要 Conque Shell,但它复制了 Geany (和其他 X 编辑器)的行为:

  • 按键执行
  • 在 gnome 终端中执行
  • 等待确认退出
  • 出口时窗口自动关闭

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

对于通用的使用(基于 filetype从 vim 运行 python/haskell/ruby/C + + ...) ,有一个很好的插件叫做 Vim-Quick run。默认情况下,它支持许多编程语言。它也很容易配置,因此如果需要,可以为任何文件类型定义首选行为。Github repo 没有花哨的自述文件,但是在 doc 文件中有很好的文档说明。

我的 vimrc 上有这个:

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

保存当前缓冲区并执行代码,只需按 Esc + F9

如果你不想每次都看到“ :exec python file.py”打印出来,可以这样做:

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

它也没有破坏我的电力线/活力航线状态栏。

不要将命令映射放在 .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 脚本:

noremap <F5> <Esc>:w<CR>:!python % &<CR>

<esc>键进入正常模式,然后输入:

! clear; python %

enter image description here

逐步解释:

!允许您运行终端命令

clear将清空您的终端屏幕

;结束第一个命令,允许您引入第二个命令

python将使用 python 来运行脚本(它可以替换为 例如 ruby)

%连接当前文件名,将其作为参数传递给 python指令

在前面答案的基础上,如果您希望在查看代码的输出时看到代码,那么您会发现 :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中)

你也可以使用 Skywind3000/syncrun.vim,它类似于@FocusedWolf 所列出的。

这个被接受的答案对我(在 Linux 上)很有用,但是我希望这个命令在运行之前也能保存缓冲区,所以我稍微修改了一下:

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

:w <bar>保存缓冲区 THEN 运行其中的代码。

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

您可以使用 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


插件: Jupyter-Vim

所以你可以发送行(<leader>E) ,视觉选择(<leader>e)到一个正在运行的 jupyter-client(取代 ipython)

enter image description here

我更喜欢分开编辑器和解释器(每个都在它的 shell 中)。假设您发送了一个错误的输入读取命令..。

考虑一下使用 shebang 行,这样您就可以在任何语言中使用它,而不仅仅是 Python。

补充说明:

把这个添加到脚本的第一行:

#!/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

我吸毒

:! [filename.py]; python %

我就喜欢这样

  1. 转到你的主目录
  2. 用 vim.vim .vimrc打开.vimrc 文件
  3. 将下一个代码添加到文件中
  4. 保存然后退出 ZZ

下次您想运行代码时,只需按“正常模式”下的 F4即可。如果要在“插入模式”下运行代码,请将 nmap替换为 imap

你有没有试过只用:

:!python nameofyourfile.py

例子: https://www.youtube.com/watch?v=mjUxEX4OssM

可能只是语法问题,也可能是缺少其他人使用过的插件或包。您只是使用普通终端,还是使用类似 MobaXterm 的其他终端? 上面的代码使用 vim 中的终端运行 python 脚本(输出将显示在 vim 会话中)。

我建议使用 Vim-Slime 插件“逐块”将 python 代码从 vim 发送到 python 控制台。

Https://github.com/jpalardy/vim-slime

我用这个。它会自动保存程序并将其运行到 shell 中。在程序运行后返回到 Vim。

通过在 vim 中按 <F5>在插入模式下工作。 在 vimrc 文件中添加以下代码段。

imap <F5> <Esc>:w<CR>:!python % [filename.py]; <CR>

我刚刚将之前提供的两个解决方案结合起来,它对我很有效。

谢谢!

:!./%运行当前的 Python 脚本,这只能用于 Shebang

你也可以用这样的参数运行它:

:!./% ARG1 ARG2