如何在Vim中像Matlab一样在两行之间select?

How to select between two lines like Matlab in Vim?

在 Matlab 中,有一种方法可以在两个预定义的类型标记之间 select 编码。我想使用 ## 作为块标记在 Python 上复制相同的内容。例如,假设光标位于变量 y1 上的 Block 2 中:

## Block 1
import numpy as np
import matplotlib.pyplot as plt


## Block 2
x = np.linspace(0, np.pi*4, 100)

y1 = np.sin(x)  # <== My cursor is here
y2 = np.cos(x)  
y3 = np.tan(x)

## Block 3
for i in range(5):
    print(i)
plt.plot(x, y)
plt.show()

我想将以下块拉入我的寄存器

## Block 2
x = np.linspace(0, np.pi*4, 100)

y1 = np.sin(x)  # <== My cursor is here
y2 = np.cos(x)  
y3 = np.tan(x)

============================================= ==

编辑 1:我搜索了整个 Whosebug,但找不到任何人提出类似的问题。其中大部分是如何 select 函数或 类 在 python 中。我知道这是可能的,因为我找到了一个可以执行此操作的插件,wmvanvliet/jupyter-vim(请参阅自述文件的第一部分以获取其工作视频)。但它是一个完整的 REPL,它使我的启动时间增加了 200 毫秒。

我相信有一种简单的 vim 方法可以做到这一点。我就是找不到

您可以使用

/^## 找到块的开始和结束位置。

如果你的光标在中间,你可以使用N转到上一个命中(即块的开始),按v进入可视模式,然后命中n 转到下一个块开始。由于您不想拉下一个块开始,因此您需要使用 k 向上移动一行(还有其他方法,但这很好用,因为无论如何块之间都有一个空行)。

综合起来:

/^##<CR>Nvnk

将 select 你光标所在的块。

如果输入的字符太多,您可以将其变成函数或宏。 Here 是关于如何将命令组合成宏的很好的教程。如果我们想制作一个宏并将其保存在寄存器 b 中(我猜是为了块?),我们可以这样做

qb/^##<CR>Nvnkq

并用@b执行宏。