Genero 4GL调用Vim编辑.4gl文件的终端警告与进程崩溃解决方案咨询
Genero 环境下.4gl 文件写入的可行方案
问题根因
- 直接调用
vi挂起的本质是:DVM运行子进程时不会把真实终端的输入输出流绑定给子进程,Vim检测不到可交互的tty,触发警告后进入阻塞状态 - 注释掉的
w/:w写法直接崩溃的原因是:这两个是Vim交互模式下的内部命令,不是系统shell可识别的可执行程序,传给run后会触发无效调用导致DVM崩溃
可落地实现方式
1. 原生文件IO写入(适配代码生成场景)
从现有代码的MTGENDIR、p_prog变量逻辑判断,当前场景是生成.4gl代码文件,完全不需要调用外部编辑器,直接用Genero内置文件函数完成写入即可,无任何tty相关问题:
- 原有的
test -f文件存在性检查,可直接替换为Genero内置的fgl_file_exists()函数,减少不必要的shell子进程调用 - 调用
fgl_file_open()获取目标.4gl文件的可写句柄 - 逐块用
fgl_file_write()写入生成的代码内容 - 完成写入后调用
fgl_file_close()释放句柄
2. 需要交互式唤起Vim的适配写法
如果确实需要打开Vim做人工编辑,要解决子进程的tty绑定问题,修改run的调用命令即可:
- Linux/Unix 环境下独立打开终端窗口:
let p_command = "xterm -e vim " || p_prog clipped || ".4gl",执行run p_command - 复用当前终端会话:
let p_command = "script -c 'vim " || p_prog clipped || ".4gl' /dev/null",借助script命令给Vim分配伪终端,规避tty检测报错
禁止的错误写法
- 不要把Vim内部的
:w、w命令拼入shell命令传给run,这类指令不属于系统可执行程序,调用必然触发DVM崩溃 - 不要直接裸调
vi/vim命令,没有tty绑定的情况下程序必然挂起
内容的提问来源于stack exchange,提问作者Roweida February
相关产品推荐
相关产品推荐

