使用Python REPL会话连接Vim

时间:2017-08-23 15:13:07

标签: python vim ipython read-eval-print-loop

我有两个终端会话,一个运行Vim,另一个运行Python(或iPython)REPL。

我正在寻找一种让Vim与REPL会话动态互操作的方法。

作为所需行为的一个例子,假设我在Vim中打开了这个Python文件:

 1  x = 40
 2  y = 2
 3  z = x + y
 4  print('The answer is {}'.format(z))
 5  print('The product of {} and {} is {}'.format(x, y, x*y))

我在iPython REPL会话中输入这些条目:

In [1]: x = 10
In [2]: y = 26

现在我希望能够从Vim发送行3-5以在REPL会话中执行,从先前在会话中定义的变量开始,并产生以下结果:

# these are lines typed in the REPL
In [1]: x = 10
In [2]: y = 26

# lines from Vim are silently inserted here and executed, which prints...
The answer is 36
The product of 10 and 26 is 260

# because of Vim export, z is now part of the current scope
In [3]: z
Out[3]: 36

Emacs可以很容易地完成这些工作,但是尽管搜索了很长时间,但我从来没有找到过与Vim类似行为的方法。

编辑:也许答案取决于细节(Tmux等),所以在这种情况下,我特意在MacOS上使用两个iTerm2窗格,一个运行Vim,另一个运行iPython。

4 个答案:

答案 0 :(得分:4)

在Emacs世界中,这被称为" Slime",它通常用于将Emacs与REPL连接,例如Lisp REPL。

Vim中最接近支持Python的是vim-slime

此插件要求您使用GNU Screen或Tmux,因此如果您继续在两个单独的终端中运行,则不能指望它能够正常工作。

另一种选择是使用仅适用于Neovim的Iron.Nvim。它利用了Neovim术语支持,因此您不需要Tmux / Screen。

答案 1 :(得分:1)

我为vim / neovim编写了一个REPL框架,并将其推送到:

https://github.com/SpaceVim/SpaceVim/pull/1110

在这个PR中,我将使用neovim / vim的工作特征来启动REPL过程,并通过频道使用该过程的社区。所有结果都将显示在拆分缓冲区中。

答案 2 :(得分:1)

也许你可以尝试我的插件vim-repl。它使用vim8终端功能为vim提供了一个convince repl环境。

这是github主页:vim-repl

要打开repl环境,只需运行:REPLToggle,或者您甚至可以使用以下键绑定它:

nnoremap <leader>r :REPLToggle<Cr>

要与repl进行互动,您只需选择代码并按ww即可。代码将传输到repl环境。

查看github主页了解更多详情,值得您花时间。

答案 3 :(得分:0)

我推荐vimcmdline Vim插件。

此插件将Vim或Neovim中的行发送到命令行 解释器(REPL应用程序)。支持Clojure,Golang, Haskell,JavaScript,Julia,Jupyter,Kotlin,Lisp,Macaulay2,Matlab, Prolog,Python,Ruby,Sage,Scala,Shell脚本,Swift和TypeScript (有关Vim / Neovim上的R支持,请参见Nvim-R)。口译员在 Neovim的内置终端。如果安装了Tmux,则解释器可以 还可以在外部终端仿真器或tmux窗格中运行。

https://github.com/jalvesaq/vimcmdline

vimcmdline为Vim添加了快捷方式以打开REPL,并将文本从Vim缓冲区发送到REPL进行评估,例如当前行,所选文本或光标下的函数定义。

tmux在代码发送位置增​​加了很多灵活性。您可以将带有vimcmdline已打开的REPL的tmux窗格移动到另一个tmux会话,并在另一个终端(可能在另一个监视器上)上附加到该会话。您也可以将tmux会话嵌套在vimcmdline向其发送代码的tmux窗格中,并在不同的窗格或窗口中打开多个REPL,以具有用于评估代码的单独环境,例如一种普通的REPL,另一种用于交互式调试。我通过在tmux中运行的非GUI Neovim来完成这些操作。

除了发送功能定义之类的特殊功能外,我认为vimcmdline不太在乎您使用哪种REPL或哪种编程语言。因此,您几乎可以将其与任何解释型编程语言一起使用。