您可以让 shell 创建附加到您的函数的文件描述符并让 vim 在那里写入,如下所示:(但您需要将脚本分成两部分:一个调用 vim,另一个处理其输入):
# First script
…
vim --cmd $'aug ScriptForbidReading\nau BufReadCmd /proc/self/fd/* :' --cmd 'aug END' >(second-script)
. 笔记:
second-script
实际上可能是第一个脚本中定义的函数(至少在 zsh 中)。这也需要 bash 或 zsh(仅在后者上测试)。
- 需要 *nix,可能不适用于某些被认为是 *nix 的操作系统。
BufReadCmd
需要,因为 vim 在尝试读取只写描述符时挂起。
- 建议您立即设置文件类型(如果需要),而不使用 ftdetect 插件:以防您的脚本不是唯一使用此方法的脚本。
- Zsh 将等待
second-script
完成,因此您可以在 vim 命令之后继续执行脚本,以防second-script
不需要来自那里的信息(很难从那里获得)。
- 第二个脚本将从子shell 启动。
vim
因此,在调用后运行的代码中不会看到任何变量修改。
- 第二个脚本将接收 vim 在标准输入上保存的任何内容。父标准输入不能直接访问,但使用
</dev/tty
可能会起作用。
这适用于 zsh/bash 脚本。没有什么能真正阻止您在 ruby 中使用相同的想法(它可能更方便并且不需要拆分为两个脚本),但我对 ruby 的了解不足以说明如何在 ruby 中创建文件描述符。