Sublime Text插件在新视图执行find_all后切换为Instant File Search
Sublime Text 3插件替换操作后触发Instant File Search的解决方法
问题分析
你遇到的核心问题是:执行替换时通过newView.sel().add(region)添加选区的操作,触发了Sublime默认的Instant File Search功能(选区变化时自动激活搜索框匹配内容),导致后续编辑命令被干扰,出现乱码或执行异常。点击撤销能恢复正常,说明替换逻辑本身是正确的,只是额外触发的搜索功能打乱了流程。
解决方案
1. 移除选区操作,直接替换(最有效)
你的代码中添加选区的步骤完全多余——replace()方法不需要先将区域添加到选区内,直接传入region即可完成替换。去掉所有sel().add()和sel().clear()调用,就能避免触发选区变化导致的自动搜索。
修改后的完整代码:
# 新建标签并粘贴内容 newView = self.view.window().new_file(syntax="HTML.sublime-syntax") newView.insert(edit, 0, json.dumps(sections)) # 移除引号、逗号、方括号并换行 q = newView.find_all(r"(\x{0022}\,\s\x{0022})|(\[\x{0022})|(\x{0022}\])") for region in reversed(q): newView.replace(edit, region, "\n") # 替换{% r为<p>{% r q = newView.find_all("{% r") for region in reversed(q): newView.replace(edit, region, "<p>{% r") # 替换endreplace %}为endreplace %}</p> q = newView.find_all("endreplace %}") for region in reversed(q): newView.replace(edit, region, "endreplace %}</p>")
2. 临时禁用自动搜索功能
如果因特殊需求必须保留选区操作,可以临时关闭Sublime的auto_find_in_selection设置,操作完成后再恢复:
# 保存原设置 original_auto_find = newView.settings().get("auto_find_in_selection") # 关闭选区自动搜索 newView.settings().set("auto_find_in_selection", False) # 执行所有替换操作(包括原有的选区操作)... # 恢复原设置 newView.settings().set("auto_find_in_selection", original_auto_find)
3. 合并替换操作(优化建议)
可以将多个替换逻辑合并,减少find_all的调用次数,进一步降低触发异常的概率。比如用replace_all命令一次性处理批量替换:
# 一次性处理引号、逗号、方括号的替换 newView.run_command("replace_all", { "pattern": r"(\x{0022}\,\s\x{0022})|(\[\x{0022})|(\x{0022}\])", "replace": "\n", "case_sensitive": True, "regex": True })
验证说明
修改后执行插件,应该不会再触发Instant File Search模式,后续命令能正常执行,输出也不会出现乱码。如果仍有异常,可以尝试在所有操作完成后调用newView.run_command("clear_fields")强制关闭搜索框。
内容的提问来源于stack exchange,提问作者Shane D'Silva
相关产品推荐
相关产品推荐

