{"id":883,"date":"2018-01-07T21:49:30","date_gmt":"2018-01-07T21:49:30","guid":{"rendered":"http:\/\/blog.datentraeger.li\/?p=883"},"modified":"2019-03-12T10:39:46","modified_gmt":"2019-03-12T09:39:46","slug":"tmux","status":"publish","type":"post","link":"https:\/\/blog.datentraeger.li\/?p=883","title":{"rendered":"tmux"},"content":{"rendered":"<p>Ich konnte es nun doch nicht bleiben lassen und hab mir kurz tmux angeschaut. Also Splitting ist wesentlich simpler als in <a href=\"https:\/\/blog.datentraeger.li\/?p=840\" target=\"_blank\" rel=\"noopener noreferrer\">screen<\/a> (unter Screen finde ich das ganze eigentlich doch noch recht umst\u00e4ndlich&#8230;aber intensiv angeschaut hab ich&#8217;s auch nicht mit screen, um ehrlich zu sein&#8230;).<\/p>\n<p>Ich bin ja kompletter tmux\/screen Anf\u00e4nger, aber ich denke, dass es meinen Workflow ziemlich beeintr\u00e4chtigen wird in Zukunft.<\/p>\n<h3>eine neue Session starten:<\/h3>\n<pre class=\"\">tmux [new -S [SESSIONNAME]]<\/pre>\n<p>auch hier ist der Sessionname nicht zwingend, es reicht auch nur die einfach die Eingabe von tmux, um eine Session zu starten<\/p>\n<h3>vorhandene Sessions auflisten<\/h3>\n<pre class=\"lang:default decode:true\">tmux ls<\/pre>\n<h3>auf vorhandene Session verbinden<\/h3>\n<p>Wenn nur eine Session l\u00e4uft, reicht tmux a (oder <em>tmux at<\/em> oder <em>tmux attach<\/em>)<\/p>\n<pre class=\"lang:default decode:true\">tmux a<\/pre>\n<p>Bei mehreren Sessions kann mit -t den Sessionnamen mitgeben<\/p>\n<pre class=\"lang:default decode:true\">tmux a [-t SESSIONNAME]<\/pre>\n<h3>andere Shortcuts<\/h3>\n<p><strong>C-b c<\/strong> neues Sessionfenster<\/p>\n<p><strong>C-b [Fensternummer]<\/strong> Fensterwechsel<\/p>\n<p><strong>C-b d<\/strong> tmux &#8220;aush\u00e4ngen&#8221; (reattach mit screen a)<\/p>\n<p><strong>C-b ,<\/strong> Fenstertitel umbenennen<kbd><\/kbd><\/p>\n<p><strong>C-b &#8216;<\/strong> Fensterwechsel durch Eingabe des Titels \/ Fensternummer<\/p>\n<p><strong>C-b w<\/strong> Fensterliste anzeigen (sehr geil; mit Preview!)<\/p>\n<p><strong>C-b %<\/strong> horizontal splitten<\/p>\n<p><strong>C-b &#8220;<\/strong> vertikal splitten<\/p>\n<p><strong>C-b [Pfeiltasten]<\/strong> zwischen gesplitteten Fenstern wechselt man einfach mit den Pfeiltasten, ziemlich logisch (mit aktiver Maus kann nat\u00fcrlich auch diese verwendet werden)<\/p>\n<p><strong>C-b q<\/strong> Pane Nummern \/ IDs anzeigen (oder <em>tmux list-panes [-a]<\/em>)<br \/>\ngibt man dann gleich die Pane-Nummer an, wechselt man zu diesem<\/p>\n<p><strong>C-b o<\/strong> durch Panes &#8220;switchen&#8221;<\/p>\n<p><strong>C-b ?<\/strong> Hilfe anzeigen<\/p>\n<p><strong>C-b x<\/strong> aktuelles Fenster schliessen<\/p>\n<p><strong>C-b :kill-session<\/strong> Alle Fenster schliessen und tmux beenden<\/p>\n<h3>Statusbar<\/h3>\n<p>Und mit <strong>echo $TERM<\/strong> findet man raus, ob man sich gerade in einer tmux-Session befindet oder nicht. Falls schon, sieht man es in der Ausgabe mit \u201cscreen\u2026\u201d, also identisch mit screen. Jedoch kommt tmux bereits von Beginn mit einer Statusbar daher (zumindest bei mir), also sieht man&#8217;s eigentlich auf Anhieb.<\/p>\n<p>Was mir jedenfalls aufgefallen ist: lieber eine schlichte, einfache Statusbar &#8211; bei einer ssh Session kanns sonst mitunter etwas z\u00e4h sein, wenn unten immer wieder was blinkt und aufleuchtet (zb. Activity Monitor, etc). Sobald ich die angepasst hab (was mir dann zudem auch optisch besser gefallen hat), war tmux via ssh schon wesentlich bequemer\/fl\u00fcssiger zu bedienen.<\/p>\n<h4>Powerline<\/h4>\n<p>Weil Powerline derzeit grad so schick ist; unter Debian kann man das Package <a href=\"https:\/\/packages.debian.org\/search?suite=all&amp;section=all&amp;arch=any&amp;searchon=names&amp;keywords=tmux-themepack-jimeh\" target=\"blank\" rel=\"noopener noreferrer\">tmux-themepack-jimeh<\/a> installieren (ab Testing) und dann eines der verschiedenen Themen in tmux sourcen<\/p>\n<pre>:source-file \/usr\/share\/tmux\/tmux-pack-jimeh\/powerline\/default\/blue.tmuxtheme\n<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2040\" src=\"http:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/tmuxjimeh-1.png\" alt=\"\" width=\"1136\" height=\"25\" srcset=\"https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/tmuxjimeh-1.png 1136w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/tmuxjimeh-1-300x7.png 300w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/tmuxjimeh-1-768x17.png 768w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/tmuxjimeh-1-1024x23.png 1024w\" sizes=\"auto, (max-width: 1136px) 100vw, 1136px\" \/><\/p>\n<p>Braucht man nicht zwingend das Package, das kann man auch unter Stable einfach klonen und so verwenden. Naja, ich verwende es zwar nicht, denke aber, dass viele das wollen, weil eben grad &#8216;in&#8217;&#8230;<\/p>\n<h3>Colors<\/h3>\n<p>ohne grosse Konfiguration gab&#8217;s bei mir schnell Fehler, bspw., wenn ich mutt mit meinem <a href=\"https:\/\/github.com\/octol\/vombatidae-mutt\" target=\"_blank\" rel=\"noopener noreferrer\">Farbschema<\/a> gestartet hab (Terminal hat zuwenig Farben). Dies muss man tmux in der Config mitteilen:<\/p>\n<pre class=\"lang:default decode:true\">set -g default-terminal \"screen-256color\"<\/pre>\n<p>Auf die config geh ich jetzt aber nicht weiter ein, da findet man hunderte Beispiele auf Github&#8230;<\/p>\n<h3>Panes resizen<\/h3>\n<p>Mit aktiver Maus k\u00f6nnen die Panes wie erwartet angepasst werden. Ansonsten kann man in den Eingabemodus wechseln und via command Anpassungen t\u00e4tigen.<\/p>\n<p><strong>C-b :<\/strong> in den Eingabemodus wechseln<\/p>\n<pre class=\"highlight\"><code>:resize-pane -D (Resizes the current pane down)\n:resize-pane -U (Resizes the current pane upward)\n:resize-pane -L (Resizes the current pane left)\n:resize-pane -R (Resizes the current pane right)\n:resize-pane -D 10 (Resizes the current pane down by 10 cells)\n:resize-pane -U 10 (Resizes the current pane upward by 10 cells)\n:resize-pane -L 10 (Resizes the current pane left by 10 cells)\n:resize-pane -R 10 (Resizes the current pane right by 10 cells)<\/code><\/pre>\n<h3>Panes verschieben<\/h3>\n<p>Manchmal m\u00f6chte man ja auch Panes &#8220;verschieben&#8221;. Kein Problem:<\/p>\n<p><strong>C-b C o<\/strong> : Panes swappen<br \/>\n<strong>C-b Alt o<\/strong> : Panes swappen (wenn mehr als zwei Panes offen sind)<\/p>\n<p>Das ganze geht aber auch mit <strong>C-b {<\/strong> bzw <strong>C-b }<\/strong>, was ja bequemer ist, da eine Taste weniger<\/p>\n<p>Was jedoch auch sehr angenehm und cool ist:<\/p>\n<p><strong>C-b [Space]<\/strong> : mit der Leertaste kann man automatisch zwischen verschiedenen Layouts &#8220;toggeln&#8221;<\/p>\n<h3>kompletten Platz ausnutzen<\/h3>\n<p>Wenn ich bspw. mit dem Laptop auf eine Session am Desktop verbinde, ist nat\u00fcrlich das Verh\u00e4ltnis nicht identisch. Je nachdem werden dann Bereiche &#8220;ausgespart&#8221;:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-896 size-full\" src=\"http:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/tmux_diff_screensize.png\" alt=\"\" width=\"389\" height=\"213\" srcset=\"https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/tmux_diff_screensize.png 389w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/01\/tmux_diff_screensize-300x164.png 300w\" sizes=\"auto, (max-width: 389px) 100vw, 389px\" \/><\/p>\n<p>Um dies zu unterbinden trennt man am besten alle anderen Connections, wenn man sich verbindet.<\/p>\n<pre class=\"lang:default decode:true\">tmux attach -d [-t SESSIONNAME]<\/pre>\n<p>Nat\u00fcrlich kann man auch einfach attachen, dann muss man jedoch mit halt mit dem ungenutzen Platz &#8220;leben&#8221;. Eine andere Variante (hab ich aber selber nicht getestet): <strong>C-b Shift-D<\/strong>, um andere Sessions zu trennen. Anscheinend listet dann tmux alle Sessions und man kann ausw\u00e4hlen, was man detachen will.<\/p>\n<h3>Copy\/Paste<\/h3>\n<p>den Copymodus in tmux hab ich noch nicht wirklich geschnallt. Sofern jedoch die Maus aktiviert ist, kann man die Shift-Taste gedr\u00fcckt halten und mit der linken Maustaste den Text markieren. Somit ist es bereits kopiert. Einf\u00fcgen kann man mit gedr\u00fcckter Shift-Taste und der mittleren Maustaste.<\/p>\n<h4>Keyboard only<\/h4>\n<p>Aber nat\u00fcrlich m\u00f6chte ich so oft wie m\u00f6glich auf die Maus verzichten. Das ist auch nicht weiter schwierig:<\/p>\n<p><strong>C-b [<\/strong>: in den Kopiermodus wechseln<br \/>\n<strong>Space<\/strong>: gew\u00fcnschten Text mit der Leertaste markieren<br \/>\n<strong>Enter<\/strong>: Auswahl kopieren<\/p>\n<p>Ganz cool ist es, wenn man den vi-mode aktiviert hat (setw -g mode-keys vi). Damit werden h,j,k,l zum navigieren aktiviert. Auch sonst sehr angenehm, da man sehr viele vim-Shortcuts anwenden kann&#8230;<\/p>\n<h5>vi-copy-Funktionen<\/h5>\n<p>wie man sieht, eigentlich viel bekanntes von vim her&#8230; damit kann man recht effizient Text kopieren<\/p>\n<p>Zur\u00fcck zu Einr\u00fcckung <strong>^<\/strong><br \/>\nAuswahl l\u00f6schen <strong>Escape<\/strong><br \/>\nAuswahl kopieren <strong>Enter<\/strong><br \/>\nCursor nach unten <strong>j<\/strong><br \/>\nCursor links <strong>h<\/strong><br \/>\nCursor rechts <strong>l<\/strong><br \/>\nCursor nach unten <strong>L<\/strong><br \/>\nCursor zur Mitte <strong>M<\/strong><br \/>\nCursor nach oben <strong>H<\/strong><br \/>\nCursor up <strong>k<\/strong><br \/>\nganze Zeile l\u00f6schen <strong>d<\/strong><br \/>\nEnde der Zeile l\u00f6schen <strong>D<br \/>\n<\/strong>Beginn der Zeile<strong> 0<br \/>\n<\/strong>Ende der Zeile <strong>$<\/strong><br \/>\ngehe zu Zeile <strong>:<\/strong><br \/>\nhalbe Seite nach unten <strong>C-d<\/strong><br \/>\nhalbe Seite nach oben <strong>C-u<\/strong><br \/>\nn\u00e4chste Seite <strong>C-f<\/strong><br \/>\nn\u00e4chstes Wort <strong>w<\/strong><br \/>\nBuffer einf\u00fcgen <strong>p<\/strong><br \/>\nvorherige Seite <strong>C-b<\/strong><br \/>\nvorheriges Wort <strong>b<\/strong><br \/>\nQuit Mode <strong>q<\/strong><br \/>\nScroll down <strong>C-Down<\/strong> oder <strong>J<\/strong><br \/>\nScroll up <strong>C-Up<\/strong> oder <strong>K<\/strong><br \/>\nerneut suchen <strong>n<\/strong><br \/>\nr\u00fcckw\u00e4rts suchen <strong>?<\/strong><br \/>\nvorw\u00e4rts suchen \/<br \/>\nAuswahl starten <strong>Space<\/strong><\/p>\n<p>Den kopierten Text kann man mittels <strong>C-b ] <\/strong>einf\u00fcgen. Hier ist jedoch zu beachten, dass der kopierte Text nur innerhalb von tmux nutzbar ist. Um dies generell nutzen zu k\u00f6nnen, w\u00e4re glaub ich das Plugin <a href=\"https:\/\/github.com\/tmux-plugins\/tmux-yank\" target=\"_blank\" rel=\"noopener noreferrer\">tmux-yank<\/a> nutzbar, kann aber nichts dazu sagen, da ich&#8217;s bisher noch nicht getestet hab.<\/p>\n<h3>Plugins<\/h3>\n<p>Es scheint, dass es recht viele <a href=\"https:\/\/github.com\/tmux-plugins\" target=\"_blank\" rel=\"noopener noreferrer\">Plugins<\/a> (und auch einen entsprechenden <a href=\"https:\/\/github.com\/tmux-plugins\/tpm\" target=\"_blank\" rel=\"noopener noreferrer\">Plugin Manager<\/a>) f\u00fcr tmux gibt, jedoch bin ich noch nicht soweit \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"Ich konnte es nun doch nicht bleiben lassen und hab mir kurz tmux angeschaut. Also Splitting ist wesentlich simpler als in screen (unter Screen finde ich das ganze eigentlich doch noch recht umst\u00e4ndlich&#8230;aber intensiv angeschaut hab ich&#8217;s auch nicht mit screen, um ehrlich zu sein&#8230;). Ich bin ja kompletter tmux\/screen&hellip;\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[36,4],"tags":[],"class_list":["post-883","post","type-post","status-publish","format-standard","hentry","category-cli","category-debiangnu-linux"],"_links":{"self":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts\/883","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=883"}],"version-history":[{"count":47,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts\/883\/revisions"}],"predecessor-version":[{"id":2357,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts\/883\/revisions\/2357"}],"wp:attachment":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=883"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=883"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=883"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}