1

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

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

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

像这样的东西?

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

是否也可以合并地图?

希望我说清楚了。

4

2 回答 2

4

Vim 非常强大,我怀疑插入模式/正常模式映射不是这里最方便的方法。

一些可以帮助您入门的习语:

编辑:我建立在你之前的问题( 我如何向后视觉选择计算? )并提供了一个演示,在聊天中解释

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

在此处输入图像描述

于 2012-05-13T00:51:58.877 回答
3

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

:%g/search-pattern/normal nrX

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

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

于 2012-05-12T12:52:16.143 回答