我有两个终端会话,一个运行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。
答案 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或哪种编程语言。因此,您几乎可以将其与任何解释型编程语言一起使用。