【问题标题】:How to append history in editline?如何在编辑行中附加历史记录?
【发布时间】:2018-11-07 13:28:26
【问题描述】:

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

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

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

【问题讨论】:

  • 看看history()函数,它有一个参数ev这个参数决定了函数将执行的操作,ev的一些值你可能会觉得有用的是H_APPEND附加char * 到历史列表,H_SAVE 将历史列表保存到指定文件。供参考,这是历史声明int history(History *h, HistEvent *ev, int op, ...);所有这些都是根据man 3 editline
  • @xmonk 感谢您的反馈。我已经看过H_APPEND 等等,但它似乎用于附加到内存中的历史列表。不适用于附加到磁盘上的历史列表。此外,H_SAVE 似乎不支持追加。我认为它会覆盖整个历史文件,所以它似乎不适合我想要的。

标签: c readline macports libreadline editline


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 2020-07-31
    • 2016-10-31
    相关资源
    最近更新 更多