如何查询搜索中的最高位?
Posted
技术标签:
【中文标题】如何查询搜索中的最高位?【英文标题】:how to query the highest digit in a search? 【发布时间】:2020-12-29 13:24:10 【问题描述】:搜索模式/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 ysiwwysiwwyiwic3::^OP::reading
ysiw
使用 vim-surround 将单词括在大括号中。
wysiw
重复该操作
wyiw
抽出这个词
ic3::
在插入模式下添加 c3::
如何从文件中的最高完形填空数计算 3?
^OP
在插入模式下粘贴被抽出的单词
::reading
添加剩余的文本。
【问题讨论】:
【参考方案1】:您可以使用带有 [/n
] 标志的 :%s
命令,它不会执行替换,而只会计算匹配项。
将其与替换端的 \=
表达式一起使用,仅用于表达式的副作用。
您可以使用它来将 完形填空 数字附加到列表中,然后在收集完所有数字后找到最大值。
function! NextCloze()
let nums = [0]
let view = winsaveview()
silent %s/\mc\zs\d\+\ze::/\=add(nums, submatch(0))/egn
call winrestview(view)
return 1 + max(nums)
endfunction
该函数还保存和恢复%s
操作周围的视图,因为该操作将移动光标,我们希望将其保持在原位。
要将其插入到映射的中间,您可以使用以下内容:
ic<C-R>=NextCloze()<CR>::
虽然可能有其他方法可以将结果放入缓冲区。例如,如果您想要一个将光标下的当前单词替换为 cN::...::reading ...
块的映射,请考虑以下几点:
nnoremap <Leader>c ciWc<C-R>=NextCloze()<CR>::<C-R>"::reading <C-R>"<Esc>
xnoremap <Leader>c cc<C-R>=NextCloze()<CR>::<C-R>"::reading <C-R>"<Esc>
在普通模式下,它将作用于光标下的单词(非空白符号序列)。在视觉模式下,它将作用于视觉选择。这些更接近您原来的 @c
宏。
【讨论】:
@fibranden 感谢您的回复,这看起来是一个绝妙的解决方案,但我注意到一个奇怪的行为。返回的结果打印在该行的第一个位置,而不是我的光标位置。另外,返回的数字不是最高匹配+ 1。我什至无法弄清楚它为什么返回它返回的数字。分享一个视频,我预计 5 将添加到我的光标,但在行首获得 3:youtu.be/gSHx-FoIjEw @AdrienLemaire 感谢您的视频,这样很容易解决问题!第一个问题是我用^
锚定了正则表达式,所以只在行首寻找它。还缺少 /g
以匹配同一行上的多个条目。第二个问题有点棘手,但事实证明这是因为%s
会在通过缓冲区时移动光标,因此在操作后恢复视图足以让它以<C-R>=
现在可以工作的方式恢复原位用它。
这是完美的。我也想知道如何处理视觉选择,你给了我解决方案。非常感谢!看来真的要学一点vimscript了^^'
@AdrienLemaire 不客气,很高兴! ? 如果您决定认真(或更认真地)对待 Vimscript,我的建议是 Steve Losh 的 Learn Vimscript the Hard Way,这是一个很好的起点。还可以查看Vi and Vim,那里有很多 Vimscript 向导!周末愉快!
哦,感谢您提出的好问题!这是一个需要一些工作才能弄清楚的问题。我很高兴地说我也从中学到了很多东西。尤其是那些没有马上解决的位,比如插入函数结果时的光标位置……干杯!以上是关于如何查询搜索中的最高位?的主要内容,如果未能解决你的问题,请参考以下文章