L'idea
Tanto tempo fa, in una galassia lontana lontana...
Ops, scusate, è che quando scrivo "tanto tempo fa", poi le dita vanno avanti da sole 😃
Dicevamo... tempo fa, mi sono imbattuto in un video del noto youtuber ThePrimeagen (vi consiglio di seguirlo, è interessante e spesso divertente ma non soltanto per la sua voce che sembra un cartone animato) in cui parlava del suo workflow, cioè del suo flusso di lavoro: con solo due tasti apriva una nuova sessione tmux
(o la ripristinava se già presente) e "auto-magicamente" si trovava vim
aperto pronto per lavorare! Se non è questa produttività?!?!?!
Una figata pazzesca!
Allora mi sono detto: lo posso fare anch'io, ne ho tutte le capacità ed anch'io ho la voce che sembro Paperino 😃
Mettiamoci a lavoro!
In realtà la cosa è stata abbastanza semplice, per prima cosa mi serviva un file di configurazione con tutti i path
dove solitamente memorizzo i miei progetti, ho deciso di chiamare il file: mp_folders
Sicuramente vi starete domandando "ma perché inizia per mp?!?!?!"
Eh, bella domanda, lo capirete a breve 😊
Perfetto, una volta fatta la lista, mi serve un modo per chiedere all'utente quale progetto vuole aprire, e qui ThePrimeagen suggerisce (giustamente) di usare il fzf.
Il fuzzy-finder è un tools a riga di comando per filtrare e selezionare qualsiasi tipo di lista passata in ingresso. Non c'è neanche bisogno di scrivere la stringa esatta! Viene chiamata "ricerca fuzzy", permette cioè di trovare rapidamente elementi all'interno di una lista, anche in presenza di errori di battitura o parole incomplete!
Ad esempio, avete una lista come la seguente?
mela
banana
pesca
pere
per selezionare "pesca" non occorre scrivere pes
pesc
o addirittura pesca
, basta anche solo premere p
e s
Ok, ora mettiamo mani al codice... usiamo bash
per scrivere un semplice script, come lo chiamiamo?!?!?
Mumble, mumble... my-project
! No... troppo longo... ok trovato mp
!
#! /bin/bash
LIST=$(cat $HOME/.config/mp_folders | tr "\n" " ")
FOLDER=$(find ${LIST} -mindepth 1 -maxdepth 1 -type d | fzf)
LIST
praticamente sarà valorizzato con l'elenco di tutte le cartelle inserite nel file mp_folders
separate da un semplice spazio.
Passiamo questa LIST
al comando find
per farci trovare tutte le sotto-cartelle (senza però scendere troppo nell'albero) e passiamo quindi il tutto al nostro amato fzf
.
Bellissimo! Già mi piace!
Una volta che l'utente preme Invio
all'interno di FOLDER
andrà a finire la cartella selezionata.
Con questa informazione, ci andiamo a costruire il nome della nostra sessione tmux
, per sicurezza meglio sostituire i punto con l'underscore, casomai qualcuno s'innervosisse
NAME=$(basename "${FOLDER}" | tr . _)
tmux
ci consente di creare ma anche modificare sessioni, ad esempio se volessi aggiungere una nuova finestra ad una sessione, mi basta lanciare:
tmux new-window -n shell -t session1
così facendo abbiamo aggiunto una nuova finestra alla sessione "session1" dandogli il titolo "shell", ditemi voi se questa non è una figata!
Ok, mettiamo un po' comandi nello script
echo "Sessione <$NAME>"
if tmux has-session -t "${NAME}" 2>/dev/null
then
echo "La sessione esiste"
else
echo "La sessione non esiste"
tmux new-session -ds $NAME -c $FOLDER
tmux send-keys -t ${NAME}:1 "nvim" Enter
tmux new-window -c $FOLDER -n shell -t ${NAME}:2
tmux select-window -t ${NAME}:1
fi
if [[ -z $TMUX ]]
then
# Non sono già in tmux
tmux attach-session -t $NAME
else
# Sono già in tmux
tmux switch-client -t $NAME
fi
Lo "spiegone"
Un po' di spiegazioni...
- Per prima cosa controlliamo se la sessione che abbiamo esiste già
- Se c'è, allora non dobbiamo fare nulla e scriviamo solo un commento che potrebbe esserci utile in futuro
- Se invece non c'è, allora creiamo la sessione col nome che abbiamo costruito e specifichiamo anche la cartella corrente
- Tramite
send-keys
diciamo di scriverenvim
e premereInvio
- Dentro questa sessione, andiamo a creare una nuova finestra che chiamiamo "shell"
- E con
select-window
andiamo a selezionare la prima finestra (il nostro editor)
- Come ultimo step, andiamo a controllare la variabile di ambiente `TMUX'
- Se non è impostata non ci troviamo già all'interno di
tmux
e quindi usiamoattach-session
- Altrimenti dobbiamo usare
switch-client
- Se non è impostata non ci troviamo già all'interno di
Il nostro script è terminato, ora se lanciamo mp
auto-magicamente ci verrà mostrata la lista dei nostri progetti, selezioniamo quello che vogliamo aprire e voilà! Il nostro script ci ha creato la nuova sessione tmux
ed ha già aperto il nostro editor preferito!
E se volessimo cambiare progetto? Nessun problema, la sessione corrente verrebbe sostituita con la nuova e lasciata li ad aspettarci!
La ciliegina sulla torta
Ovviamente, non mi va ogni volta di aprire il terminale e scrivere mp
, quindi mi sono creato un keymap che ho salvato nel mio ~/.tmux.conf
:
bind -r Space run-shell tmux new-window ~/bin/mp
Nel mio caso il prefix è Ctrl
+ Space
quindi mi basta premere Ctrl
+ Space
+ Space
per fare lo switch ad un'altra sessione.
Ma vi dirò di più, dato che uso i3, ho fatto uno script simile (px
) che invece del fzf
utilizza rofi per visualizzare la lista dei progetti, basta questa piccola modifica:
FOLDER=$(find ${LIST} -mindepth 1 -maxdepth 1 -type d | rofi -dmenu -p "Seleziona il progetto" -font "Monospace 18")
ed aggiungere questa riga alla configurazione di i3
bindsym $mod+t exec kitty -e $HOME/bin/px
Così, anche da i3, mi basta premere un tasto per avere il mio progetto aperto e pronto a lavorare!
Per oggi è tutto, ci vediamo presto! 😎
Top comments (0)