将 Vim 与 Python REPL 会话连接起来



我有两个终端会话,一个运行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。

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

在 Vim 中,最接近支持 Python 的东西是 vim-sm。

这个插件要求你使用GNU Screen或Tmux,所以如果你继续在两个单独的终端中运行,你不能指望它能工作。

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

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

这是GitHub的主页:vim-repl

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

nnoremap <leader>r :REPLToggle<Cr>

要与 repl 交互,您只需选择代码并按ww。并且代码将被传输到 repl 环境。

查看github主页以获取更多详细信息,值得您花时间。

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

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

在此 PR 中,我将使用 neovim/vim 的工作功能来启动 REPL 流程,并通过通道与流程建立社区关系。 所有结果将显示在拆分缓冲区中。

我推荐vimcmdline Vim插件。

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

(https://github.com/jalvesaq/vimcmdline(

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

TMUX 为代码的发送位置增加了很大的灵活性。您可以使用 vimcmdline 已打开的 REPL 将 tmux 窗格移动到另一个 tmux 会话,并在不同的终端(可能在不同的监视器上(连接到该会话。您还可以在 vimcmdline 向其发送代码的 tmux 窗格中嵌套一个 tmux 会话,并在不同的窗格或窗口中打开多个 REPL,以具有单独的环境来评估代码,例如一个普通 REPL 和一个用于交互式调试。我用在tmux中运行的非gui Neovim来做这些事情。

我不认为 vimcmdline 太关心你正在使用哪个 REPL 或什么编程语言,除了发送函数定义等特殊功能。因此,您可以将其与几乎任何解释型编程语言一起使用。

最新更新