如何在VSCode中点击不存在的Markdown链接触发Python的set_entry()函数?
方案一:自定义协议触发(最直观跨平台)
这个方法通过给Markdown链接绑定自定义协议,点击时直接调用Python脚本生成文件并打开,逻辑简单,不需要复杂的监听。
步骤1:修改Markdown链接格式
把原来的[word](word.md)改成[word](word://word),示例:
- 查看[apple](word://apple)的词汇关系 - 查看[banana](word://banana)的词汇关系
步骤2:编写Python触发脚本
创建word_handler.py脚本,处理协议请求并调用你的set_entry()函数:
import sys import os # 导入你的set_entry函数,替换成实际的模块路径 from your_dictionary_module import set_entry def main(): if len(sys.argv) < 2: return # 解析协议链接,提取单词 protocol_url = sys.argv[1] target_word = protocol_url.replace("word://", "").strip() target_file = f"{target_word}.md" # 检查文件是否存在,不存在则生成 if not os.path.isfile(target_file): set_entry(target_word) # 用VSCode打开生成的文件 os.system(f"code {target_file}") if __name__ == "__main__": main()
步骤3:注册自定义协议
根据操作系统,把word://协议关联到上面的脚本:
Windows:创建
.reg文件并导入(需管理员权限):Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\word] @="URL:Word Protocol" "URL Protocol"="" [HKEY_CLASSES_ROOT\word\shell] [HKEY_CLASSES_ROOT\word\shell\open] [HKEY_CLASSES_ROOT\word\shell\open\command] @="\"C:\\path\\to\\your\\python.exe\" \"C:\\path\\to\\word_handler.py\" \"%1\""替换路径后双击导入注册表。
macOS:创建
com.yourname.wordhandler.plist文件放到~/Library/LaunchAgents/:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>Word Protocol Handler</string> <key>CFBundleURLSchemes</key> <array> <string>word</string> </array> </dict> </array> <key>CFBundleExecutable</key> <string>/path/to/your/word_handler.py</string> </dict> </plist>替换路径后运行
launchctl load ~/Library/LaunchAgents/com.yourname.wordhandler.plist生效。Linux:在
~/.local/share/applications/创建word-handler.desktop:[Desktop Entry] Name=Word Handler Exec=/path/to/your/python3 /path/to/word_handler.py %u Type=Application MimeType=x-scheme-handler/word;运行
update-desktop-database ~/.local/share/applications/后,设置word://协议默认打开程序为该文件。
方案二:VSCode任务+文件监听
如果不想修改链接格式,可通过VSCode任务系统配合Python脚本实现:
步骤1:配置VSCode任务
在.vscode/tasks.json中添加任务,打开不存在的.md文件时触发:
{ "version": "2.0.0", "tasks": [ { "label": "Generate Missing Word Entry", "type": "shell", "command": "python3 /path/to/your/generate_script.py ${file}", "problemMatcher": [], "runOptions": { "runOn": "folderOpen" }, "condition": "!exists(${file})" } ] }
步骤2:编写Python生成脚本
generate_script.py逻辑:
import sys import os from your_dictionary_module import set_entry def main(): target_file = sys.argv[1] # 从文件名提取单词(假设文件名是word.md) target_word = os.path.splitext(os.path.basename(target_file))[0] # 生成文件 set_entry(target_word) # 通知VSCode刷新文件 os.system(f"code -r {target_file}") if __name__ == "__main__": main()
步骤3:绑定任务到打开事件
在keybindings.json中添加快捷键触发任务:
{ "key": "ctrl+o", "command": "workbench.action.tasks.runTask", "args": "Generate Missing Word Entry", "when": "editorTextFocus" }
也可使用Trigger Task on Save插件让任务自动触发。
注意事项
- 确保
set_entry()生成的文件路径与VSCode当前工作目录一致,否则VSCode可能无法找到文件。 - 测试时先手动运行脚本,确认
set_entry()能正常生成Markdown文件,再测试链接/任务触发。 - 自定义协议注册后需重启VSCode才能生效。
内容的提问来源于stack exchange,提问作者Gourmando

