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

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 会在通过缓冲区时移动光标,因此在操作后恢复视图足以让它以&lt;C-R&gt;= 现在可以工作的方式恢复原位用它。 这是完美的。我也想知道如何处理视觉选择,你给了我解决方案。非常感谢!看来真的要学一点vimscript了^^' @AdrienLemaire 不客气,很高兴! ? 如果您决定认真(或更认真地)对待 Vimscript,我的建议是 Steve Losh 的 Learn Vimscript the Hard Way,这是一个很好的起点。还可以查看Vi and Vim,那里有很多 Vimscript 向导!周末愉快! 哦,感谢您提出的好问题!这是一个需要一些工作才能弄清楚的问题。我很高兴地说我也从中学到了很多东西。尤其是那些没有马上解决的位,比如插入函数结果时的光标位置……干杯!

以上是关于如何查询搜索中的最高位?的主要内容,如果未能解决你的问题,请参考以下文章

sql 如何查询每个班级中的最高分

java中的二进制的问题

汇编中的有符号-无符号-溢出-进位

如何根据 SQL Server 中的最高点和最低时间计算排名

SQL 查询为其他列中的每个唯一条目返回最高和最低

汇编中的移位指令(8086CPU)