Select 在 neovim 中向前和向后到任意字符串

Select forward and backward to arbitrary string in neovim

我正在学习使用tmux+neovim+ipython作为科学pythonIDE,主要用于数据处理和制图。

为了让我可以轻松地重新运行一段代码,我怎样才能创建一个从光标位置向前和向后 select 到某个任意标记的快捷方式?。例如。如果标记设置为 #$% 并且我的光标位于以下行中的

#$%
x = bigarray[:, 0]
y = bigarray[:, 1]
scalar = 1.5¶
y = y * scalar
axis1.plot(x, y)#$%

我想进入正常模式,输入 <leader>s,然后 selected:

x = somearray[:, 0]
y = somearray[:, 1]
scalar = 1.5
y = y * scalar
axis1.plot(x, y) 

我找到了 vim 的 object-select 文档,这与我想做的类似,但只适用于特定字符。


编辑:同样重要的是,如果存在多个,则只有当前部分被 selected。 IE。使用以下文件,

#!/usr/bin/env python3
#$%
section_1()¶
#$%
stuff_not_in_a_section
#$%
section_2()
#$%

<leader>s 必须 select 只有 section_1()


编辑 2:使用不同的 beginning/ending 符号也可以,例如{{{}}} 的默认折叠标记。


我认为与 vim-slime 的组合,它向 ipython 发送一个 selection,以及一个匹配的 set foldmarker,将使 neovim 成为一个很好的选择IDE。也欢迎对我的情况采取另一种方法。

您可以使用搜索模式:

/\v(#$\%)@<=%(.|\n|\r){-}(#$\%)@=

这将匹配 #$% 的两个实例之间的文本。然后select光标下的匹配使用:

nnoremap <leader>s mm/\v(#$\%)@<=%(.\|\n\|\r){-}(#$\%)@=<cr>'mgn

这将:

  1. 标记光标位置(mm)
  2. 搜索模式 (/\v(#$\%)@<=%(.\|\n\|\r){-}(#$\%)@=<cr>)
  3. Return 到标记位置 ('m)
  4. Select 匹配模式 (gn)

我找到了一个我最满意的解决方案。它要求将代码部分定义为基于标记的 folds/sections,这大概就是我一直使用折叠的方式。

如果我在折叠内并按 za 将其关闭然后 C-c C-c 将段落发送到 vim-slime,则发送整个折叠,无论内部如何换行符。根据需要将光标 returns 移动到命令末尾的上一个位置。

所以总共

nmap <leader>s za<C-c><C-c>za 

虽然在折叠打开和关闭时会出现一些恼人的屏幕闪烁,但还是有效果的。