1

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

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

示例卡:

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


## Back
...

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

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

:registers
"c   ysiw}wysiw}wyiwic3::^OP::reading
  • ysiw}使用 vim-surround 将单词括在大括号中。
  • wysiw}重复该操作
  • wyiw猛拉这个词
  • ic3::在插入模式中添加c3::<=如何从文件中的最高完形填空数计算 3?
  • ^OP以插入模式粘贴被抽出的单词
  • ::reading添加剩余的文本。
4

1 回答 1

4

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

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

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

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>

在普通模式下,它将作用于光标下的单词(非空白符号序列)。在视觉模式下,它将作用于视觉选择。这些更接近您的原始@c宏。

于 2020-09-11T06:25:07.700 回答