Conservazione di file modificati in un editor di testo

1

Sto scrivendo un'implementazione di Ex (si spera che Vi alla fine) come un progetto personale. Ho bisogno di memorizzare in qualche modo un identificatore per il file associato a ciascun buffer. In termini di sicurezza / condizioni di gara e prestazioni (e convenzione, se ce n'è una), dovrei memorizzare il nome del file come indicato dall'utente, il descrittore di file restituito da open() o il puntatore del file restituito da fopen() / fdopen() ?

Questi sono i metodi che ho sviluppato, ma sono completamente aperto a tutti gli altri.

    
posta Cormac O'Brien 05.11.2014 - 04:30
fonte

1 risposta

1

Dopo un'ulteriore riflessione (e il tuo commento), mi rendo conto che esiste una solida base comportamentale per la scelta.

Se io:

  • apri un file esistente nel tuo editor
  • inizia a modificarlo
  • realizzare che voglio un backup e spostare (non copiare) l'originale
  • salva le mie modifiche

dovrebbe alterare il backup (l'inode originale con un nuovo nome)? O scrivi il file alterato sul nome originale, lasciando il backup da solo?

Penso che quest'ultimo, il che implica che non dovrebbe mantenere aperto il file originale in quanto non sarà in grado di utilizzare comunque quel descrittore di file / FILE* in modo sicuro. Potresti decidere di volere un comportamento diverso, però.

Bene, in che stato ex (o vi) è necessario tenere traccia di ogni file?

Fuori dalla mia testa, vim ha bisogno di:

  1. nome file
  2. descrittore di file o FILE*

    potrebbe essere -1 o NULL se non è aperto? (i file nella lista buffer sono aperti anche se non sono visualizzati? Non lo so, ma potrebbe essere ragionevole chiudere i file e conservare una voce per essi)

  3. swapfile - la fd sopra dovrebbe riferirsi a questo? dobbiamo anche tenere traccia del nome del file di scambio?

  4. stato di modifica
  5. leggi le ultime statistiche del file originale (in modo che tu possa sapere se è cambiato prima di sovrascrivere)

    o forse solo un flag "file sottostante modificato", se si desidera utilizzare le notifiche di modifica file

  6. che sia di sola lettura o di lettura-scrittura (potresti solo provare per scrivere e ottenere un errore, ma ... ick)

  7. convenzione di fine riga, codifica

Si noti che posso avere più buffer che guardano diverse posizioni nello stesso file, e possibilmente con impostazioni diverse (evidenziazione della sintassi, numeri di linea ecc.), quindi quelle non possono essere proprietà del file stesso.

Ora, a meno che non si possa dedurre da tutto ciò da un singolo descrittore di file, penso che sia necessario qualche struct che lo memorizzi (e possibilmente di più).

    
risposta data 05.11.2014 - 16:55
fonte

Leggi altre domande sui tag