我定义了以下函数,直接调用时可以正常工作:
函数 EncloseParagraphs() 执行“正常 `>a</p>\<Esc>`<i<p>\<Esc>” %s/\%V\n\{2,}\%V/<\/p>\r\r<p>/ge 诺尔 结束函数
但是当我使用以下映射时
映射 <silent> <CP> :call EncloseParagraphs()<CR>
结果如下
<p><p><p>这是一个段落。</p></p></p> <p><p><p>这是一个段落。</p> </p></p>
换句话说,在可视模式下选择多个段落时,会添加多个 p 标签。为什么通过映射的快捷方式调用时该函数的行为会有所不同?
答案1
来自 Vim 帮助文档:
help :call
--snip--
When a range is given and the function doesn't handle it
itself, the function is executed for each line in the range,
with the cursor in the first column of that line. The cursor
is left at the last line (possibly moved by the last function
call). The arguments are re-evaluated for each line.
看起来,由于您选择(突出显示)了一组行,然后按下 CP,因此您的函数会针对该块执行多次,每选择一行执行一次。
我想您需要在函数内实现范围处理以防止:call 函数提供的多次执行(!)。
:call 函数帮助文档的其余部分讨论了如何处理范围并避免此问题。