Как добавить историю в editline? - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь добавить приложение истории в оболочку MacPorts.MacPorts в настоящее время использует историю, похожую на bash, в которой история записывается после окончания сеанса.Это может быть проблематично, если сеанс завершится сбоем, поэтому я пытаюсь заставить оболочку MacPorts следовать примеру zsh.Т.е. добавьте каждый элемент истории в файл по мере его выполнения.

В GNU readline, эта функция тривиальна с функцией append_history. Однако MacPorts полагаетсявместо Apple editline .Кажется, что библиотека editline не имеет эквивалента для append_history, поэтому я немного растерялся, что делать, чтобы добавить историю в файл.Я думал об использовании старых добрых стандартных функций, таких как fopen и fprintf, но я понял, что editline использует свою собственную кодировку для строк истории (например, пробел переводится в восьмеричный \040).MacPorts должен быть совместим с этой кодировкой, поскольку editline используется в нескольких местах.Я предполагаю, что эта кодировка используется, потому что пробел используется как разделитель истории.

Я мог бы попытаться написать свои собственные функции для совместимости с этой кодировкой, но это кажется чреватым ненужными трудностями.Я чувствую, что, должно быть, чего-то не хватает.Есть ли простой способ добавить историю в файл с правкой?

1 Ответ

0 голосов
/ 01 августа 2018

Ну, в конце концов, решение заключалось в том, чтобы использовать эти старые добрые стандартные функции.Мы также добавили некоторую блокировку файлов в микс, просто ради паранойи:

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. Возможно, это не окончательная форма кода, но это то, что мы имеем до сих пор, и это, вероятно, то, с чем мы будем работать.Если мы изменим его, оно, вероятно, будет незначительным.

...