Continuo –e forse oggi finisco– la storia dei caratteri Unicode, isole emoji compresi. Ne ho scritto qui e qui.
Ogni tanto mi capita di dover fare qualche elaborazione veloce e –secondo me– un tool unico è newLISP, anche qualcuno poi mi guarda male. Sperando che non mi legga ecco cosa mi è serendipicamente venuto in mente:
Visto? la procedura (ma il manuale le chiama funzioni) char
funziona nei due sensi: se gli passi un codice restituisce il carattere, se gli passi un carattere restituisce il codice: due piccioni con una fava 💥
La prima versione, da lanciare come script (sapete, ha i suoi quirks, come si vedrà a breve), ecco il file u0.nl
, scrive info provvisorie:
;; u0.nl
(println (main-args))
(set 'dato (main-args 2))
(println 1 " " dato)
(set 'isnum (not (= (int dato) nil)))
(println 2 " " isnum)
(println 3 " " (char (int dato)))
(println 4 " " (char (main-args 2)))
(exit)
OK, la variabile isnum
discrimina i casi codice / carattere; posso quindi passare a u1.nl
, prototipo funzionante:
;; u.nl
(set 'dato (main-args 2))
(println 1 " " dato)
(set 'isnum (not (= (int dato) nil)))
(println 2 " " isnum)
(if isnum
(println 3 " " (char (int dato)))
(println 4 " " (char (main-args 2))))
(exit)
OK, da pulire, eliminare le variabili inutili e, se deve restituire il codice visualizzarlo anche in esadecimale (u2.nl
):
;; u2.nl
(if (not (= (int (main-args 2)) nil))
(println (char (int (main-args 2))))
(println (char (main-args 2)) (format " 0x%x" (char (main-args 2)))))
(exit)
OK, ma adesso il motivo vero per cui questa versione. L’output viene visualizzato nel terminale ma collegandola (via pipe) a xclip
posso caricarla nella clipboard, così:
Con newLISP posso eseguire un comando esterno via exec
:
E, come previsto ho il dato nella clipboard. Applicato al compito corrente diventa (u3.nl
):
;; u3.nl
(if (not (= (int (main-args 2)) nil))
(set 'ans (char (int (main-args 2))))
(set 'ans (string (char (main-args 2))
(format " 0x%x" (char (main-args 2))))))
(println ans)
(exec (string "echo " ans " | xclip -f -selection clipboard"))
(exit)
OK, funziona come previsto. L’ultimo passo è quello di rendere eseguibile lo script cosa che si potrebbe fare aggiungendo la shebang e abilitandolo con chmod
. Ma esiste un alternativa assai più sexy, compilarlo. c’è però un quirk come annunciat all’inizio del post.
Consideriamo lo script di test t.nl
:
#!/usr/bin/newlisp
(set 'largs (main-args))
(set 'len (length largs))
(println len)
(println largs)
(for (n 0 (- len 1))
(println n " " (largs n)))
(exit)
Compilo lo script:
e lo eseguo
OOPS! 😯 il primo argomento adesso è il numero 1 😯
Per cui lo script per la gestione dell’Unicode va modificato (nelle righe indicate con *
come commento) sostitunedo il parametro 2 con 1 per main-args
; inoltre gestisco la mancanza del parametro, file uc.nl
:
;; uc.nl viene compilato con il nome _u
(when (= (length (main-args)) 1) ;; *
(println "manca il codice o il carattere")
(exit 2))
(if (not (= (int (main-args 1)) nil)) ;; *
(set 'ans (char (int (main-args 1)))) ;; *
(set 'ans (string (char (main-args 1)) ;; *
(format " 0x%x" (char (main-args 1)))))) ;; *
(println ans)
(exec (string "echo " ans " | xclip -f -selection clipboard"))
(exit)
Ed ecco
Anche se non posso farlo vedere il contnuto della clipboard è quello previsto. Comando _u
adottato –per me. Da trasferire in ~/bin
.
E –sempre secondo me– newLISP rockz! 👽