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