nppexec本质是命令调度器,能否运行取决于系统path、路径编码和文件保存状态;需用绝对路径+双引号+& pause防闪退,首行必须npp_save,中文乱码需chcp 65001,多语言靠$(ext_part)条件跳转。

NppExec 不是“运行代码的开关”,而是把 Notepad++ 变成一个轻量命令调度器——它不自带解释器,只负责拼出一条能在 CMD 里敲通的命令,并把输出接回来。能不能跑通,取决于你的系统 PATH、路径编码、文件保存状态这三点。
为什么 python "$(FULL_CURRENT_PATH)" 总是报错或一闪而过
这不是 NppExec 的 bug,是 Windows 控制台行为 + 插件执行时序叠加的结果。
- 不加
& pause或npp_console 1:命令执行完控制台立即关闭,根本看不到报错信息 - 只写
python不写绝对路径:NppExec 启动的 CMD 不继承系统 PATH,python --version在 CMD 里能跑 ≠ NppExec 里能跑 - 用
$(FILE_NAME)替代$(FULL_CURRENT_PATH):当前工作目录可能不是文件所在目录,导致import失败 - 中文路径未处理:NppExec 底层用 ANSI 调用 CMD,UTF-8 路径(如
D:\测试\hello.py)会被截断或乱码
最简修复:把命令改成 "C:\Python39\python.exe" "$(FULL_CURRENT_PATH)" & pause,并确保路径全是英文。
如何用一套脚本自动识别 .py/.js/.java 并分别执行
靠 $(EXT_PART) 做条件跳转,比手动切脚本快,也避免快捷键冲突。
关键点:
- 第一行必须是
NPP_SAVE:否则运行的是磁盘上旧版本,改了代码也白搭 -
cd $(CURRENT_DIRECTORY)要紧接其后:保证javac或node_modules查找路径正确 - Java 编译需用
javac "$(FILE_NAME)"(带扩展名),运行要用java "$(NAME_PART)"(不带扩展名) - Node.js 和 Python 推荐加
-u参数:node -u "$(FULL_CURRENT_PATH)",避免输出缓冲导致看不到实时日志
示例片段:
NPP_SAVE cd $(CURRENT_DIRECTORY) set EXT = $(EXT_PART) if "$(EXT)" == ".py" GOTO PYTHON if "$(EXT)" == ".js" GOTO JS echo "不支持: $(EXT)" GOTO EXIT <p>:PYTHON "C:\Python39\python.exe" -u "$(FULL_CURRENT_PATH)" & pause GOTO EXIT</p><p>:JS node -u "$(FULL_CURRENT_PATH)" & pause GOTO EXIT</p><p>:EXIT</p>
中文输出乱码、input() 卡住怎么办
不是源码缺 # -*- coding: utf-8 -*-,是 Windows 控制台默认用 GBK 编码,和 Python 3.7+ 的 UTF-8 输出不兼容。
- 在脚本开头加
cmd /c chcp 65001 >nul &&:强制 CMD 切到 UTF-8 模式 - 仍卡
input()?换python -u,它禁用输出缓冲,也改善输入响应 - 别信“改注册表永久切 UTF-8”:Notepad++ 启动的子 CMD 不继承该设置,每次都要显式调用
chcp - 如果用了第三方库(如
colorama)触发 ANSI 控制符,加npp_console 1确保控制台启用 ANSI 支持
快捷键绑定后不生效的常见原因
绑定操作本身没毛病,但 NppExec 的快捷键机制有隐藏依赖。
- 必须在
Plugins → NppExec → Advanced Options → Associated scripts中把脚本“关联”到某个名称(比如AutoRun),再在Settings → Shortcut Mapper → Plugin commands里绑定快捷键 - 改完
shortcuts.xml或界面配置后,**必须重启 Notepad++**,热加载不生效 - F6 是默认打开脚本编辑框的快捷键,不是执行快捷键——执行用的是你单独绑定的 Ctrl+F5 这类组合键
- 如果快捷键点了没反应,先看底部状态栏:有没有红色字提示
Script not found或Invalid command
真正容易被忽略的是:NppExec 所有变量($(FULL_CURRENT_PATH)、$(NAME_PART))只在 NPP_SAVE 之后才更新;而 NPP_SAVE 本身不触发磁盘写入完成事件,所以极短延时内读取可能还是旧值——如果你在保存瞬间快速连按快捷键,偶尔会执行上一版代码。











