Estoy usando ncurses para crear una tui para moverme a través de directorios. Tengo el programa abriendo archivos editables en vi usando una llamada al sistema
def_prog_mode();
endwin();
sprintf(command, "%s %s", di->Settings.editor, di->Directory.File[di->Variables.item_selection].Path);
system(command);
reset_prog_mode();
pero cuando salgo de vi para volver al programa vi informa el error
E138: Can't write viminfo file /home/user/.di/.viminfo!
Press ENTER or type command to continue
.di es el archivo de configuración de mi programa y no tengo idea de por qué está tratando de incluirse en la ruta del archivo .viminfo.
¿Alguien tiene alguna idea de cómo solucionar esto? Todas mis variables tienen el prefijo di_, por lo que no tengo idea de por qué sucede esto. ¡Toda ayuda es muy apreciada!
- El error ocurre dentro de vi y no en mi programa.
- No hay desbordamiento en sprintf porque todo tiene un carácter de terminación nulo colocado en el final.
- La preferencia del editor viene como un valor predeterminado de vi, pero es manipulada por el usuario a través del archivo de configuración.
- /home/user/.di no es una carpeta, es un archivo y solo se llama en la adquisición de los contenidos de los archivos de configuración, y en la creación inicial y el llenado del archivo y todas las instancias de fopen se cierran inmediatamente después.
- El propósito de no usar ncurses para crear un editor es darle al usuario la opción de usar su propio editor (muchos disponibles en el servidor que se usa)
- No parece haber un fallo de syscall. Este estilo parece ser un error por parte de vi.
Solo para tener en cuenta: este es un problema meramente molesto. La falla en vi no causa una falla en mi programa.
Esto se implementó en mi programa en mi reciente reescritura de todo el programa. Permite al usuario cambiar la configuración en un archivo de configuración ".di" en el directorio de inicio. Desde esta implementación, al salir de vi (o vim), vi (o vim) declara el error y luego regresa con éxito al programa.
#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);
}
can't write viminfo file
Da muchas respuestas relevantes.
(absolute path to file)
no es un nombre de archivo. Si resulta que es su nombre de archivo, no puede funcionar (porque necesita escapar de esos espacios, y el paréntesis, para el sh
contener system(command)
....)
command
buffer antes de ejecutarsystem(command)