首页 > 解决方案 > 如何在编辑行中附加历史记录?

问题描述

我正在尝试将历史追加添加到 MacPorts shell。MacPorts 当前使用类似 bash 的历史记录,其中历史记录是在会话结束后写入的。如果会话崩溃,这可能会出现问题,所以我试图让 MacPorts shell 遵循 zsh 的示例。即,在执行时将每个历史记录项附加到文件中。

GNU readline 中,这个功能对于函数来说是微不足道的append_history但是, MacPorts依赖于 Apple 的编辑线。editline 库似乎没有等效项,append_history所以我有点迷失了如何将历史记录附加到文件中。我曾想过使用像fopenand这样的旧标准函数fprintf,但我意识到 editline 对历史字符串使用自己的编码(例如,空格字符被转换为八进制\040)。MacPorts 需要与该编码兼容,因为在多个地方使用了 editline。我假设使用了这种编码,因为空格被用作历史分隔符。

我可以尝试编写自己的函数来兼容这种编码,但这似乎充满了不必要的困难。我觉得我一定是错过了什么。有没有一种简单的方法可以将历史记录附加到带有编辑行的文件中?

标签: creadlinemacportslibreadlineeditline

解决方案


好吧,最终的解决方案是使用那些好的旧标准函数。我们还添加了一些文件锁定,只是为了偏执狂:

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中建议了文件锁定。这可能不是代码的最终形式,但它是我们目前所拥有的,并且可能是我们将使用的。如果我们改变它,它可能会很轻微。


推荐阅读