如何清除Vim中system()输出的临时文件?解决读取失败问题
解决Vim system()调用curl时的E282临时文件读取错误
问题根源
你的curl命令构造存在语法错误:
-d参数后的&enabledOnly=false未被正确转义,shell会将其解析为后台执行命令的分隔符,导致curl的输出写入临时文件的过程被中断,临时文件可能未正常创建或权限异常,触发E282错误。- 最后拼接URL时未添加空格,导致URL与前面的data参数粘连,命令本身语法失效。
修复步骤
1. 修正Vim代码中的curl命令构造
将POST数据整体用shellescape包裹,同时确保URL前有空格分隔:
let content_type = 'Content-Type: application/x-www-form-urlencoded' let accept = 'Accept: application/json' let url = g:languagetool_server_root . '/v2/check' let post_data = 'language=' . shellescape(g:languagetool_default) . '&enabledOnly=false&data=' . shellescape(json) let response = system('curl -X POST --header ' . shellescape(content_type) . ' --header ' . shellescape(accept) . ' -d ' . shellescape(post_data) . ' ' . shellescape(url))
2. 手动清理异常临时文件(临时应急)
直接删除报错的临时文件或整个Vim临时目录:
rm -f /var/folders/yh/z3ydby_56qz7mltrddsv3lqw0000gn/T/vzsapcl/2 # 或清理整个临时文件夹 rm -rf /var/folders/yh/z3ydby_56qz7mltrddsv3lqw0000gn/T/vzsapcl/
3. 预验证命令语法
在执行system()前,先打印构造好的命令到Vim命令行,复制到终端执行确认有效性:
let cmd = 'curl -X POST --header ' . shellescape(content_type) . ' --header ' . shellescape(accept) . ' -d ' . shellescape(post_data) . ' ' . shellescape(url) echo cmd
确认终端中curl能正常返回结果后,再放回Vim代码执行。
4. 替代方案:使用job_start规避临时文件
如果system()的临时文件问题反复出现,改用job_start直接捕获输出,无需依赖临时文件:
let content_type = 'Content-Type: application/x-www-form-urlencoded' let accept = 'Accept: application/json' let url = g:languagetool_server_root . '/v2/check' let post_data = 'language=' . shellescape(g:languagetool_default) . '&enabledOnly=false&data=' . shellescape(json) let cmd = ['curl', '-X', 'POST', '--header', content_type, '--header', accept, '-d', post_data, url] let g:response = '' call job_start(cmd, { \ 'out_cb': {_, data -> extend(g:, {'response': g:response . join(data, "\n")})}, \ 'err_cb': {_, data -> echoerr 'curl错误: ' . join(data, "\n")}, \ 'exit_cb': {_, code -> echo '退出码: ' . code} \ }) " 等待任务完成(同步执行场景) while job_status(cmd[0]) != 'dead' call feedkeys(' ', 'n') endwhile echo g:response
内容的提问来源于stack exchange,提问作者Samuel Bacay
相关产品推荐
相关产品推荐

