  {"id":1235,"date":"2019-10-12T15:56:08","date_gmt":"2019-10-12T14:56:08","guid":{"rendered":"https:\/\/www.gironi.it\/blog\/?p=1235"},"modified":"2024-09-20T14:04:21","modified_gmt":"2024-09-20T13:04:21","slug":"tmux-piu-programmi-dalla-riga-di-comando","status":"publish","type":"post","link":"https:\/\/www.gironi.it\/blog\/tmux-piu-programmi-dalla-riga-di-comando\/","title":{"rendered":"Tmux &#8211; pi\u00f9 programmi dalla riga di comando"},"content":{"rendered":"\n<p>Parlare di &#8220;<em>Terminal Multiplexer<\/em>&#8221; pu\u00f2 spaventare: cosa sar\u00e0 mai?<br> La risposta \u00e8: qualcosa di molto utile, specialmente se siete soliti lavorare su server remoti. Se poi la linea di comando per voi \u00e8 un piacere, allora Tmux pu\u00f2 riservarvi ore di gioia\u2026<br><\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Tmux consente infatti di aprire sessioni su server remoti, lanciare operazioni, staccare la finestra, andarsene a casa e riattaccare la sessione ritrovando tutto come se nulla fosse accaduto.<br> Si tratta della funzione principale del glorioso <a rel=\"noreferrer noopener\" href=\"https:\/\/www.gnu.org\/software\/screen\/\" target=\"_blank\">GNU Screen<\/a>, ma cui Tmux aggiunge una moltitudine di migliorie.<\/p>\n\n\n\n<p><strong>Con Tmux lo schermo si pu\u00f2 suddividere come si vuole. L&#8217;organizzazione in sessioni\/finestre\/pannelli consente di avere spazi di lavoro straordinariamente razionali e organizzati<\/strong>. <br>Al punto che per alcuni \u00e8 diventato un&#8217;alternativa ai comuni (e pesanti) window manager.<br><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2019\/10\/tmux-esempio.jpg\" alt=\"Esempio di Tmux\" class=\"wp-image-1244\" width=\"677\" height=\"340\" srcset=\"https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2019\/10\/tmux-esempio.jpg 1353w, https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2019\/10\/tmux-esempio-300x151.jpg 300w, https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2019\/10\/tmux-esempio-1024x515.jpg 1024w, https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2019\/10\/tmux-esempio-1200x603.jpg 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><figcaption>Esempio di sessione Tmux: nello stesso schermo ho disposto Vi, Htop, Newsboat, Sc-Im&#8230;<\/figcaption><\/figure><\/div>\n\n\n\n<p> Tornando alla nostra amata linea di comando, Tmux presenta un vantaggio, che \u00e8 anche un&#8217;arma a doppio taglio: l&#8217;<a href=\"#personalizzare\" class=\"rank-math-link\">estrema configurabilit\u00e0<\/a>.<br> Ho conosciuto persone impegnate pi\u00f9 nel configurare la linea di stato e il key mapping di Tmux che a usarlo realmente\u2026anzi, una di quelle persone sono proprio io \ud83d\ude42<\/p>\n\n\n\n<p> Il mio consiglio allora \u00e8 quello di &#8220;farsi le ossa&#8221; smanettando con il file di configurazione<em> .tmux.conf<\/em>, esultare per le migliorie e giocando con <em><a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/powerline\/powerline\" target=\"_blank\">powerline<\/a><\/em> e <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/tmux-plugins\" target=\"_blank\">plugins<\/a>, ma poi tornare all&#8217;essenzialit\u00e0. Perch\u00e8 la velocit\u00e0, il poter non staccare mai le mani dalla tastiera, la pulizia nell&#8217;organizzazione delle informazioni sono il segreto e la forza di Tmux. Che \u00e8 un programma &#8220;esigente&#8221;, come Vi. Ma alla fine ripaga per lo sforzo, e lo fa con gli interessi.<\/p>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-b8f08a83\"><h2 class=\"uagb-heading-text\">Sessioni, finestre, pannelli<\/h2><div class=\"uagb-separator-wrap\"><div class=\"uagb-separator\"><\/div><\/div><p class=\"uagb-desc-text\">dove comincia il divertimento<\/p><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Per poter lavorare con profitto con Tmux \u00e8 necessario capire la &#8220;logica&#8221; dell&#8217;applicazione. E questa logica \u00e8 tutta compresa nel modo in cui il programma gestisce gli elementi base: <strong>sessioni<\/strong>, <strong>finestre<\/strong>, <strong>pannelli<\/strong>.<\/p>\n\n\n\n<p>Si comincia dalla <strong>sessione<\/strong>. Ogni volta che lanciamo Tmux viene creata una sessione. Se vogliamo dare un nome alla nostra sessione (cosa che consiglio sempre di fare, assegnando nomi significativi, a differenza di ci\u00f2 che far\u00f2 in questo esempio&#8230;) baster\u00e0 digitare <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u200btmux\u200b\u200b \u200bnew\u200b\u200b \u200b-s\u200b\u200b \u200bprimasessione<\/pre>\n\n\n\n<p>Il risultato sar\u00e0 uno schermo nero con la riga di stato in basso che riporter\u00e0 il nome della sessione.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div class=\"wp-block-uagb-info-box uagb-infobox__outer-wrap uagb-block-77e32502\"><div class=\"uagb-infobox__content-wrap uagb-infobox uagb-infobox-has-icon uagb-infobox-icon-left uagb-infobox-left uagb-infobox-stacked-tablet uagb-infobox-image-valign-middle uagb-infobox-enable-border-radius \"><div class=\"uagb-ifb-left-right-wrap\"><div class=\"uagb-ifb-image-icon-content uagb-ifb-imgicon-wrap\"><div class=\"uagb-ifb-icon-wrap\"><span class=\"uagb-ifb-icon\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 512 512\"><path d=\"M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z\"><\/path><\/svg><\/span><\/div><\/div><div class=\"uagb-ifb-content\"><div class=\"uagb-ifb-title-wrap\"><h4 class=\"uagb-ifb-title\">L&#8217;onnipresente prefisso<\/h4><\/div><div class=\"uagb-ifb-text-wrap\"><p class=\"uagb-ifb-desc\">I comandi Tmux vengono inseriti attraverso una sequenza di tasti che comincia con il prefisso CTRL-B. <a href=\"#personalizzare\">Vedremo pi\u00f9 avanti<\/a> come ridefinire questa scomoda combinazione con la pi\u00f9 agevole (per le dita) sequenza CTRL-A tipica di screen. Ogni volta che scriver\u00f2 dunque PREFISSO intender\u00f2 questa combinazione di tasti.<\/p><\/div><\/div><\/div><\/div><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">La sessione pu\u00f2 essere staccata<\/h2>\n\n\n\n<p>Se nel mio terminale lancio un applicativo, ad esempio htop, mi baster\u00e0 digitare la sequenza PREFISSO-D per tornare al prompt. Cosa \u00e8 successo? <br>Semplice. Il programma in realt\u00e0 \u00e8 ancora &#8220;vivo&#8221;, ma \u00e8 stato <em>staccato<\/em>. Se digito:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">tmux ls<\/pre>\n\n\n\n<p>posso notare come la sessione che ho staccato &#8220;esista ancora&#8221;. Mi baster\u00e0 &#8220;riattaccarla&#8221; con:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">tmux\u200b\u200b attach\u200b\u200b -t primasessione\u200b\u200b <\/pre>\n\n\n\n<p>e come per magia ritrover\u00f2 il mio htop in azione! Non \u00e8 magia, ma ci si avvicina.<br>Per inciso, se voglio &#8220;uccidere&#8221; la sessione il comando \u00e8:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">tmux\u200b\u200b kill-session\u200b\u200b -t\u200b\u200b primasessione<\/pre>\n\n\n\n<p>E&#8217; giunto il momento di creare una sessione che presenti due finestre. Diciamo una prima finestra con una shell, e la seconda con un Midnight Commander. Digito dunque:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">tmux new -s miasessione -n miashell<\/pre>\n\n\n\n<p>Tutto come previsto. Si apre la finestra con la sessione &#8220;miasessione&#8221; e il prompt della shell. Ora mi basta creare una nuova finestra con PREFISSO-C e lanciare mc.<\/p>\n\n\n\n<p>Visto? nella riga di stato posso vedere la presenza, nella sessione miasessione, delle due finestre: miashell e mc. Per rinominare una finestra mi basta usare PREFISSO-, (il prefisso CTRL-B oppure CTRL-A se l&#8217;ho ridefinito, seguito da una virgola).<\/p>\n\n\n\n<p>Le finestre sono precedute da un numero. Di default la prima finestra ha il numero 0, ma <a href=\"#personalizzare\">vedremo in seguito<\/a> come ridefinire la cosa per far iniziare la sequenza dal numero 1. <\/p>\n\n\n\n<p>Mi baster\u00e0 digitare PREFISSO+numero per &#8220;saltare&#8221; da una finestra a un&#8217;altra.<\/p>\n\n\n\n<p>La parte pi\u00f9 bella per\u00f2 \u00e8 la successiva. Posso infatti dividere ogni mia finestra in pi\u00f9 <strong>pannelli<\/strong>.<\/p>\n\n\n\n<p>Se guardate l&#8217;immagine pi\u00f9 sopra con i 4 applicativi disposti in uno schema 2&#215;2 potete facilmente capire cosa si possa ottenere. In pratica, lo schermo pu\u00f2 essere suddiviso a piacimento, disponendo i programmi come risulta pi\u00f9 comodo. L&#8217;esempio classico di un amministratore di server che pu\u00f2 monitorare pi\u00f9 macchine o il programmatore che tiene a schermo editor, debugger e riga comando \/ output possono bastare a far capire l&#8217;utilit\u00e0 di una soluzione di questo tipo.<\/p>\n\n\n\n<p>La suddivisione dello schermo avviene con i comandi PREFISSO-% per la suddivisione verticale e PREFISSO-&#8221; per quella orizzontale, ma redifiniremo questi tasti in maniera pi\u00f9 intuitiva agendo sul file di configurazione.<\/p>\n\n\n\n<h2 class=\"has-text-align-center wp-block-heading\" id=\"personalizzare\">La gioia della personalizzazione<\/h2>\n\n\n\n<p>La personalizzazione di Tmux avviene tutta attraverso la <strong>scrittura del file <em>.tmux.conf<\/em><\/strong> presente di default nella propria home directory.<\/p>\n\n\n\n<p>La fantasia e le innumerevoli possibilit\u00e0 possono fornire ore e ore di svago per chiunque coltivi la passione della customizzazione, consentendo anche soluzioni assai avanzate. Non \u00e8 questa la sede per spingerci verso arditi settaggi (lascio ai link e ai libri qua sotto il compito per i pi\u00f9 curiosi e interessati), ma mi limito a &#8220;ritoccare&#8221; alcuni aspetti molto importanti per quanto riguarda le funzionalit\u00e0 base del programma.<\/p>\n\n\n\n<p>Apro dunque con il mio editor preferito (oppure creo) il file .tmux.conf<\/p>\n\n\n\n<p>La primissima cosa che andr\u00f2 a modificare \u00e8 il PREFISSO. CTRL-B \u00e8 infatti una sequenza che giudico infelicissima. Meglio, molto meglio CTRL-A, che non a caso \u00e8 il prefisso standard di GNU Screen:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Ctrl-a al posto di Ctrl-b\n# Cancello la combinazione C-b\nunbind C-b\n# e setto C-a\nset -g prefix C-a<\/pre>\n\n\n\n<p>Voglio poi che l&#8217;indice base per finestre e pannelli parta da 1 anzich\u00e8 da 0:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Indice base per le finestre a 1 invece di 0\nset -g base-index 1\n# Indice per i pannelli a 1 invece di 0\nsetw -g pane-base-index 1<\/pre>\n\n\n\n<p>Voglio avere il manuale a portata di tasto PREFISSO-?, e voglio poter cambiare la mia configurazione e ricaricarla con una semplice sequenza di tasti (PREFISSO-r) per fare i miei esperimenti:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># mostra il manuale\nbind-key ? command-prompt \"split-window -h 'exec man %%'\"\n# ricarica il file di configurazione\nbind r source-file ~\/.tmux.conf  \\; display  \"Ricaricato!\"<\/pre>\n\n\n\n<p>Voglio divertirmi a suddividere la mia finestra in pi\u00f9 pannelli in maniera intuitiva. Uso \\ oppure | per la suddivisione verticale e &#8211; per quella orizzontale. Semplice e intuitivo!<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Dividi\nbind-key - split-window -v\nbind-key \\ split-window -h\nbind-key | split-window -h<\/pre>\n\n\n\n<p>Abilitiamo il mouse, e poi voglio i colori!<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Attiva il mouse\nset -g mouse on\n\n# 256 colori\nset -g default-terminal \"screen-256color\"<\/pre>\n\n\n\n<p>Su riga di comando, taglia e incolla personalizzati, potenziamento della clipboard, temi e plugin lascio il divertimento a voi, e le spiegazioni ai testi consigliati. E&#8217; tutto molto facile, tutto molto ma molto ricco di soddisfazioni. Buon divertimento con Tmux!<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-f87ef893\"><h2 class=\"uagb-heading-text\">Approfondimenti<\/h2><div class=\"uagb-separator-wrap\"><div class=\"uagb-separator\"><\/div><\/div><p class=\"uagb-desc-text\">le risorse in rete, i testi per sapere tutto<\/p><\/div>\n\n\n\n<h3 class=\"has-text-align-center wp-block-heading\">Risorse online<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a rel=\"noreferrer noopener\" aria-label=\"The Tao of tmux - leggilo online (apre in una nuova scheda)\" href=\"https:\/\/leanpub.com\/the-tao-of-tmux\/read\" target=\"_blank\">The Tao of tmux &#8211; leggilo online<\/a> (inglese)<\/li><li><a rel=\"noreferrer noopener\" aria-label=\"Il manuale di Tmux (apre in una nuova scheda)\" href=\"http:\/\/man.openbsd.org\/OpenBSD-current\/man1\/tmux.1\" target=\"_blank\">Il manuale di Tmux<\/a> (inglese)<\/li><li><a href=\"https:\/\/www.linode.com\/docs\/networking\/ssh\/persistent-terminal-sessions-with-tmux\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Una sintetica introduzione ai comandi principali  (apre in una nuova scheda)\">Una sintetica introduzione ai comandi principali <\/a>(inglese)<\/li><\/ul>\n\n\n\n<h3 class=\"has-text-align-center wp-block-heading\">Due ottimi libri acquistabili su Amazon<\/h3>\n\n\n\n<div style=\"text-align: center\">\n<iframe style=\"width:120px;height:240px;\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\" frameborder=\"0\" src=\"https:\/\/rcm-eu.amazon-adsystem.com\/e\/cm?ref=qf_sp_asin_til&amp;t=consulenzeinf-21&amp;m=amazon&amp;o=29&amp;p=8&amp;l=as1&amp;IS2=1&amp;asins=B01N9HBR3D&amp;linkId=13fc53a75df9b71ee78f29df0212d0b0&amp;bc1=000000&amp;lt1=_blank&amp;fc1=333333&amp;lc1=0066c0&amp;bg1=ffffff&amp;f=ifr\">\n    <\/iframe>\n\n<iframe style=\"width:120px;height:240px;\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\" frameborder=\"0\" src=\"\/\/rcm-eu.amazon-adsystem.com\/e\/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=consulenzeinf-21&amp;o=29&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=178398516X&amp;linkId=a36032fcf833550e5d44096cb003cd74\"><\/iframe>\n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Parlare di &#8220;Terminal Multiplexer&#8221; pu\u00f2 spaventare: cosa sar\u00e0 mai? La risposta \u00e8: qualcosa di molto utile, specialmente se siete soliti lavorare su server remoti. Se poi la linea di comando per voi \u00e8 un piacere, allora Tmux pu\u00f2 riservarvi ore di gioia\u2026<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","footnotes":""},"categories":[771,751,753,755,775],"tags":[],"class_list":["post-1235","post","type-post","status-publish","format-standard","hentry","category-cli-it","category-linux-it","category-server-it","category-shell-it","category-tools-it"],"lang":"it","translations":{"it":1235},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"post-thumbnail":false},"uagb_author_info":{"display_name":"paolo","author_link":"https:\/\/www.gironi.it\/blog\/author\/paolo\/"},"uagb_comment_info":0,"uagb_excerpt":"Parlare di &#8220;Terminal Multiplexer&#8221; pu\u00f2 spaventare: cosa sar\u00e0 mai? La risposta \u00e8: qualcosa di molto utile, specialmente se siete soliti lavorare su server remoti. Se poi la linea di comando per voi \u00e8 un piacere, allora Tmux pu\u00f2 riservarvi ore di gioia\u2026","_links":{"self":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/1235","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/comments?post=1235"}],"version-history":[{"count":1,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/1235\/revisions"}],"predecessor-version":[{"id":2403,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/1235\/revisions\/2403"}],"wp:attachment":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/media?parent=1235"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/categories?post=1235"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/tags?post=1235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}