In GNU Screen, I can switch to any window number within a given split. For example:
screento launch it.
- Press Ctrl + a c to create a new window. Now there are two windows: window 0 and window 1. The current window is now window 1.
- Press Ctrl + a Shift + s to create a new split.
- Press Ctrl + a Tab to go to the new split.
- Press Ctrl + 0 to load window 0 in this new split.
How can we do a similar thing in Tmux? This is what I have so far:
tmuxto launch it.
- Press Ctrl + b c to create a new window. There are two windows now: window 0 and window 1. The current window is window 1.
- Press Ctrl + b " to create a new split pane. The current pane is now the new split pane.
- How can I now load the shell in window 0 into this new split pane?
Is there a way to simulate this behavior of screen in tmux?
Tmux does not support displaying the same pane in two different windows nor does it support displaying the same pane twice in the same window. You can link a whole window to a session without unlinking it from its original session. Or you can place a pane in another window but this will remove the pane from its original window.
In your example you have already created a pane that holds the place for the desired pane. In this case you can swap the two panes with
swap-pane tmux command. From
man 1 tmux:
swap-pane [-dDU] [-s src-pane] [-t dst-pane]
Swap two panes. […]
-dinstructs tmux not to change the active pane.
-sis omitted and a marked pane is present (see
select-pane -m), the marked pane is used rather than the current pane.
It’s even better: if
-t are both ommited and a marked pane is present, the marked pane and the current pane are swapped. At any given time there can be at most one marked pane within the entire tmux server.
How can I now load the shell in window 0 into this new split pane?
Navigate to the window 0 and mark the pane you want to move (in your example it’s the only pane there). You do it with RMB (if mouse is supported) or prefix m (where default prefix is Ctrl+b). Navigate back to the new pane and invoke:
The shell where you invoke
tmux swapp is not automatically destroyed, it’s now in the window 0 where the marked pane used to be. In your example it seems you don’t need this shell itself, you just need the new pane; if so, consider
tmux swapp && exit instead. Keep in mind if there is no marked pane (or if the current one is marked) then
tmux swapp will effectively do nothing. In such case
tmux swapp && exit will just exit the shell.
Alternatively, instead of creating a new split pane you can move the desired pane into the current window in one step.
join-pane [-bdhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane]
split-window, but instead of splitting
dst-paneand creating a new pane, split it and move
src-paneinto the space. […]
-sis omitted and a marked pane is present (see select-pane
-m), the marked pane is used rather than the current pane.
So instead of prefix ":
- Mark the pane you want to move.
- Split the pane you want to split:
- either with
tmux joinp -vinvoked in the shell there;
- or with prefix :
joinp -vEnter; in particular this is useful when there is no idle shell in the pane you want to split (but don’t forget to make the pane current first).
- either with
The method with prefix : can be used to invoke
swapp or any other tmux command.
Below there are few notes about manipulating panes from the outside of tmux. The examples use
tmux swapp but you can invoke
tmux joinp similarly.
swap-pane allows you to swap any two panes within a tmux server. You can run
tmux swapp even from the outside of tmux, without manually marking and changing panes, if you know how to address the two panes you want to swap. It may be:
tmux swapp -s 0:1.1 -t 0:0.0
The format is
session:window.pane, see the manual where it explains
target-pane. Note these bare numbers are “relative” (at least the
:window.pane part, I’m not sure about the
session number). The very first pane
0:0.0 after swapping with
0:1.1. On the other hand tmux sessions, windows and panes have their unique identifiers (prefixed with
% respectively). In your case the command may be like:
tmux swapp -s %2 -t %0
But note if the old pane was indeed
0:0.0 and the new one was
0:1.1 then they are now
0:0.0 respectively. The unique identifier of each pane is “attached” to the content (process) of the pane and “travels” with it. Non-prefixed identifiers of panes depend on total number of panes and their placement within the window.
You can name sessions (
rename-session) and windows (
rename-window). This makes identifying panes with
You can run more than one tmux server. Servers are identified with their socket paths (
-L option) or socket names (
-S). The default name is
default. If you invoke
tmux without these options from within tmux then it will find the right server (via the
TMUX environment variable, I think). If you invoke
tmux without these options from the outside of tmux then it will be like
tmux -S default. You may want to swap two panes that belong to a non-default tmux server, e.g.:
tmux -S other swapp -s 0:1.1 -t 0:0.0
Tmux doesn’t support swapping panes between servers. The whole point of having two servers is they are separate. If you ever need to swap panes between two semi-separate entities of tmux, these entities should be sessions within a single tmux server. You can swap panes between different sessions.
If you really need to “hijack” a process running under another tmux server, use
reptyr. The tool is totally independent from tmux.