如何在编辑行中追加历史记录?

How to append history in editline?

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

改为GNU readline, this functionality is trivial with the function append_history. However, MacPorts relies on Apple's editline。 editline 库似乎没有 append_history 的等价物,所以我有点不知道该怎么做才能将历史追加到文件中。我想过使用像 fopenfprintf 这样好的旧标准函数,但我意识到 editline 使用它自己的历史字符串编码(例如,space 字符被转换为八进制 0). MacPorts 需要与该编码兼容,因为在多个地方使用了 editline。我假设使用这种编码是因为 whitespace 被用作历史定界符。

我可以尝试编写自己的函数来与这种编码兼容,但这似乎充满了不必要的困难。我觉得我一定是错过了什么。有没有一种简单的方法可以使用 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);

我已经详细解释了这一点 here. The file-locking was suggested at the relevant PR. 这可能不是代码的最终形式,但这是我们目前所拥有的,并且可能是我们将要使用的。如果我们改变它,它可能会很轻微。