如何查询搜索中的最高位?

how to query the highest digit in a search?

正在搜索模式 /{{c\d,我想找到找到的最高数字并在宏中使用它。

就上下文而言,我正在使用 Anki(抽认卡工具)及其完形填空卡片类型,并且最近开始在 vim.

中创建我的卡片

示例卡片:

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


## Back
...

在那个例子中,假设我位于 E 上方,我想执行一个宏来计算出最高的完形填空数字是 2(在 {{c2::C::reading C}} 中)并创建一个新的完形填空最高位加一为 {{c3::E::reading E}}

我的宏目前看起来像这样:

:registers
"c   ysiw}wysiw}wyiwic3::^OP::reading

您可以使用带有 [/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>::

虽然可能还有其他方法可以将结果放入缓冲区。例如,如果您想要一个将光标下的当前单词替换为 {{cN::...::reading ...}} 块的映射,请考虑这些:

nnoremap <Leader>c ciW{{c<C-R>=NextCloze()<CR>::<C-R>"::reading <C-R>"}}<Esc>
xnoremap <Leader>c c{{c<C-R>=NextCloze()<CR>::<C-R>"::reading <C-R>"}}<Esc>

普通模式下,作用于光标下的字(non-whitespace符号的序列)。在视觉模式下,它将作用于视觉选择。这些更接近您原来的 @c 宏。