如何在搜索后找到的每个匹配项上使用地图?
我创建了使用地图调用的各种函数。
我想在找到的每个搜索匹配项上使用地图。
如果我在文本中搜索日期,我将如何在找到的每个搜索匹配项上应用 ai/v/nmap?
像这样的东西?
%s/search-pattern/=\normal mode map/g
%s/search-pattern/=\insert mode map/g
是否也可以合并地图?
希望我说清楚了。
Vim 非常强大,我怀疑插入模式/正常模式映射不是这里最方便的方法。
一些可以帮助您入门的习语:
编辑:我建立在你之前的问题( 我如何向后视觉选择计算? )并提供了一个演示,在聊天中解释
qqniMyText<Esc>q
这将在每个匹配位置插入“MyText”。现在,重复一百次:100@q(考虑设置:se nowrapscan
以避免从顶部重新启动)。
:global
:g/somepattern/norm! Aappended<Esc>
将文本“附加”附加到包含搜索模式的每一行
您可以使用替换模式执行一些“静态”编辑操作:
:%s/\v(\d\d)-(\d\d)-(\d{4})/\3\2\1/g
将 dd-mm-yyyy 转换为 yyyymmdd 日期戳。
要进行动态评估替换(\=
在替换表达式中使用 vimscript with),您几乎可以做任何事情(包括发送邮件或打印文档,如果您真的想要的话):
:%s/\v<DB_\w+>/\=substitute(submatch(0), '\v_?([^_])([^_]*)', '\U\1\L\2', 'g')/g
转换“数据库样式”名称,例如
var DB_USER_ID = f();
var DB_USER_FIRST_NAME = f();
var DB_USER_LAST_NAME = f();
var DB_USER_HOME_ADDRESS = f();
进入“驼峰样式名称”,例如:
var DbUserId = f();
var DbUserFirstName = f();
var DbUserLastName = f();
var DbUserHomeAddress = f();
编辑回应评论/聊天:您可以很容易地使用方法#1:
/\v\c\s*\zs(\s{-}(((sqrt|log|sin|cos|tan|exp)?\(.{-}\))|(-?[0-9,.]+(e-?[0-9]+)?)|([-+*/%^]+)))+(\s*\=?)?\s*
qqa<M-.><Esc>nq
现在您可以对所有文档重复:
:set nowrapscan
100@q
如果每一行只有一个匹配项,您可以使用:global
代替:s
:
:%g/search-pattern/normal nrX
将:[range]normal
光标定位在行首,因此n
要转到映射之前的第一个匹配项(我rX
用作示例)。您可以编写一个自定义命令来处理一行中的所有匹配项,但我会使用递归宏来解决您的用例:
首先,执行搜索:/search-pattern
,然后记录一个包含你的映射的宏,它会跳转到最后的下一个匹配:qarXnq
。您现在可以通过 手动重复应用宏,或通过或@a
使其递归。执行一次,它将一直运行,直到匹配完为止。qA@aq
:let @a .= '@a'
@a