Dart CLI应用如何启动nano编辑器并将编辑内容保存到文件
实现方法
你之前直接捕获nano标准输出的思路不对,nano是全屏终端交互程序,编辑内容不会输出到stdout,不需要找第三方pub包,用Dart内置的dart:io库就能实现,逻辑是用临时文件作为nano的编辑载体,等用户退出nano后读取临时文件内容再写入目标文件,具体实现步骤:
- 生成一个临时文件,需要预置初始编辑内容的话可以提前写入
- 启动nano进程时继承当前CLI的标准输入、输出、错误流,保证用户可以正常和nano界面交互
- 等待nano进程正常退出后,读取临时文件的全部内容,就是用户编辑完成的最终文本
- 将读取到的内容写入你指定的目标路径,最后清理临时文件
完整示例代码
import 'dart:io'; void main(List<String> arguments) async { // 这里替换成你自己的argResults解析逻辑获取目标文件名即可 final targetFilePath = arguments.first; // 示例直接取第一个入参作为目标保存路径 // 1. 创建临时文件给nano编辑 final tempFile = await File('${Directory.systemTemp.path}/dart_nano_edit_${DateTime.now().millisecondsSinceEpoch}.txt').create(); // 如果需要加载目标文件原有内容作为编辑初始值,打开下面注释即可 // await tempFile.writeAsString(await File(targetFilePath).exists() ? await File(targetFilePath).readAsString() : ''); try { // 2. 启动nano,继承当前终端的IO流,让用户能正常操作编辑器界面 final nanoProcess = await Process.start( 'nano', [tempFile.path], mode: ProcessStartMode.inheritStdio, // 核心参数:直接继承当前终端的输入输出 ); // 3. 等待nano操作完成退出 final exitCode = await nanoProcess.exitCode; if (exitCode != 0) { stderr.writeln('nano异常退出,退出码:$exitCode'); exit(exitCode); } // 4. 读取临时文件里用户编辑完的内容,对应你预期里的output变量 final editedContent = await tempFile.readAsString(); // 5. 写入目标文件 await File(targetFilePath).writeAsString(editedContent); print('文件已成功保存到:$targetFilePath'); } finally { // 操作完成后清理临时文件 if (await tempFile.exists()) { await tempFile.delete(); } } }
注意事项
- 这个实现依赖系统环境安装了
nano并且配置在PATH环境变量中,Windows系统默认不带nano,需要手动安装配置后才能正常调用 ProcessStartMode.inheritStdio是编辑器交互正常生效的核心参数,如果不用这个模式,用户看不到nano界面也无法输入按键操作- 如果需要支持其他终端编辑器(比如vim、micro),只需要把启动的进程名从
nano换成对应编辑器的执行命令即可
内容的提问来源于stack exchange,提问作者Kyrill
相关产品推荐
相关产品推荐

