Terminal and Terminator
It was long time ago when I realized that the major part of my work is being done in the Linux terminal. This is why I pay attention to things like shell and GNU tools, because knowing them well is often more than a half of job done.
Afterwards, I found out that having just one terminal window is not enough. Even though having many windows (represented by tabs in Linux terminal-handling tools or by many Putty instances) can solve this problem, it is often desired to keep things in sight at the same time. For example, we may want to execute some code or tests and at the same time watch over log files by using tail.
Terminator seemed to me the right tool to do the job. It's easy to install and it does exactly what it's supposed to do - it can split terminal windows both horizontally and vertically, according to user's requirements. It also allows to keep multiple tabs opened in case splitting one window is not enough. Its important disadvantage is that Terminator is a GUI tool, so it won't work if an X server is not at hand.
Terminator in action:
Of course, there is also the screen tool, but it has always been somehow mysterious to me. I was using it to run tasks in the background and to avoid problems caused by losing connection with remote machine. But I've never been brave enough to give screen the charge over my terminal windows and panes. I was pleased with Terminator, but then I found tmux.
Tmux lies somewhere between Terminator and screen, combining ease of use with basing on the plain terminal only. The advantages of tmux over Terminator:
Beginning With tmux
This is what a tmux session looks like:
By reading this section, you'll get to know how to use tmux to split terminal window into panes and how to use multiple windows. This will let you do 90% of your work. The first thing you should know is that Ctrl+b is the default prefix in tmux. It means that running any command requires typing in the prefix first. As you probably have guessed, this is to avoid conflicts with key combinations used in other programs run in the terminal.
Here is a list of a few basic tmux commands:
Other thing worth knowing is that scrolling is enabled by pressing Ctrl+b PgUp/PgDown. In fact, it enables the copy mode, which can also be done by pressingCtrl+b [. When in copy mode, you can use PgUp/PgDown and arrow keys to scroll through the terminal contents. To (q)uit the copy mode, simply press the q key.
Your tmux configuration file should be named .tmux.conf and stored in your home directory. This is a regular text file and it's the key to adjusting tmux. Just remember that after every modification, tmux must be refreshed to take new settings into account. This can be achieved either by restarting it or by typing in:
Let's start modifying .tmux.conf with a simple example.
Changing the Prefix
As we said before, tmux uses the prefix to distinguish between commands sent to tmux itself and programs running inside of it. As the default prefix (Ctrl+b) is pretty awkward, we'll replace it with Ctrl+a, which is both easier to use (a is located closer to Ctrl than b) and time-honored, as the screen tool has been using it since a long time. To change the prefix, we need to open the .tmux.conf file and type in:
For pane switching, Alt+arrow key combination (which is default in Terminator) worked fine for me and didn't cause any conflicts so far, so I think it will work fine in tmux, too. But it is of course a matter of taste and you can use whatever key you want. To switch panes with Alt, you can use these directives:
If you have many tmux windows opened, you might want to get notified when something happens inside other windows. Pasting this:
Highlighting Current Window Using Specified Colour
Pasting the following:
Pane Switching Using Mouse
In order to make migration from Terminator a little bit easier, you can modify tmux configuration file to allow pane switching using your mouse:
I don't know how about you, but I like to keep a few tweaks in my rc file (.bashrc in case of bash shell). However, with tmux the .bashrc file isn't read at all. After examining things a bit, I found out that tmux tries to read .bash_profile instead of .bashrc. I won't mention rules standing behind it here as they are quite complicated, I will show you a simple workaround instead. Adding this line:
Advanced Capabilities of tmux
My favourite pane layout often looks the same every time I use tmux, of course it depends on the type of work being done. For example, working on a project may require a pane with source code, second for running tests and third one for tailing logs. Setting these panes up is a perfect example of a dull task. Then it's not a surprise that in tmux it can be automated:
All we've talked about so far is limited to a one-user session. As screen allows to share session, tmux is no worse. And setting things up is not too complicated. In order to share session on the same machine, you have to explicitly give tmux the path to the Unix socket which will be used through the session lifetime:
Then you have to give other users access to the newly created file:
As expected, when a new user wants to join the session, he has to pass the socket path, so that tmux knows which session is about to be used:
Note that setting privileges to 777 is one of the dumbest things you can do, unless you fully trust your co-workers. You can also consider more sophisticated access control, SSH forwarding or give wemux a try. wemux is a set of scripts that makes sharing session easier and cleaner.
* tmux shortcuts & cheatsheet
* 使用 Screen 指令操控 UNIX/Linux 終端機的教學與範例