如何编写NOTIFICATION.SEARCHREPLACE回调监听Notepad++手动查找替换操作
需求背景
我们有数百个包含数千行内容的文本文件,其中有大量缩写需要展开为全写。
预设实现思路
- 创建空的词汇表文件,用于存储查找-替换对,每对单独占一行
- 给NOTIFICATION.SEARCHREPLACE绑定回调函数,要求每次查找替换对话框触发、全局替换完成时都调用该回调
- 遍历每个文本文件:
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
相关产品推荐
相关产品推荐

