
A Quick and Easy Guide to Tmux (2015) - mjirv
https://www.hamvocke.com/blog/a-quick-and-easy-guide-to-tmux/
======
ronjouch
I used to enjoy Tmux, then noticed I didn't need its core persistence/session
feature; I mostly used it for windowing & tiling, which are okay but come with
_lots_ of warts you need to avoid, and before you know it your tmux.conf is
150 lines of stuff copy-pastaed from StackOverflow and the Arch wiki, mouse &
copying keep being janky, and you're in for long sessions of configuration
whack-a-mole where each fix somewhere breaks something somewhere else. Also,
the client/server architecture is great if you need it, but for everyday
development I don't, so I'd rather avoid the extra layer.

Not blaming the authors/maintainers at all, they're responsive and Tmux is
extremely reliable. But in the end, it feels like they're battling to
implement features at the wrong layer, and UX suffers.

In the end, I realized I just wanted a good terminal emulator that is {fast,
featureful, scriptable, keyboard-friendly}.

If that sounds familiar, give Kitty a try:
[https://sw.kovidgoyal.net/kitty/](https://sw.kovidgoyal.net/kitty/) (and run
[https://fishshell.com/](https://fishshell.com/) in it, but that's another
discussion :)

~~~
jolmg
> I mostly used it for windowing & tiling [...] it feels like they're battling
> to implement features at the wrong layer [...] In the end, I realized I just
> wanted a good terminal emulator

If you just wanted the windowing and tiling, wouldn't a tiling window manager
be better? It's kind of weird that you concluded the right layer for _window
tiling_ was the terminal emulator.

Personally, I only use the window tiling features of tmux when I'm not already
working inside a window manager (like when I'm on a /dev/tty*).

~~~
ronjouch
> If you just wanted the windowing and tiling, wouldn't a tiling window
> manager be better? It's kind of weird that you concluded the right layer for
> _window tiling_ was the terminal emulator.

I tried a tiling window manager (not sure which) a long time ago and didn't
like it, it felt too heavy-handed and unnatural to me. My daily driver is:

\- GNOME Shell ...

\- ... with the occasional Super+{Left/Right} for basic half-screen splits
(e.g. term on the left and editor on the right)...

\- ... and I use a little helper script (
[https://github.com/ronjouch/marathon](https://github.com/ronjouch/marathon) )
to run-or-focus apps.

With these three things, I meet my "simple tiling" needs and keep the
flexibility I like from non-tiling WMs.

But Sway looks cool, I'll definitely try it one of these days :) , maybe I'll
change my mind.

------
panpanna
> sudo apt-get install tmux (Ubuntu and derivatives)

I believe you just insulted the entire Debian community.

Jokes aside, tmux reminds me of emacs (similar esthetics & key bindings), the
same way screen reminds me of vim (how do I get out of this thing?)

~~~
jolmg
They both have both types of keybindings.

------
kerouanton
Having being a `screen` user for over two decades, migrating to tmux has been
a pain. A week ago, however I discovered a wrapper called `byobu` (1) which
really helps, and controls both screen and tmux depending on which one you
have on your system. It basically wraps Function keys and more to tmux, but
has plenty of other features. Time will tell if it was worth installing, but I
do believe it's simpler for me to use it as a transition from screen.

(1) [https://byobu.org](https://byobu.org)

~~~
philsnow
I've been a screen user for decades as well, and don't feel compelled to use
tmux (and also tmux has one too many concepts for me, I don't need sessions).
Did you find some compelling reason to switch?

~~~
rovr138
Screen has sessions too... unless I’m missing something and this means
something else

------
xelxebar
While on the subject, I'd like to share a solution I came up with for nested
sessions:

[https://github.com/xelxebar/tmux-
addons/tree/master/nesting](https://github.com/xelxebar/tmux-
addons/tree/master/nesting)

Essentially, it defines some keys that let you "focus" on a particular nesting
level. I've had some instances of needing four levels of nesting and found
this to be quite nice.

The configuration is a tad idiosyncratic due to the way tmux handles
variables, but it should be pretty well document in the readme.

Hopefully, someone else finds it useful. I've had to deal with sessions four
levels deep and found this relatively ergonomic.

------
nvahalik
Holy cow tmux has changed my life.

No longer do I have to worry about losing all of my process when I
accidentally close iTerm. This, coupled with the fact that you can Ctrl-B
Ctrl-B and control your tmux within tmux... It's even fairly easy to script
and make awesome workflows. Take for instance this script which shows a diff
in a left pane and a commit editor in the right pane:
[https://gist.github.com/nvahalik/36108d4b892b6f66982537235f9...](https://gist.github.com/nvahalik/36108d4b892b6f66982537235f9cf462)

~~~
dba7dba
I am sure you may know this already but iTerm has a prefenrece setting called
"Confirm Quit iTerm2 ... command"

Checking it on has saved me quite a bit of trouble.

~~~
nvahalik
Yes. But even with that, I've accidentally killed it before via Activity
Monitor... still a great tip, though.

------
ohazi
I spent a while trying to file down some of the rough edges around different
versions of tmux and compatibility with shells / colors / vim / scrolling /
weird keycodes / etc. and have some commented dotfiles here:

[https://github.com/ohazi/dotfiles](https://github.com/ohazi/dotfiles)

It still has warts, but hopefully this is a useful reference to someone... I
still haven't found a single source that covers all of these things well. Tmux
config is surprisingly unintuitive.

~~~
alpaca128
> Tmux config is surprisingly unintuitive.

And sometimes you get some stray tmux process running in the background that
somehow blocks it from updating the configuration until you find and kill
every running tmux process. Really annoying.

~~~
na85
Isn't that a simple matter of

    
    
      ps aux | grep tmux
      kill -9 12345
    
    ?

~~~
ljm
I prefer the nuclear option, which also gives you a bit of a gamble depending
on your search string

    
    
        pgrep tmux | xargs kill -9

~~~
ryanianian
`pkill -9 tmux` (or `pkill -9 [t]mux` if you're doing it over ssh)

------
christophclarke
>>> I’ll proceed to give them a two minute tour about what you can do with
tmux. After that they’re either hooked and want to try it themselves or they
tell me to go away with my ancient neckbeard tools and just use iTerm2.

FYI, iTerm2 actually has a tmux integration. Allows you to get the best of
native paneling and persistent sessions.

[https://www.iterm2.com/documentation-tmux-
integration.html](https://www.iterm2.com/documentation-tmux-integration.html)

------
ninkendo
To me, tmux only makes sense for remote servers. Why would I want to use it
for local terminal sessions? Why not just have multiple terminal windows open?
And multiple desktops instead of "sessions", etc?

I use tmux with iTerm integration when SSH'd into remote machines, so that my
tabs/window layout are preserved on the remote server when I reboot/reconnect.

But why would I need that locally? iTerm _already_ saves my windows and
tabs/layout/etc... because I _don 't close them_.

Using tmux locally just seems like extra steps... when should I "actually"
close a window, and when should I just detach it? Why is the distinction even
important? If I don't want to see a window I can just minimize it, and if I
want to actually close it, I can just... do that. Maybe because tmux has nice
keyboard combos for doing window arrangement? But couldn't I just set up my
window manager to do the same?

Remote servers though, totally makes sense. Sometimes you have to disconnect
your SSH session, so that you can reboot your local machine while leaving the
session open. tmux is a necessary thing in that regard. But on a local
machine, rebooting means I'm clearing all my state anyway, so what would it
really mean to "resume" a tmux session?

Maybe I just don't get it?

~~~
kovek
I saw my manager masterfully move his cursor across his terminal, select some
text, and copy it, all without using his mouse, inside tmux. I thought it was
cool

~~~
ninkendo
Isn't a mouse generally better at that?

I mean I generally consider my self pretty good at vim (people who watch me
are generally pretty impressed at least), and I get the draw to using the
keyboard for things, but the actual act of highlighting arbitrary text, vim is
not particularly good at. And I can't imagine how tmux would be either.

~~~
bch
> Isn't a mouse generally better at that?

I won’t comment on which is better, but tmux lets you navigate the screen (and
history buffer) by searching and vi(1)-like movements which serve me well. To
say nothing of being in a situation where there essentially _is no_ mouse...

------
mikenew
If you're a Linux user, a logical extension of this idea is to use a tiling
window manager, and then you get the paneled window management for everything,
not just your terminal.

Being able to detach and re-attach to sessions is still really useful, but I
never find myself wanting to use tmux for splitting up a terminal window when
I'm already using a tiling window manager.

~~~
rhinoceraptor
I never got into those, because I have two modes of working. When I'm writing
code, my hands are on the keyboard and I have several splits open and a vim
session. When I'm doing anything else, I like to use a mouse because it gives
me random access to windows.

------
hitpointdrew
I spend most of my day in terminals. If you are mostly just after tiling
windows then I prefer, Tilix on Linux or iTerm on Mac OS. The only time I use
tmux is if I am worried about losing my ssh connection and don't want my
process to die.

~~~
pkirk
Is your connection unstable? Then try Mosh (
[https://mosh.org/](https://mosh.org/) )

------
zepearl
Usually the title of my terminal window displays some useful informations
(e.g. the directory I'm currently in, or if I am installing some packages and
their dependencies with "emerge somepackage" then I see what I'm currently
emerging, etc...).

Does anybody know how to display the exact same informations in Tmux' bottom
green bar? I just want it to display the same stuff that I would otherwise see
in the window title of my terminal emulator.

I tried to search for it but I'm probably not using the correct terms so I
didn't find anything that is relevant to this.

~~~
mikelward
[http://man7.org/linux/man-
pages/man1/tmux.1.html#NAMES_AND_T...](http://man7.org/linux/man-
pages/man1/tmux.1.html#NAMES_AND_TITLES)

    
    
        case $TERM in
        xterm*)
            echo -e '\033]0;INSERT TITLE HERE\007';;
        screen*)
            echo -e '\033kINSERT TITLE HERE\033\\';;
        esac
    

Based on what I do, but not in front of a computer to test exactly what I
typed above.

------
monster_group
Can anybody tell me how to scroll up in a tmux session? Whether I use mouse
scroll wheel or keyboard, on scrolling up all I get is

^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A

~~~
rhinoceraptor

        set -g mouse on
    

in your ~/.tmux.conf should do the trick.

~~~
reggieband
FYI - after you do this on Mac OS you can't copy to the system clipboard from
the buffer using mouse unless you push `fn` before you click on the pane.

I think there are workarounds to get from the tmux copy buffer onto the system
clipboard but I usually just `Ctrl-b z` to zoom the pane to full-screen, hold
down `fn` button to select text, then `Ctrl-C` like normal.

~~~
mhink
IIRC, this was fixed in the last few releases- it had to do with OS X's weird
user-session/permissions management. At the very least, I was able to comment
out the following workaround:

    
    
        bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "pbcopy"
        bind-key -T copy-mode-vi C-j send-keys -X copy-pipe-and-cancel "pbcopy"
        bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "pbcopy"
        bind-key -T copy-mode-vi A send-keys -X append-pipe-and-cancel "pbcopy"

------
ghshephard
I spend about 70+% of my day in tmux. I usually have 15-16 windows (which I
work _hard_ to keep pared down), and some key windows with 6 panes (that I
have muscle memory regarding what they are precisely doing). I've got a fairly
tight 242 line .tmux.conf that I git sync between my various workstations,
with affordance for Linux/macOS/WSL to handle things like the clipboard.

In addition to just keeping all my states managed cleanly, a couple of the
many key features that I love about tmux:

o No need for a mouse - this has been a life saver in the past when I was
working on a customer site, and they had me locked down on a terminal
environment where there wasn't any mouse pass-through for things like copy
paste.

o tmux restore/resurrect are a godsend. I can do weekly kernel updates on
windows-fast ring/lose power, and get all of my sessions and scrollback
history

o A side benefit of the restore/resurrect capability, is that I can tar-ball
my session state and have all my scroll back and commands on a separate
system.

One of nice tweaks that has made a difference for me is creating new-windows
and _requiring_ they be named -

    
    
       bind-key u command-prompt -p "WinName: " "neww -n %1"
    

that Ensures all my windows have a name that makes sense.

Love tmux, though, you can go down a rabbit-hole tweaking out your .tmux.conf.

------
ohm
Is there a way to copy the whole tmux window buffer over ssh connection to a
Linux or Windows system? So far I only saw iterm2 tmux control mode supporting
this on osx. I saw lots of terminals have feature requests open for this
functionality but none of them have traction on getting this feature
implemented due to the lack of tmux control mode documentation. Terminator has
a fork release supporting it but it did work well when I tried it.

~~~
ghshephard
Tmux supports your local clients clipboard, so if you are in a tmux-session
from your local client, you can copy your scrollback history (or window), into
the clipboard, and just paste it locally. I do precisely that dozens of times
a day.

------
raviolo
One more interest feature which was not clearly described: you can attach two
or more ssh connections (belonging to the same system user) to the same tmux
session. Each displays the same thing in real time and has full control.

We use this all the time for these two use cases:

1\. Semi-permanent connections to the same tmux session on the server from
multiple locations e.g. work and home. Come home and find things exactly the
way you left them at work, and vice versa.

2\. A sort of collaborative environment. We have something like “demo” user
running tmux session, and multiple people from different remote locations
login as “demo” and attach to the same tmux session. Again, everyone has full
control and we can see each other’s actions as we also talk on the voice call
in parallel. Usually much better experience vs. some sort of screen+control
sharing solution, especially when some participants are on low-quality
connections.

------
1996
Suggestion for your bash_login or equivalent, to automatically get back your
session based on the IP you connect from (6to4 safe):

REMOTEIP=`echo $SSH_CONNECTION |sed -e 's/::ffff://g' -e 's/ .*//g'`

if [ -z "$SSH_CONNECTION" ]; then if [ "$TERM" != "tmux" ]; then tmux attach
-t $REMOTEIP || tmux new -s $REMOTEIP ; fi ; fi

I have static IPs and I like to come back to a server the way I left it the
day before, from home or work.

For pratical reasons (everything in one window), I often have tmux running
inside GNU screen, with one GNU screen per remote server.

------
grimgrin
I don't go too crazy with tmux stuff, I am a very minimal user

This is how I tend to start/restore a session:

    
    
        alias foo='tmux a -dt foo || tmux new -s foo'

------
JDiculous
I wouldn't personally say that tmux is superior to something like iTerm2, but
on WSL (Windows Subsystem for Linux) there doesn't seem to be a superior
alternative since I haven't found a decent terminal on this OS that supports
tiling.

------
sys_64738
You can also run tmux within Emacs. Start a term via <ESC>x then enter term
and press return. You can now run tmux. Use Ctrl-C Ctrl J and Ctrl-C Ctrl K to
switch between modes.

------
hpen
I have used tmux non-stop since discovering and love it

------
mehrdadn
Does tmux have anything like screen -R?

~~~
supakeen
Nothing like -R, but attaching tmux lets you swap the client between different
sessions with `<your prefix> L` for last, `s` for an interactive list or `(`,
`)` for next/previous, and some others I forget.

If you want to list sessions before attaching then there's `tmux ls` :)

------
landa
The list of benefits is missing the main one: you don't have to touch your
mouse again.

------
hhmc
tmux could really do with a 'vim-sensible' common sensible default
configuration.

Mirroring typical linux mouse copy-behaviour is perticularly painful (esp. in
a multi-pane setup).

