notepad++ 本身不能运行 haskell,需通过 nppexec 调用系统 runhaskell;关键前提是 runhaskell 在 path 中、工作目录设为 $(current_directory)、脚本用 cmd /c 执行并以 & exit 结尾,且源码须为 utf-8 无 bom。

Notepad++ 本身不能直接运行 Haskell 程序,也没有内置 GHCi 交互环境。所谓“运行”,本质是调用系统已安装的 ghc 或 runhaskell,再把输出捕获到编辑器内——这必须靠 NppExec 插件桥接,且配置稍有偏差就会卡在“命令未找到”或“parse error”。
怎么让 NppExec 正确调用 runhaskell?
关键不是写对命令,而是确保路径、工作目录和 Shell 环境三者一致:
-
runhaskell必须已在系统PATH中(cmd 输入runhaskell --version能返回版本号) -
NppExec默认在 Notepad++ 安装目录下执行命令,不是当前文件所在目录 —— 必须显式加cd $(CURRENT_DIRECTORY) - 若用 PowerShell 代替 cmd,某些 GHCi 输出会乱码或阻塞;建议统一用
cmd /c - 脚本里不要写
pause,否则窗口挂住;用& exit结尾更干净
推荐 NppExec 脚本(保存为 “Run Haskell”):
cd $(CURRENT_DIRECTORY) cmd /c runhaskell "$(FILE_NAME)" & exit
为什么 GHCi 模式在 Notepad++ 里不 work?
GHCi 是交互式解释器,需要持续读取 stdin 并响应 stdout,而 NppExec 是单次命令执行模型 —— 它发完命令就等退出,不会维持会话。所以:
- 用
ghci "$(FILE_NAME)"只能启动后立刻退出,看不到任何提示符Prelude> - 强行加
-v或--interactive也无效,NppExec 不提供伪终端(pty) - 真要交互调试,得另开一个 cmd/PowerShell 窗口手动运行
ghci,Notepad++ 只负责编辑和保存
折中方案:用 NppExec 启动一个独立的 ghci 窗口(非嵌入),例如:
cmd /c start ghci "$(FILE_NAME)"
但这样无法回传输出到 Notepad++ 界面,仅适合快速打开 REPL 查看类型或测试小表达式。
常见错误:runhaskell 报错 “not found” 或 “permission denied”
这不是 Notepad++ 的问题,而是 Windows 下路径或权限链断裂:
- 检查
runhaskell.exe是否真在PATH:打开 cmd,执行where runhaskell,应返回类似C:\Program Files\Haskell Platform\9.2.8\bin\runhaskell.exe - 若用 Stack 安装的 GHC,则要用
stack exec -- runhaskell替代裸命令,否则找不到本地 resolver 的包 - 文件路径含空格或中文时,
"$(FILE_NAME)"必须加英文双引号,否则 shell 解析失败 - 防病毒软件有时拦截
runhaskell启动,临时禁用试试;Windows Defender 的“受控文件夹访问”也可能阻止
别忽略 GHC 版本与文件编码的隐性冲突
Haskell 源码必须是 UTF-8 无 BOM,否则 runhaskell 在较新 GHC(≥9.0)下会直接报 Illegal character '\65279'(BOM 的 UTF-8 编码):
- Notepad++ → 编码 → 转为 UTF-8 无 BOM(不是“UTF-8”)
- 新建 .hs 文件后,立刻检查右下角状态栏是否显示
UTF-8-BOM—— 如果是,点它切换过去 - 如果用了 literate Haskell(.lhs),必须选语言为
Haskell (Literate),否则高亮错、编译也错
最易被跳过的点:GHCi 不读取当前文件的 top-level 绑定,除非你用 :load 手动加载;runhaskell 才真正执行整个文件。别指望 Ctrl+R 后看到 main = print "ok" 自动触发输出——它只在 main 存在且是 IO action 时才生效。











