c - 如何在编辑行中附加历史记录?
问题描述
我正在尝试将历史追加添加到 MacPorts shell。MacPorts 当前使用类似 bash 的历史记录,其中历史记录是在会话结束后写入的。如果会话崩溃,这可能会出现问题,所以我试图让 MacPorts shell 遵循 zsh 的示例。即,在执行时将每个历史记录项附加到文件中。
在GNU readline 中,这个功能对于函数来说是微不足道的append_history
。但是, MacPorts依赖于 Apple 的编辑线。editline 库似乎没有等效项,append_history
所以我有点迷失了如何将历史记录附加到文件中。我曾想过使用像fopen
and这样的旧标准函数fprintf
,但我意识到 editline 对历史字符串使用自己的编码(例如,空格字符被转换为八进制\040
)。MacPorts 需要与该编码兼容,因为在多个地方使用了 editline。我假设使用了这种编码,因为空格被用作历史分隔符。
我可以尝试编写自己的函数来兼容这种编码,但这似乎充满了不必要的困难。我觉得我一定是错过了什么。有没有一种简单的方法可以将历史记录附加到带有编辑行的文件中?
解决方案
好吧,最终的解决方案是使用那些好的旧标准函数。我们还添加了一些文件锁定,只是为了偏执狂:
s = Tcl_GetString(objv[2]);
hist_file = fopen(s, "a");
flock(fileno(hist_file), LOCK_EX);
fprintf(hist_file, "%s\n", current_history()->line);
flock(fileno(hist_file), LOCK_UN);
fclose(hist_file);
我已经在这里详细解释了这一点。在相关 PR中建议了文件锁定。这可能不是代码的最终形式,但它是我们目前所拥有的,并且可能是我们将使用的。如果我们改变它,它可能会很轻微。
推荐阅读
- mongodb - insertMany 方法返回 Object 中的 insertIds,而不是 Mongoose 5 中的 Array
- c - 使用 Flex 和 Bison 输出到两个不同的文件
- kotlin - 如何修改调用扩展函数的对象本身?
- javascript - 使用 fetch 解构嵌套 json 对象的正确方法是什么?
- android - Python子进程启动Android虚拟设备但无法终止并获得错误的PID
- python - 附加列表的结束循环
- assembly - 在 MarsPlus 中运行程序时是否有任何命令代码可以清除 I/O 区域?
- security - 为什么使用字母数字会话 ID 而不是数字?
- python - 如何从 csv 文件中的文本数据中删除非英语单词(python)
- xamarin - 单击 Xamarin.Forms App 中的导航按钮时系统抛出异常