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-keysdiciamo di scriverenvime premereInvio - Dentro questa sessione, andiamo a creare una nuova finestra che chiamiamo "shell"
- E con
select-windowandiamo 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
tmuxe 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)