如何将地图与搜索匹配结合使用?

时间:2012-05-12 09:46:59

标签: search vim maps match

如何在搜索后找到的每个匹配项上使用地图?

我创建了各种使用地图调用的函数 我想在找到的每个搜索匹配上使用这些地图。

如果我在文本中搜索日期,我将如何在找到的每个搜索匹配中应用i / v / nmap?

这样的事情?

%s/search-pattern/=\normal mode map/g
%s/search-pattern/=\insert mode map/g

是否也可以组合地图?

希望我能说清楚。

2 个答案:

答案 0 :(得分:4)

Vim非常强大,我怀疑插入模式/普通模式地图不是最方便的方法。

一些可能让你开始的习语:

  

修改:我建立在您之前的问题上(   How do I visual select a calculation backwards?   并提供了一个演示,解释in chat

1。录制宏:

qqniMyText<Esc>q

这将在每个匹配位置插入“MyText”。现在,重复一百次:100 @ q (考虑设置:se nowrapscan以避免从顶部重新启动。)

2。使用:global

:g/somepattern/norm! Aappended<Esc>

会将“附加”文本追加到包含搜索模式的每一行

3。使用智能替换:

您可以使用替换模式执行一些“静态”编辑操作:

:%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

enter image description here

答案 1 :(得分:3)

如果每行只有一个匹配项,则可以使用:global代替:s

:%g/search-pattern/normal nrX

:[range]normal将光标定位在行的开头,因此n将转到映射前的第一个匹配项(我以rX为例)。你可以编写一个自定义命令来处理一行中的所有匹配,但我会用递归宏来解决你的用例:

首先,执行搜索:/search-pattern,然后记录包含映射的宏,该宏跳转到最后的下一个匹配项:qarXnq。您现在可以通过@a重复手动应用宏,或通过qA@aq:let @a .= '@a'进行递归。执行一次@a,它将一直运行,直到匹配用完为止。