You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写NOTIFICATION.SEARCHREPLACE回调监听Notepad++手动查找替换操作

需求背景

我们有数百个包含数千行内容的文本文件,其中有大量缩写需要展开为全写。

预设实现思路

  1. 创建空的词汇表文件,用于存储查找-替换对,每对单独占一行
  2. 给NOTIFICATION.SEARCHREPLACE绑定回调函数,要求每次查找替换对话框触发、全局替换完成时都调用该回调
  3. 遍历每个文本文件:
    3.1 编程自动执行词汇表中所有已有的查找-替换操作
    3.2 手动完成其余需要的查找替换操作
    3.2.1 每完成一次手动操作,都通过步骤2的回调自动执行以下逻辑:
    3.2.1.1 检查当前查找替换对是否已存在于词汇表文件中
    3.2.1.2 若已存在:不执行操作,也可扩展功能更新该配对的统计数据,比如替换次数、选项值等,可将这类统计以逗号分隔的键值对形式存放在词汇表对应行中
    3.2.1.3 若不存在:在词汇表中新增一行存储该查找替换对,需要的话也同步存储相关统计数据

目前3.1批量执行已有替换对的功能已经实现。

待解决问题

如何编写步骤2的回调函数,来监控用户通过查找替换对话框执行的手动查找替换操作?不确定是否应该绑定NOTIFICATION.SEARCHREPLACE的回调,还是需要绑定其他事件的回调?


解决方案

你选择绑定NOTIFICATION.SEARCHREPLACE的方向是正确的,该通知会在所有搜索替换相关操作触发时推送,你只需要在回调中筛选出替换完成的事件类型,即可捕获手动执行的替换操作,提取查找内容、替换内容、匹配规则等参数。

以下是适配Notepad++ PythonScript插件的完整实现代码:

from Npp import *
import os

# 自行修改为你的词汇表存储路径
GLOSSARY_FILE_PATH = r"C:\your_custom_path\replace_glossary.txt"

def search_replace_event_callback(args):
    # 筛选替换操作:0=单次替换,1=全部替换,可自行打印args参数适配你使用的插件版本
    if args.get("operation") not in (0, 1):
        return
    
    # 提取当前替换操作的核心参数
    search_text = args.get("findWhat", "").strip()
    replace_text = args.get("replaceWith", "").strip()
    match_case = args.get("matchCase", False)
    whole_word_match = args.get("wholeWord", False)
    regex_mode = args.get("regexMode", False)

    # 跳过空的查找/替换值
    if not search_text or not replace_text:
        return

    # 读取现有词汇表的已有配对
    existing_pairs = set()
    if os.path.exists(GLOSSARY_FILE_PATH):
        with open(GLOSSARY_FILE_PATH, "r", encoding="utf-8") as f:
            for line in f:
                line = line.strip()
                if not line:
                    continue
                # 词汇表存储格式:查找值,替换值,匹配大小写,全字匹配,正则模式,替换次数
                parts = line.split(",")
                if len(parts) >= 2:
                    existing_pairs.add(
                        (parts[0], parts[1], parts[2] == "True", parts[3] == "True", parts[4] == "True")
                    )
    
    current_pair = (search_text, replace_text, match_case, whole_word_match, regex_mode)
    if current_pair in existing_pairs:
        # 如需统计替换次数,可在此处新增更新对应行计数的逻辑
        return
    
    # 新增配对写入词汇表
    with open(GLOSSARY_FILE_PATH, "a", encoding="utf-8") as f:
        f.write(f"{search_text},{replace_text},{match_case},{whole_word_match},{regex_mode},1\n")

# 绑定回调到搜索替换事件
notepad.callback(search_replace_event_callback, [NOTIFICATION.SEARCHREPLACE])

注意事项

  • 代码需要在Notepad++的PythonScript插件环境中运行
  • 如果要让回调随Notepad++启动自动生效,需要将上述代码添加到PythonScript插件的startup.py文件中,并将插件启动模式设置为「AT STARTUP」
  • 不同版本的PythonScript插件返回的args字段可能存在细微差异,如取不到对应参数,可在回调中添加console.write(str(args))打印完整事件参数,自行调整字段名即可
  • 如果你不需要保留匹配规则,只需要存储查找替换文本对,可直接只判断查找和替换文本两个字段,忽略其他参数即可

内容的提问来源于stack exchange,提问作者Boris Alekseev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 09:06:03