查看原文
其他

vimTermPipe - 在vim中发送代码到终端执行

Shawn Chen YuLabSMU 2022-09-24

写这个插件(https://github.com/ShawnChen1996/vimTermPipe)的初衷呢,是因为本人很喜欢vim的轻量,高效和可定制性。然后由于我常常需要写python和R代码,需要一边写一边运行, 所以本插件的功能就是将vim中的文本发送至terminal中,在python,julia,R和matlab这样的交互环境中,十分方便。

在写这个插件之前,我也用过一个类似于本插件的vim插件 vimcmdline, 可是由于python和ipython的换行符不同的问题,ipython下总是有问题,用着难受,就萌生了在vim里自己实现和优化这个功能的想法。

如何安装

可以使用Vim-plug 这样的插件管理器,或者简单地将下载下来的文件夹扔进 ~/.vim (nvim用户 ~/.config/nvim)。

主要功能

发送文本至terminal

你可以选择发送单行代码,多行的代码块,或者选中的代码。(默认快捷键 Ctrl-Enter, 在vim里记作<C-Enter>)。

1. 在普通模式,按下 <C-Enter>, 发送该行,若该行是一个代码段的第一行,则发送整个代码段。

支持的代码段格式有:

def foo():
return 1

a = [1,2,
3,4,5]

a = [1,2,
3,4,5
]

a = (1,2,3,
4,5
)

for i in range(10):
print(i)


foo = function(x){
return 1
}
for i in list:
echo i
endif

2. 如果插件搜寻到的代码段不正确,你也可以选中一部分代码,使用快捷键发送。


多终端使用场景

除了发送文本,这个插件还能很方便的处理多文件编辑时使用多终端的场景

  1. 当用户首次按下快捷键时,本插件会将当前编辑的文件与最新打开的终端关联,并将以后所有发送的文本发送到这个终端。所以这时,如果你再打开一个文件和一个终端并按下快捷键时,该文件会与该终端关联。所以你可以打开两三个文件,并对应打开两三个终端,分别发送代码并互不干扰(理论上,只要你的屏幕够大,你可以开n+1个)。

  2. 当然有时候这种关联机制下,用户一不小心也会把文件和终端关联错,为了应对这种问题,我特意写了一个函数,用来重新制定关联。在vim下,你可以按:ls来查看所有的文件的编号(包括终端的编号),查看你想重新关联的终端的编号,将光标移动到你要重新关联的文件内,按下:LinkTerm 编号来实现重新关联. 至此,你的代码就可以指哪打哪了。

使用方法

准备工作:将下面的配置复制到你的vim配置文件中,

nmap <C-Enter> <Plug>SendBlock
vmap <C-Enter> <Plug>SendSelection
  1. 打开一个文件
  2. :sp回车,按:terminal回车可以获得终端, 在终端输入 pythonR 进入对应的环境
  3. 回到代码文件,将光标放置在你想发送的行,就可以愉快地 <C-Enter>了。

如果默认的快捷键 ctrl enter失效的话,可以换别的,Debian机子 ctrl enter不行, alter enter就可以

往期精彩

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存