Scarica l’articolo nel formato PDF
Sommario
In questo post impareremo come personalizzare il menù contestuale in Nautilus, il gestore di file incorporato in Gnome, fino a compilare al volo sorgenti LaTeX e compiere moltissime altre operazioni che possono essere ripetitive.
Il menù contestuale
Nelle moderne interfacce grafiche il menù contestuale è un efficace idea che presenta all’utente le operazioni effettuabili su uno specifico oggetto. Se per esempio si tratta di un file compresso il click destro sull’icona che lo simboleggia, attiverà un menù contestuale che presenta le apposite voci per l’estrazione del contenuto.
In Linux, nel Desktop Environment Gnome è possibile associare a questi menù piccoli programmi per lanciarli comodamente dopo aver selezionato i file d’interesse.
Nautilus è il file manager di Gnome. Grazie al supporto per lo scripting, le operazioni per creare una nuova voce di menù contestuale sono davvero semplici, allo stesso modo di quelle da svolgere per creare un nuovo modello di documento come già illustrato in questo post. Basta creare il file con il codice, assegnargli i permessi di esecuzione e spostarlo nella directory nascosta $HOME/.gnome2/nautilus-scripts.
Menù contestuale su un file compresso in Gnome
Come è naturale sui sistemi Linux, possiamo scrivere script in molti linguaggi, da Bash a Python. Noi utilizzeremo anche Lua pertanto dovrete assicurarvi che sia installato sul vostro sistema.
I nostri comandi personalizzati
Ecco in concreto, alcune idee di personalizzazione del menù. Ciascun nuovo comando contestuale deriva da esigenze della pratica quotidiana.
Molte altre idee possono essere realizzate per rendere più semplice l’utilizzo del pc, per esempio unire più file di testo o spedire documenti ad un indirizzo di posta elettronica…
Mandare in stampa un documento
Se desidero lanciare la stampa di un file PDF lo apro con un visualizzatore ed eseguo il comando di stampa. Se i PDF da stampare sono molti invece, apro il terminale, posiziono la working directory e lancio la stampa di tutti i PDF presenti con il comando:
$ lpr *.pdf
Con qualche conoscenza in più di Bash (il linguaggio standard per l’amministrazione dei sistemi Linux ma anche di quelli Mac OS X ormai), si costruisce un piccolo e semplicissimo script:
#!/bin/bash
for arg do
lpr "$arg"
done
Salviamone il contenuto in un file di testo chiamato per esempio goToPrinter, assegniamogli i permessi di esecuzione (anche dal menù Proprietà) e spostiamolo nella directory nascosta $HOME/.gnome2/nautilus-scripts. Di seguito la sequenza dei comandi e l’immagine della sessione corrispondente al terminale:
$ chmod +x goToPrinter
$ mv goToPrinter ~/.gnome2/nautilus-scripts
Sessione al terminale per la creazione del Nautilus script
Elencare file
Modificando un poco lo script precedente possiamo ottenere facilmente un file di testo contenente la lista dei file selezionati sostituendo ad lpr il comando echo e reindirizzandone l’output verso un file. Utilizzeremo poi la libreria zenity per mostrare un dialogo che mostri all’utente il numero dei file conteggiati.
#!/bin/bash
for arg do
echo "$arg"
done >> listoffiles.txt
zenity --info --width=200 --height=100 \
--title="Conteggio file elencati" \
--text="Numero di file elencati: $# "
Compilare un sorgente LaTeX
Compilare un sorgente LaTeX non è un problema se ci si avvale di un editor come TeX Works, oppure direttamente del terminale, ma se lo possiamo fare con un semplice click destro sulla selezione di file è davvero elegante.
Il codice in Lua provvede a filtrare i file selezionati al momento dell’apertura del menù contestuale in base all’estensione solitamente assegnata ai sorgenti LaTeX.
#!/usr/bin/lua
-- ottengo la lista dei file selezionati
-- dalla variabile d'ambiente opportuna
--
local s = os.getenv("NAUTILUS_SCRIPT_SELECTED_FILE_PATHS")
-- per ogni file con estensione .tex
-- procedo alla compilazione
--
for path in string.gmatch(s,"(.-)\n") do
-- estrazione estensione
local ext = string.match(path,"%.(.-)$")
-- se l'estensione esiste allora compilo
-- se è un sorgente .tex
if ext then
if string.lower(ext) == "tex" then
local ps = "(.-)%." .. ext .. "$"
local name = string.match(path,ps)
os.execute('pdflatex -interaction=nonstopmode "'..name..'"')
os.remove(name..".log")
os.remove(name..".aux")
end
end
end
-- end of Lua script
Ottenere il pdf di file di testo
Con poche modifiche possiamo adattare il codice precedente per ottenere uno script che converte i file di testo in formato PDF utilizzando LaTeX:
#!/usr/bin/lua
local docsource = [[
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}
\usepackage[margin=20mm]{geometry}
\usepackage{inconsolata}
\begin{document}
\ttfamily
%s
\end{document}
]]
-- ottengo la lista dei file
local s = os.getenv("NAUTILUS_SCRIPT_SELECTED_FILE_PATHS")
for path in string.gmatch(s,"(.-)\n") do
-- estrazione estensione
local ext = string.match(path,"%.(.-)$")
-- se l'estensione esiste allora creo il pdf con LaTeX
if ext then
if string.lower(ext) == "txt" then
local ps = "(.-)%." .. ext .. "$"
local filename = string.match(path,ps)
-- lettura del file
local textfile = io.open(path,"r")
local content = string.gsub(textfile:read("*all"),"\n","\n\n")
local sourcetexfile = string.format(docsource,content)
textfile:close()
-- creazione sorgente
local sf = io.open(filename..".tex","w")
sf:write(sourcetexfile)
sf:close()
os.execute("pdflatex -interaction=nonstopmode "..filename)
os.remove(filename..".log")
os.remove(filename..".aux")
os.remove(filename..".tex")
end
end
end
-- end of Lua script
Conclusioni
Il menù contestuale è davvero comodo. In Linux possiamo utilizzare diversi linguaggi di scripting per creare nuove voci di comandi con cui semplificare il lavoro quotidiano analizzando attentamente le nostre necessità.
Un saluto.
Note tecniche
Sul sistema devono essere installati e correttamente configurati i pacchetti e gli eseguibili di un sistema TeX ed un interprete Lua.
Gli esempi potrebbero richiedere leggere modifiche per distribuzioni Linux diverse da Ubuntu 10.04.
Recent comments