Я использую ncurses для создания tui для перемещения по каталогам. У меня есть программа, открывающая редактируемые файлы в vi с помощью системного вызова
def_prog_mode();
endwin();
sprintf(command, "%s %s", di->Settings.editor, di->Directory.File[di->Variables.item_selection].Path);
system(command);
reset_prog_mode();
но когда я выхожу из vi, чтобы вернуться в программу, vi сообщает об ошибке
E138: Can't write viminfo file /home/user/.di/.viminfo!
Press ENTER or type command to continue
.di - это файл конфигурации для моей программы, и я понятия не имею, почему он пытается включить себя в путь к файлу .viminfo.
У кого-нибудь есть идеи как это исправить? Все мои переменные имеют префикс di_, поэтому я понятия не имею, почему это происходит. Вся помощь очень ценится!
- Ошибка возникает в vi, а не в моей программе.
- В sprintf нет переполнения, потому что у каждого есть нулевой завершающий символ, помещенный в конце.
- Предпочтения редактора устанавливаются по умолчанию для vi, но пользователь управляет ими через файл конфигурации.
- /home/user/.di - это не папка, это файл, который вызывается только при получении содержимого файлов настроек, а также при первоначальном создании и заполнении файла, и все экземпляры fopen сразу закрываются.
- Цель не использовать ncurses для создания редактора - дать пользователю возможность использовать свой собственный редактор (многие доступны на используемом сервере)
- Похоже, что нет сбоя системного вызова. Этот стиль кажется ошибкой со стороны vi.
Просто чтобы заметить: это просто проблема раздражения. Ошибка в vi не вызывает ошибку в моей программе.
Это было реализовано в моей программе в моей недавней переписке всей программы. Это позволяет пользователю изменять настройки в конфигурационном файле ".di" в домашнем каталоге. Начиная с этой реализации, при выходе из vi (или vim) vi (или vim) выдает ошибку и затем успешно возвращается в программу.
#include "di.h"
void settings(DI *di, int mode) {
check_settings_exist(di);
switch (mode) {
case 0 :
read_settings(di);
break;
case 1 :
write_settings(di);
break;
}
}
void check_settings_exist(DI *di) {
if (!di->Settings.file_location) {
char *di_settings_file_path = (char *) getenv("HOME");
strcat(di_settings_file_path, "/");
strcat(di_settings_file_path, di_default_settings_file);
strcat(di_settings_file_path, "\0");
di->Settings.file_location = (char *) calloc(sizeof(di_settings_file_path) + 12, sizeof(char));
strcpy(di->Settings.file_location, di_settings_file_path);
}
if(access(di->Settings.file_location, F_OK)) {
int counter;
FILE * di_settings_file = fopen(di->Settings.file_location, "w+");
for (counter = 0; di_settings_file_default[counter][0]; counter++) {
fprintf(di_settings_file, "%s%s\n", di_settings_file_default[counter][0], di_settings_file_default[counter][1]);
}
fclose(di_settings_file);
}
}
void read_settings(DI *di) {
FILE * di_settings_file = fopen(di->Settings.file_location, "r");
di->Settings.editor = calloc(16, sizeof(char));
di->Settings.deletion_mode = calloc(16, sizeof(char));
fscanf(di_settings_file, "%*[^:]:%[^\n]\n", di->Settings.editor);
fscanf(di_settings_file, "%*[^:]:%[^\n]\n", di->Settings.deletion_mode);
fclose(di_settings_file);
}
void write_settings(DI *di) {
FILE * di_settings_file = fopen(di->Settings.file_location, "w+");
//
fclose(di_settings_file);
}