Italiano - vroby65/zepto GitHub Wiki

Zepto - Editor di testo minimale in C

Zepto è un editor di testo da terminale, scritto interamente in C, progettato per essere estremamente leggero, auto-contenuto e senza dipendenze esterne.
Non utilizza librerie come ncurses, ma si affida direttamente alle sequenze di escape ANSI e al raw mode del terminale per ottenere una gestione precisa e minimale dell’interfaccia.


🎯 Obiettivo del Progetto

Lo scopo principale di Zepto è fornire un editor di testo:

  • Compatto: dimensioni inferiori a 20 KB
  • Portabile: funziona ovunque esista una shell POSIX compatibile
  • Funzionale: include undo/redo, copia/incolla, evidenziazione della sintassi, barra di stato, numeri di linea, selezione del testo
  • Accessibile: scritto in puro C, facilmente leggibile e modificabile

🔧 Funzionalità principali

Modalità terminale raw

Zepto imposta il terminale in modalità raw, disabilitando la canonica interpretazione dei caratteri (ICANON) e l'eco (ECHO).
Questo permette di leggere i tasti uno per uno, inclusi i caratteri di controllo (Ctrl+X, Esc, ecc.), senza aspettare un \n.

tcgetattr(0, &orig);
cfmakeraw(&raw);
tcsetattr(0, TCSANOW, &raw);

Gestione del cursore e colori con escape ANSI

Tutto il disegno dello schermo avviene manualmente con codici di escape ANSI:

Funzione Codice ANSI
Spostamento cursore \033[H, \033[<r>;<c>H
Cancellazione linea \033[K
Inversione colore (selez.) \033[7m, \033[0m
Colori testo \033[31m, \033[34m
Nascondi/mostra cursore \033[?25l, \033[?25h

Evidenziazione della sintassi

La sintassi è definita tramite file di configurazione nella cartella:

~/.config/zt/languages/

Ogni file ha estensione .config e contiene righe del tipo:

if 31
while 34
return 32

Quando Zepto rileva l'estensione del file (es. .c, .py...), carica il file relativo (c.config, python.config, ecc.) e applica il colore corrispondente alle parole chiave trovate nel testo.

L'evidenziazione è al volo, integrata nel rendering del buffer, senza modificare il contenuto originale.

Sistema di Undo/Redo

Le modifiche sono registrate in uno stack di strutture change, che memorizzano:

  • Posizione
  • Contenuto precedente e successivo
  • Lunghezza prima/dopo la modifica

La funzione record_change() è chiamata ogni volta che il buffer viene modificato.
Con Ctrl+Z si effettua l’undo, con Ctrl+Y il redo.

Selezione e Copia/Incolla

Zepto supporta la selezione di testo tramite Shift + Frecce.

Comandi:

  • Ctrl+C → copia
  • Ctrl+X → taglia
  • Ctrl+V → incolla

La selezione è visualizzata in modalità inversa (\033[7m).

Altre funzionalità

  • Ricerca nel testo: con F7, viene richiesto l’input nella barra di stato
  • Salvataggio: F2 salva, F10 salva ed esce
  • Navigazione avanzata: Home, End, PageUp, PageDown, Ctrl+Frecce
  • Numeri di riga: margine sinistro colorato con il numero della riga corrente

🛠️ Compilazione

Per compilare Zepto, è sufficiente lanciare:

./build

Il file build è uno script minimale che compila zepto.c in un binario:

gcc -Os -o zepto zepto.c

📥 Installazione

Per installare il binario e i file di sintassi nel sistema locale, eseguire:

./install

Copia:

  • zepto in /usr/local/bin
  • language/ in ~/.config/zepto/language/

📂 Struttura dei file

  • zt.c – sorgente principale
  • build – script di compilazione
  • install – script di installazione/configurazione
  • languages/ – file .config per evidenziazione sintassi

⌨️ Mappatura tasti

Tasto Azione
Esc Esce senza salvare
F2 Salva
F10 Salva ed esce
F7 Ricerca
Ctrl+Z / Ctrl+Y Undo / Redo
Ctrl+C / Ctrl+X / Ctrl+V Copia / Taglia / Incolla
Shift + ←→ Selezione testo
PgUp / PgDn Scroll verticale

📜 Licenza

Zepto è rilasciato sotto licenza MIT.
Puoi usarlo, modificarlo e distribuirlo liberamente.


🧠 Conclusioni

Zepto non è un clone di nano, vi o micro. È un editor dichiaratamente minimale e progettato per:

  • Ambienti di recupero
  • Shell embedded
  • Sviluppatori nostalgici dei sistemi testuali
  • Chi cerca un editor C davvero didattico

Se vuoi contribuire, segnalare bug o proporre miglioramenti, sentiti libero di aprire una issue o una pull request.

Buona scrittura!

⚠️ **GitHub.com Fallback** ⚠️