# RText

RText è un editor di testo per programmatori ed un software libero, pubblicato rispettando le specifiche di una versione modificata del protocollo BSD License, per Windows, macOS, Linux, OS/2, Unix e OpenVMS. Il programma è disponibile in inglese ed è stato tradotto anche in diversi idiomi, tra cui quello cinese della Cina continentale (usa i caratteri semplificati), spagnolo, spagnolo argentino, portoghese europeo, tedesco, francese, italiano, russo, taiwanese (fa uso dei caratteri tradizionali), olandese, giapponese, coreano, polacco, turco, ungherese ed indonesiano.

## Storia

Il programma è stato creato da Fifesoft ed è stato programmato per lo più dal suo fondatore, Robert Futrell. I contributi esterni sono aumentati da quando il codice sorgente viene condiviso tramite il software di controllo di versione distribuito Git su GitHub. Le funzionalità di registrazione ed esecuzione delle macro sono state aggiunte a partire dalla versione 0.8.9.2.

## Funzionalità

Le funzionalità più rilevanti di RText sono le seguenti:
* Evidenziazione sintattica per oltre 40 linguaggi, tra quelli di programmazione e di marcatura
* Ricerca e sostituzione testuale per mezzo dell'utilizzo delle espressioni regolari
* Ricerca del testo nel contenuto dei file e sostituzione testuale nel contenuto degli stessi
* Supporto di tutte le codifiche dei caratteri previsti dalla JVM
* Personalizzazione dell'interfaccia del documento (modalità di visualizzazione a schede, MDI o in elenco listato)
* Supporto all'utilizzo simultaneo di molteplici famiglie di caratteri
* Evidenziazione della parentesi corrispondente a quella selezionata
* Evidenziazione della riga correntemente selezionata
* Interfaccia grafica personalizzabile (icone, look and feel e schemi dei colori)
Il codice sorgente è attualmente ospitato dai Server di SourceForge, Maven e GitHub.

## Caratteristiche

RText è un software che segue la filosofia FOSS, supporta l'autocompletamento, la ricerca/sostituzione tramite espressioni regolari, il code folding, i segnalibri, l'evidenziazione delle parentesi e l'indentazione. Supporta anche l'aggiunta di macro e plugin. Di base sono già inclusi alcuni plugin ritenuti essenziali dal fondatore, scritti dallo stesso sviluppatore del progetto (permettono, per esempio, di esplorare il File System). RText ha un'interfaccia personalizzabile ed è possibile aprire più documenti all'interno della stessa istanza del programma tramite l'uso delle linguette. Presenta stili, font e colori a tema propri di editor di testo evoluti. Il tradizionale Blocco note incluso in bundle con il sistema operativo Windows, al contrario, non permette di scegliere il colore del font e dello sfondo. Sono presenti alcuni temi che recuperano la tradizionale modalità sfondo nero/caratteri bianchi o grigi.
Inoltre gli utenti possono definire l'evidenziazione della sintassi e l'autocompletamento per qualunque altro linguaggio, tramite un sistema di definizione basato su JFlex (The Fast Scanner Generator for Java) che rende RText estensibile, se si ha familiarità con il linguaggio di programmazione Java.
Altre caratteristiche sono:
* Code folding ed evidenziazione del codice (anche personalizzata)
* Auto-completamento
* Visualizzazione a schede (per aprire più documenti)
* Zoom in e zoom out
* Supporto Windows Cinese, Giapponese e Koreano
* Copia del testo selezionato negli appunti del sistema operativo, sotto forma di RTF
* Stampa ed anteprima di stampa
* Esportazione del contenuto dell'area testuale sotto forma di codice HTML, con conseguente conservazione dello stile sintattico impostato.
* Gestore appunti integrato nell'area testuale (attivabile premendo la combinazione di tasti Ctrl+Shift+V).
* Restituzione di frammenti di codice sorgente esemplificativi (snippet) nei linguaggi usati per programmare le macro.
* Collegamenti ipertestuali cliccabili (se il motore analitico del linguaggio lo consente).
Nella barra di stato della finestra principale è presente l'indicatore della quantità di memoria occupata dall'applicazione nell'area di memoria heap.

## Linguaggi supportati

Supporta diversi linguaggi di programmazione e di marcatura.
Al momento sono:
* Assembly
* C
* C++
* CSS
* C#
* Clojure
* D
* Dart
* Groovy
* HTML
* Java
* JavaScript
* JSP
* Visual Basic
* File .jshintrc
* JSON
* Lisp
* NSIS
* Perl
* PHP
* Python
* Ruby
* Scala
* SQL
* Script della shell UNIX
* Windows batch
* File XML
* ActionScript
* BBCode
* Delphi
* Dtd
* Fortran
* Htaccess
* LaTeX
* Less
* Lua
* Makefile
* MXML
* File di properties
* SAS
* Tcl

## Aspetti tecnici

Il progetto è basato su un componente, l'area testuale RSyntaxTextArea, anch'esso open source e scritto in Java, e non ricorre in alcun caso all'invocazione delle API Win32, quindi non impiega Microsoft Foundation Classes (MFC) o librerie simili, il che assicura la portabilità del programma in ambito multipiattaforma, in quanto nativo Java. È distribuito rispettando le specifiche di una versione modificata del protocollo BSD License.

### Dettagli di RSyntaxTextArea

Dato che RSyntaxTextArea supporta internamente la ricerca di testo con espressioni regolari su più righe, RText permette tale modalità di ricerca. RSyntaxTextArea è un'estensione della più diffusa JTextArea contenuta nel package Swing di Java. Tra le caratteristiche aggiunte compaiono:
* Modalità di inserimento / sovrascrittura (viene attivata premendo il tasto Insert).
* Un menù contestuale, a comparsa, con le opzioni di modifica standard.
* Supporto per le macro.
* Funzionalità "Marca tutto", applicabile durante la ricerca testuale.
* Un modo per modificare lo sfondo dell'area testuale con un'immagine (i formati supportati sono gif / png / jpg)
* Evidenziazione della riga correntemente selezionata (può essere disattivata).
* Un modo facile per stampare il suo contenuto testuale (viene estesa l'interfaccia Printable, contenuta nel package AWT di Java)
* Differenti modalità di aggiunta dei caratteri di tabulazione (soft e hard, rispettivamente emulati o meno dagli spazi)
* Viene corretto un baco tuttora presente nel metodo setTabSize di JTextArea.
Se lo sfondo di una RTextArea (classe estesa da RSyntaxTextArea) fosse impostato con un determinato colore, la sua proprietà opaque (opaco) verrebbe impostata a true (vero) per ragioni prestazionali. Viceversa, se lo sfondo fosse impostato con un'immagine, allora la proprietà opaque sarebbe valorizzata con false (falso). Tutto ciò peggiora le prestazioni ma, se così non fosse, l'utente vedrebbe comparire dei difetti grafici sullo schermo, nella zona occupata dall'area testuale, mentre scorre un documento usando i tasti direzionali (lo stesso problema non si verifica premendo i tasti Pagina Su/Giù). Fifesoft ha sconsigliato di modificare il valore della proprietà opaque, giacché viene fatto dalle logiche in essere, quando opportuno.
Fifesoft raccomanda di inglobare l'area testuale internamente ad un'istanza di RTextScrollPane, anziché nel più noto JScrollPane (componente contenuto nel package Swing di Java), qualora si decidesse di includere RSyntaxTextArea in un programma sviluppato autonomamente, dato che questa classe consente l'aggiunta dei numeri della linea e dei segnalibri all'area di testo.

### Dettagli sulle macro

Le macro vengono programmate alternativamente nel linguaggio di scripting orientato agli oggetti ed agli eventi JavaScript, sfruttando l'interprete JavaScript Rhino, oppure nel linguaggio di programmazione ad oggetti per la piattaforma Java Groovy.

#### Esempio di una macro che apre un file

L'esempio che segue mostra lo script JavaScript di una macro che apre un file. Il nome del file da aprire viene ricavato sulla base della selezione nel foglio di lavoro attivo dell'editor RText; se disponibile, il file viene aperto in un nuovo foglio di lavoro di RText:
Lo stesso esempio programmato in linguaggio Groovy:

#### Esempio di una macro che converte i caratteri speciali per il linguaggio HTML

L'esempio che segue mostra lo script JavaScript di una macro che sostituisce qualsiasi testo selezionato con una versione di quel testo formattato in HTML:

#### Esempio di una macro che ordina alfabeticamente gli elementi di una lista

L'esempio che segue mostra lo script JavaScript di una macro che ordina tutte le righe nel foglio di lavoro attivo di RText:
Lo stesso esempio programmato in linguaggio Groovy: