如何在搜索后找到的每个匹配项上使用地图?
我创建了各种使用地图调用的函数 我想在找到的每个搜索匹配上使用这些地图。
如果我在文本中搜索日期,我将如何在找到的每个搜索匹配中应用i / v / nmap?
这样的事情?%s/search-pattern/=\normal mode map/g
%s/search-pattern/=\insert mode map/g
是否也可以组合地图?
希望我能说清楚。
答案 0 :(得分:4)
Vim非常强大,我怀疑插入模式/普通模式地图不是最方便的方法。
一些可能让你开始的习语:
修改:我建立在您之前的问题上( How do I visual select a calculation backwards? 并提供了一个演示,解释in chat
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),您几乎可以执行任何操作(包括发送邮件或打印文档,如果您真的想要):
:%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
答案 1 :(得分:3)
如果每行只有一个匹配项,则可以使用:global
代替:s
:
:%g/search-pattern/normal nrX
:[range]normal
将光标定位在行的开头,因此n
将转到映射前的第一个匹配项(我以rX
为例)。你可以编写一个自定义命令来处理一行中的所有匹配,但我会用递归宏来解决你的用例:
首先,执行搜索:/search-pattern
,然后记录包含映射的宏,该宏跳转到最后的下一个匹配项:qarXnq
。您现在可以通过@a
重复手动应用宏,或通过qA@aq
或:let @a .= '@a'
进行递归。执行一次@a
,它将一直运行,直到匹配用完为止。