Come creare e utilizzare script dmenu personalizzati
Dmenu è un menu dinamico per X spesso utilizzato su configurazioni minime di gestori di finestre. Fa parte della suite di strumenti suckless di utilità gratuite e open source create dal progetto suckless.org, che includono, tra gli altri, il gestore di finestre dwm e l'emulatore di terminale.
In questo tutorial vediamo come installare dmenu sulle distribuzioni Linux più utilizzate, e come creare script dmenu personalizzati.
In questo tutorial imparerai:
- Come installare dmenu sulle distribuzioni Linux più utilizzate
- Come creare script dmenu personalizzati
Installazione
Dato che tutte le principali distribuzioni Linux includono dmenu nei propri repository ufficiali, installarlo è davvero semplice. Nella tabella seguente puoi vedere il comando esatto che possiamo usare sui sistemi Fedora, Debian e Archlinux:
- Fedora
-
$sudo dnf installa dmenu
- Debian
$sudo apt installa suckless-tools
- Archlinux
$sudo pacman -S dmenu
Si noti che su Debian l'utilità è fornita dal pacchetto “suckless-tools”, che include altre utilità come “lsw” e “slock”.
Utilizzo di dmenu per avviare le applicazioni
Dmenu viene generalmente utilizzato per avviare le applicazioni. Per richiamare il menu dalla riga di comando, possiamo utilizzare lo script dmenu_run
. Più realisticamente, però, vogliamo associare lo script ad una scorciatoia da tastiera. Come farlo dipende dall'ambiente desktop o dal gestore delle finestre su cui stiamo lavorando.
Quando invochiamo dmenu_run
, tutti i binari nel nostro PATH vengono visualizzati in dmenu, quindi possiamo selezionare quello che vogliamo avviare:
L'elenco viene filtrato mentre digitiamo:
Dmenu, per impostazione predefinita, visualizza le voci in orizzontale. Possiamo, tuttavia, produrre un elenco verticale utilizzando l'opzione -l
, passando come argomento il numero massimo di righe che dovrebbero essere visualizzate alla volta. Le opzioni e gli argomenti che passiamo allo script dmenu_run
vengono inoltrati a dmenu stesso, quindi, supponendo di voler produrre un elenco di massimo 10 righe alla volta, scriveremo:
$ dmenu_run -l 10
Ecco il risultato dell'esecuzione del comando:
Esistono molti modi in cui possiamo personalizzare l'aspetto di dmenu. Possiamo, ad esempio, creare un prompt personalizzato utilizzando l'opzione -p
, passando come argomento il testo che vogliamo venga visualizzato. Ecco un esempio:
$ dmenu_run -l 10 -p "Choose application:"
Il comando sopra produce il seguente dmenu:
Come funziona dmenu
Per scrivere i nostri script dmenu personalizzati, dobbiamo prima capire come funziona dmenu dietro le quinte. Dmenu legge e visualizza un elenco di elementi separati da una nuova riga dallo standard input. Quando l'utente seleziona un elemento dall'elenco, premendo il tasto Invio, la scelta viene stampata sullo standard output dell'applicazione.
Per vedere un esempio pratico di come utilizzare dmenu, possiamo dare un'occhiata al contenuto dello script dmenu_run
:
#!/bin/sh
dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} &
Possiamo vedere come dmenu_run fondamentalmente invoca un altro script, dmenu_path
, che restituisce come output un elenco degli eseguibili nel nostro PATH. Una shell pipe viene utilizzata per passare l'output come input a dmenu, che viene invocato con gli stessi argomenti di dmenu_run
(la variabile shell $@
si espande nei parametri posizionali passati a un copione).
L'elenco delle applicazioni viene visualizzato in dmenu. Come abbiamo detto, quando selezioniamo una voce, la nostra scelta viene stampata sullo standard output. In questo caso questo output viene inviato a una shell e viene eseguito in background, a causa dell'utilizzo del simbolo &
.
Ora che abbiamo capito quanto sia semplice e potente dmenu e come funzioni, possiamo creare i nostri script personalizzati. Qui mostriamo alcuni esempi.
Un esempio di script personalizzato: selezione e riproduzione di file .flac con il lettore multimediale mpv
Supponiamo di voler mostrare l'elenco dei file .flac nella nostra directory ~/Music
in dmenu e di voler riprodurre quello che selezioniamo sul lettore multimediale mpv. Ecco cosa potremmo scrivere:
#!/bin/bash
choice="$(find ~/Music -type f -name "*.flac" | sort -n | dmenu -i -l 10 -p "Play:")"
[ -n "${choice}" ] && mpv --no-video "${choice}" &> /dev/null &
Nello script definiamo la variabile choice
, alla quale viene assegnato il valore risultante dall'invio di tre comandi. Il primo è find
, che utilizziamo per recuperare tutti i file con estensione “.flac” nella directory ~/Music
. L'elenco risultante viene passato all'utilità sort
che, in questo caso, ordina numericamente gli elementi. Infine, passiamo l'output di sort
a dmenu
, che invochiamo con -i
, -l
e Opzioni -p
. Il primo rende la ricerca del menu senza distinzione tra maiuscole e minuscole; la seconda, come abbiamo visto, crea una lista verticale; con la terza, invece, specifichiamo il testo del prompt.
L'elemento che scegliamo nel menu viene “memorizzato” nella variabile choice
. Testiamo se quest'ultima è vuota (potrebbe esserlo se non selezioniamo nulla): se la variabile non è vuota, usiamo il suo valore come argomento per il lettore MPV. Memorizziamo lo script da qualche parte nel nostro PATH. Ecco il risultato dell'esecuzione:
Un altro esempio: utilizzare dmenu per eseguire query web
Ecco un altro banale script che ci consente di eseguire query web utilizzando Google e Firefox:
#!/bin/bash
query="$( echo "" | dmenu -p "Search: " <&- )"
[ -n "${query}" ] && firefox https://www.google.com/search?q="${query}" &
Per ottenere la parola chiave della query e memorizzarla nella variabile query
, utilizziamo, ancora una volta, la sostituzione dei comandi. In questo caso, non vogliamo visualizzare un elenco in dmenu, quindi gli indichiamo semplicemente una stringa vuota. Poiché non ci sono elementi visualizzati in dmenu, utilizziamo l'operatore di reindirizzamento <&-
per chiudere lo standard input dell'applicazione. Dalla pagina man di bash:
L'operatore di reindirizzamento
[n]<&parola
viene utilizzato per duplicare i descrittori dei file di input. Se parola si espande in una o più cifre, il descrittore di file indicato da n viene creato per essere una copia di quel descrittore di file. Se le cifre in word non specificano un descrittore di file aperto per l'input, si verifica un errore di reindirizzamento. Se word restituisce '–', il descrittore di file n è chiuso. Se n non è specificato, viene utilizzato l'input standard (descrittore di file 0).
Se la variabile query
non è vuota, costruiamo un URL utilizzando il suo valore e avviamo un'istanza di Firefox in background per aprirlo. Ecco la dimostrazione:
Pensieri conclusivi
Dmenu è un menu dinamico gratuito e open source per X tipicamente utilizzato su configurazioni minime di gestori di finestre. Viene utilizzato principalmente come lanciatore di applicazioni, ma in questo articolo abbiamo visto come può essere facilmente personalizzato per eseguire una varietà di attività. La community condivide molti script dmenu personalizzati su piattaforme come GitHub. Sentiti libero di esplorarli per crearne uno tuo!