如何查询搜索中的最高位?
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
ysiw}
使用 vim-surround 将单词括在大括号中。
wysiw}
重复该操作
wyiw
猛拉词
ic3::
在插入模式下添加 c3::
<= 如何根据文件中的最高完形填空数计算 3?
^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
宏。
正在搜索模式 /{{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
ysiw}
使用 vim-surround 将单词括在大括号中。wysiw}
重复该操作wyiw
猛拉词ic3::
在插入模式下添加c3::
<= 如何根据文件中的最高完形填空数计算 3?^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
宏。