DEV Community

Cover image for Aumentare la produttività con Tmux e Vim
Marco Bollero
Marco Bollero

Posted on

1

Aumentare la produttività con Tmux e Vim

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 😃

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
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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.

Visualizzazione 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 . _)
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Lo "spiegone"

Un po' di spiegazioni...

  1. Per prima cosa controlliamo se la sessione che abbiamo esiste già
  2. 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 scrivere nvim e premere Invio
    • 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)
  3. Come ultimo step, andiamo a controllare la variabile di ambiente `TMUX'
    • Se non è impostata non ci troviamo già all'interno di tmux e quindi usiamo attach-session
    • Altrimenti dobbiamo usare switch-client

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! 😎

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs