Как добавить историю в editline?

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

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

Я объяснил это подробно здесь. Блокировка файла была предложена в соответствующем PR. Это может быть не окончательная форма кода, но это то, что мы имеем до сих пор, и это, вероятно, то, что мы будем катиться. Если мы изменим это, это, вероятно, будет незначительным.

Другие вопросы по тегам