我有两个终端会话,一个运行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 或什么编程语言,除了发送函数定义等特殊功能。因此,您可以将其与几乎任何解释型编程语言一起使用。