我想写一个Notepad++宏,它应该将char1、char2和char3分别替换为char4、char5和char6。
Notepad++中的宏只是一组编码操作:您开始录制,对缓冲区进行操作,可能会激活菜单,停止录制,然后播放宏。
经过调查,我发现它们保存在快捷方式.xml文件的宏部分中。例如,我在那里有:
<Macro name="Trim Trailing and save" Ctrl="no" Alt="yes" Shift="yes" Key="83">
<Action type="1" message="2170" wParam="0" lParam="0" sParam=" " />
<Action type="1" message="2170" wParam="0" lParam="0" sParam=" " />
<Action type="1" message="2170" wParam="0" lParam="0" sParam=" " />
<Action type="0" message="2327" wParam="0" lParam="0" sParam="" />
<Action type="0" message="2327" wParam="0" lParam="0" sParam="" />
<Action type="2" message="0" wParam="42024" lParam="0" sParam="" />
<Action type="2" message="0" wParam="41006" lParam="0" sParam="" />
</Macro>
看起来我们向 Scintilla(编辑组件,可能是类型 0 和 1)和 Notepad++ 本身发送消息(可能激活菜单项)。我没有查看源代码,但从外观上看,我会这样说。
我认为它不会记录对话框中的操作(例如搜索/替换)。
查看 Scintilla.iface 文件,我们可以看到 2170 是 ReplaceSel 的代码(插入字符串,如果没有选中任何内容),2327 是 Tab 命令,Resource Hacker(方便使用……)显示 42024 是“清除尾随空格”菜单项,41006 是“保存”。
我猜动作类型 0 是带有数字参数的 Scintilla 命令,类型 1 是带有字符串参数的命令,2 是 Notepad++ 命令。
问题:Scintilla 没有“全部替换”命令:这是客户端进行迭代的任务,无论是否需要确认等等。
另一个问题:似乎类型 1 的操作仅限于 1 个字符(我手动编辑过,在退出 N++ 时被截断了)。
我尝试了一些技巧,但我担心这样的任务超出了宏的能力范围。
也许这就是 SciTE 以其 Lua 脚本功能(或者似乎可以使用 Python 进行脚本化的 Programmer's Notepad)有优势的地方…… :-)
[编辑] 看起来我从此线程或类似位置获取了上述宏…… :-) 我猜第一行是不必要的(副作用或录制),但它们仍然是好的宏代码示例。
我发现使用Notepad++中的'Python脚本'插件更为实用,因为通过该插件,我可以以Python语言编写简单的宏,并且该插件具有非常好的文档和示例宏供参考。如果您对Python语言很熟悉,那么我认为'Python脚本'插件将会很有用。
欲了解更多信息,请参考:http://npppythonscript.sourceforge.net/
我录制了一个宏,发现它在%APPDATA%\Notepad++\shortcuts.xml中。它看起来像是在这个帖子的第一篇文章中发布的。
我使用的是NPP Ver.5.9.6.2和Win7。
虽然距离OP发布已经超过10年,但我认为这仍然是个相关的问题(至少对我来说是)。如今,在Notepad++用户手册中有相当多的信息与OP提出的问题有关:
以下是一个宏代码块:使用正则表达式将SEARCHTEXT替换为REPLACETEXT,“.”可以查找/r和/n,在路径PATH的每个符合GLOBFILEFILTER过滤器的文件中执行替换(不包括子文件夹,我不确定此标记在哪里定义/设置)。
<Macro name="REPLACE_IN_FILES_REGEX_DOT_FINDS_CR_AND_LF" Ctrl="no" Alt="no" Shift="no" Key="0">
<Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
<Action type="3" message="1601" wParam="0" lParam="0" sParam="SEARCHTEXT" />
<Action type="3" message="1625" wParam="0" lParam="2" sParam="" />
<Action type="3" message="1602" wParam="0" lParam="0" sParam="REPLACETEXT" />
<Action type="3" message="1653" wParam="0" lParam="0" sParam="PATH" />
<Action type="3" message="1652" wParam="0" lParam="0" sParam="GLOBFILEFILTER" />
<Action type="3" message="1702" wParam="0" lParam="1024" sParam="" />
<!-- #COMMENT: "1024" seems to be the flag ". finds /n and /r". This is not in the documentation. -->
<Action type="3" message="1701" wParam="0" lParam="1660" sParam="" />
</Macro>
关于此代码的说明:
假设是字母数字组成的单词,您可以使用以下代码:
搜索 = ^([A-Za-z0-9]+)$ 替换 = able:"\1"
或者,如果您只想突出显示行并使用“全部替换”和“选择内”的相同替换:
搜索 = ^(.+)$
^指向行的开头。 $指向行的结尾。
\1将是括号内源匹配。
我的个人经验是,当Notepad++退出时,shortcuts.xml会被最初加载和后来记录的宏和设置覆盖。因此,您不能使用Notepad++本身来编辑此文件。
关闭Notepad++,使用其他工具编辑shortcuts.xml,保存并重新启动Notepad++。
我不确定这是否有帮助,但我需要创建一个宏来保存片段,所以我只是录制了自己插入项目并设置了快捷方式。当然,我没有使用5.9版本,因此可能会有一些轻微的版本差异。要访问宏记录器,请转到“宏”>“开始录制”。然后执行您的操作,然后转到“宏”>“停止录制”。我建议回放以确保正确性,然后保存并设置您的快捷键。
希望这有所帮助。
实际上,shortcuts.xml 文件并没有存储用户生成的宏,也没有明显的备选项包含此信息。这些说明已过时。
与各种网站的提示相反,v.5.4.2 并未启用存储用户生成的宏。该 XML 文件存在,但您的宏不会被存储在其中。
我猜这是一个 bug,将在下一个版本中得到修复。