Vim 如何查询搜索中的最高数字?

Vim 如何查询搜索中的最高数字?,vim,vim-registers,Vim,Vim Registers,在搜索模式/{c\d时,我希望获得找到的最高数字,并在宏中使用它 在上下文中,我正在使用Anki flashcard工具及其完形填空卡片类型,最近开始在vim中创建我的卡片 示例卡: ## Front reading: {{c1::A::reading A}} B {{c2::C::reading C}} {{c1::D::reading D}} E ## Back ... 在那个例子中,假设我位于E之上,我想执行一个宏,它将计算出{c2::C::reading C}中的最高完形填空位数

在搜索模式/{c\d时,我希望获得找到的最高数字,并在宏中使用它

在上下文中,我正在使用Anki flashcard工具及其完形填空卡片类型,最近开始在vim中创建我的卡片

示例卡:

## Front
reading: 
{{c1::A::reading A}}
B
{{c2::C::reading C}}
{{c1::D::reading D}}
E


## Back
...
在那个例子中,假设我位于E之上,我想执行一个宏,它将计算出{c2::C::reading C}中的最高完形填空位数是2,并创建一个新的完形填空,最高位数增加1,作为{{c3::E::reading E}

我的宏当前看起来如下所示:

:registers
"c   ysiw}wysiw}wyiwic3::^OP::reading
ysiw}使用vim环绕将单词用大括号括起来。 wysiw}重复该操作 维伊猛拉这个词 ic3::adds c3::在插入模式下可以使用带有[/n]标志的:%s命令,该命令不执行替换,只统计匹配项

将其与替换端的表达式一起使用,仅用于表达式的副作用

您可以使用它将完形填空数字附加到列表中,然后在收集完所有完形填空数字后找到最大值

function! NextCloze()
    let nums = [0]
    let view = winsaveview()
    silent %s/\m{{c\zs\d\+\ze::/\=add(nums, submatch(0))/egn
    call winrestview(view)
    return 1 + max(nums)
endfunction
该函数还将围绕%s操作保存和恢复视图,因为该操作将移动光标,我们希望将光标保持在原位

将其插入映射的中间,可以使用类似:

i{{c<C-R>=NextCloze()<CR>::
在正常模式下,它将作用于光标下非空白符号的字序。在视觉模式下,它将作用于视觉选择。这些宏更接近原始的@c宏。

您可以使用带有[/n]标志的:%s命令,该命令不执行替换,只计算匹配项

将其与替换端的表达式一起使用,仅用于表达式的副作用

您可以使用它将完形填空数字附加到列表中,然后在收集完所有完形填空数字后找到最大值

function! NextCloze()
    let nums = [0]
    let view = winsaveview()
    silent %s/\m{{c\zs\d\+\ze::/\=add(nums, submatch(0))/egn
    call winrestview(view)
    return 1 + max(nums)
endfunction
该函数还将围绕%s操作保存和恢复视图,因为该操作将移动光标,我们希望将光标保持在原位

将其插入映射的中间,可以使用类似:

i{{c<C-R>=NextCloze()<CR>::

在正常模式下,它将作用于光标下非空白符号的字序。在视觉模式下,它将作用于视觉选择。这些更接近您原来的@c宏。

@fibranden感谢您的回复,这看起来是一个非常好的解决方案,但我注意到了一个奇怪的行为。返回的结果打印在行的第一个位置,而不是光标的位置。此外,返回的数字不是最高匹配+1。我甚至不明白为什么它会返回它返回的数字。分享一个视频,我希望我的光标加上5,但在行首得到3:@AdrienLemaire感谢视频,这样很容易解决问题!第一个问题是,我用^锚定正则表达式,所以只在行的开头寻找它。还缺少/g以匹配同一行上的多个条目。第二个问题有点棘手,但事实证明,这是因为%s在通过缓冲区时会移动光标,因此在操作后恢复视图就足以使其以一种=now可以使用的方式重新就位。这非常完美。我还想知道如何处理视觉选择,你给了我解决方案。非常感谢你!看起来我真的需要学一点vimscript^^@AdrienLemaire不客气,很荣幸!哦,谢谢你的提问!这是一个需要花点时间才能弄清楚的问题。我很高兴地说,我也从中学到了很多东西。特别是那些不能马上解决的位,比如插入函数结果时的光标位置。。。干杯@fibranden谢谢你的回复,这看起来是一个很好的解决方案,但我注意到了一个奇怪的行为。返回的结果打印在行的第一个位置,而不是光标的位置。此外,返回的数字不是最高匹配+1。我甚至不明白为什么它会返回它返回的数字。分享一个视频,我希望我的光标加上5,但在行首得到3:@AdrienLemaire感谢视频,这样很容易解决问题!第一个问题是,我用^锚定正则表达式,所以只在行的开头寻找它。还缺少/g以匹配同一行上的多个条目。第二个问题有点棘手,但事实证明,这是因为%s在通过缓冲区时会移动光标,因此在操作后恢复视图就足以使其以一种=now可以使用的方式重新就位。这非常完美。我还想知道如何处理视觉选择,你给了我解决方案。非常感谢你!看起来我真的需要学一点vimscript^^@AdrienLemaire不客气,很荣幸!哦,谢谢你的提问!这是一个需要花点时间才能弄清楚的问题。我很高兴地说,我也从中学到了很多东西。尤其是 无法立即解决的位,例如插入函数结果时的光标位置。。。干杯