CLUMSY beta version

Good news! 🙂

CLUMSY si arricchisce delle classiche funzionalità taglia (cut), copia (copy) e incolla (paste).

CLUMSY è un semplice editor di testo multipiattaforma per la console (o emulatore di terminale). In ambienti Windows tipicamente si indica la console con il termine “Prompt dei comandi”, mentre in ambienti GNU-Linux con “Terminale”. CLUMSY permette inoltre di compilare direttamente un file sorgente .bas utilizzando il compilatore FreeBASIC, e mandare quindi in esecuzione il file eseguibile. CLUMSY è distribuito sotto i termini della Licenza GNU General Public License versione 3. Licenza che permette di ridistribuire e modificare il codice sorgente liberamente. CLUMSY è scritto in FreeBASIC.

Ci sono però delle limitazioni, neanche tanto piccole. 😉

  • Cut (F6) taglia una sola linea di codice e la elimina per intero (occhio!).
  • Copy (F7) idem con patate: ovvero copia un’intera e sola linea di codice.
  • Paste (F8) incolla la linea di codice precedentemente selezionata con la funzione F6 o F7.

Oltre questo, CLUMSY è un programma vecchio stile, dove l’uso del mouse è stato volutamente escluso (sigh!).

Clumsy è un termine della lingua inglese. Traducendolo in italiano si ottiene l’immagine di una persona maldestra o di un oggetto mal costruito. 🙂

Lo scopo di CLUMSY è però semplicemente quello di testare velocemente piccole porzioni di codice FreeBASIC, giusto per impratichirsi con questo linguaggio di programmazione senza dover perdere troppo tempo con un IDE (Integrated Development Environment) decisamente più serio e potente di cui si avrà bisogno una volta che si dovrà scrivere un programma di una certa complessità.

Buon coding! 🙂

FreeBASIC – getkey

Dopo aver visto come si configura la console e aver imparato in un altro articolo ad usare la funzione multikey, oggi vedremo come ottenere il codice ASCII di alcuni pulsanti (keys) della nostra tastiera (keyboard) utilizzando la funzione getkey.

Il codice ASCII viene restituito dalla funzione getkey come valore di tipo long (vedi Tabella dei limiti dei tipi standard).

Vediamo adesso per passi come si può lavorare con questa istruzione:

  • per prima cosa è bene dimensionare una variabile ti tipo long per memorizzare il codice ASCII del pulsante premuto;
  • la funzione getkey va quindi inserita all’interno di un ciclo (per esempio il ciclo do-loop) in modo tale che il programma rimanga costantemente in ascolto dell’input da tastiera dell’utente;
  • a questo punto, all’interno del ciclo do-loop, si inserisce la struttura di controllo select case in modo tale da distinguere i vari codici ASCII che verranno ricevuti.

Una volta ricevuto un codice ASCII la memoria tampone della tastiera (keyboard buffer) viene ripulita automaticamente. Se non viene premuto alcun pulsante la funzione getkey rimane in ascolto e il programma si ferma.

Alcuni pulsanti della tastiera, come quelli funzione (F1, F2, ecc.) o quelli di spostamento del cursore, sono rappresentati da due caratteri e quindi occorrerà, per esempio, identificarli con la struttura di controllo if-then-else e poi operare uno spostamento (shift) di 8 bits in modo tale da scartare il carattere che non ci serve. Per farlo useremo l’istruzione shr.

Un sito molto utile dove trovare descritti i vari codici è theasciicode.com.ar

Vediamo ora un esempio pratico:

dim as long key ''key entered

''main loop
do
key = getkey
if key > 255 then ''cursor keys
key = key shr 8 ''shifts the bits to the right
select case key
case 59 ''F1
''...
case 60 ''F2
''...
case 61 ''F3
''...
case 62 ''F4
''...
case 63 ''F5
''...
case 64 ''F6
''...
case 65 ''F7
''...
case 66 ''F8
''...
case 67 ''F9
''...
case 68 ''F10
''not used (problems with Ubuntu terminal)
case 71 ''home
''...
case 72 ''up
''...
case 73 ''page up
''...
case 79 ''end
''...
case 80 ''down
''...
case 81 ''page down
''...
case 77 ''right
''...
case 75 ''left
''...
case 83 ''delete
''...
case else ''none
end select
else ''ASCII extended
select case key
case 32 to 126 ''printable characters
''...
case 128 to 255 ''extended ASCII characters
''...
case 8 ''backspace
''...
case 13 ''carriage return
''...
case 27 ''quit (Esc)
exit do
case else
''none
end select
end if

''to avoid unwanted or repeated characters,
''this loop works until the inkey buffer is empty
while inkey <> "": wend

loop

Bene. Un altro piccolo passo è stato fatto. 😉

FreeBASIC – configurare la console

Esiste ancora tutto un mondo di applicazioni per console (console application), alcune delle quali si permettono anche il lusso di fare a meno del mouse.

Per esempio ne (the nice editor) è un noto editor di testo per console sviluppato da Sebastiano Vigna dell’Università degli Studi di Milano.

Potrà sembrare una cosa da inguaribili nostalgici – e forse lo è – ma in questo blog trovano posto anche questo tipo di applicazioni.

Seguendo il metodo imparare facendo (learning by doing), approfondiremo passo passo le procedure per la console messe a disposizione dal compilatore FreeBASIC cercando di realizzare un semplice editor di testo per console che avrà quindi una interfaccia utente basata sul solo testo (text-based user interface). Un editor di testo che magari possa anche interagire con il compilatore FreeBASIC in modo tale che possa essere utilizzato anche come semplice IDE (Integrated Development Environment).

Il nostro piccolo progetto si chiamerà CLUMSY che in inglese suona più o meno come oggetto mal costruito. 😉

Per scaricare il file sorgente di CLUMSY fai clic qui.

Configurare la console

Come prima cosa dobbiamo informare il compilatore FreeBASIC che abbiamo intenzione di aprire una finestra grafica in modalità console. Per farlo dobbiamo impostare il valore della modalità grafica (parametro mode della istruzione screen) al valore 0 (zero).

Imposteremo poi il colore del primo piano e dello sfondo con l’istruzione color sfruttando la tavolozza dei colori di default.

Faremo uso dell’istruzione cls per pulire lo schermo e rendere attiva l’impostazione dei colori precedentemente scelta.

L’istruzione cls può essere fatta seguire da un parametro che può assumere i seguenti tre valori:

  • 0 -> pulisce l’intero schermo;
  • 1 -> pulisce l’area grafica se definita con l’istruzione view (se lo schermo è stato settato in modalità console questa istruzione non ha alcun effetto);
  • 2 -> pulisce l’area di stampa se definita con l’istruzione view print.

Se si utilizza l’istruzione cls senza alcun parametro, nel caso sia stata definita un’area grafica o di stampa, questa verra pulita, altrimenti viene pulito l’intero schermo.

Utilizzeremo poi l’istruzione width in combinazione con le istruzioni hiword e loword, per conoscere rispettivamente il numero massimo di righe e di colonne messe a disposizione di default dalla nostra finestra terminale (o prompt dei comandi in ambiente Windows).

Per posizionare il testo sfrutteremo l’istruzione locate.

Infine, per definire l’area di testo su cui andremo a scrivere utilizzaremo l’istruzione view print specificando la riga iniziale e quella finale.

''project: clumsy | pre-alpha version
''description: text editor for console
''author: ciuco informatico
''last update: 3th February 2020

dim as uinteger max_rows, max_cols

screen 0 ''console-mode functionality

max_rows = hiword(width) ''max number of rows
max_cols = loword(width) ''max number of columns

color 7, 0 ''text grey, background black
cls 0 ''clears the entire screen

''footer info
locate max_rows, 1
print "clumsy is a silly text editor for console"; _
      " | pre-alpha version" _
      " | ^H for Help";

''sets the printable area of the console screen
view print 1 to (max_rows - 1)

color 0, 7 ''text black, background grey
cls 2 ''clear only the text viewport

''text
print "Hello, world!";

sleep

Nel prossimo articolo vedremo come ottenere informazioni talla tastiera sfruttando la funzione getkey.