Difference between revisions of "Linux multi window terminal Screen and Tmux"

From Ever changing code
Jump to navigation Jump to search
(28 intermediate revisions by the same user not shown)
Line 1: Line 1:
Screen allows for multi window connection using a single ssh session. It also allows to detach from the session screen while still running a remote session.
Screen allows for multi window connection using a single ssh session. It also allows to detach from the session screen while still running a remote session.


= Install Screen =
= Screen =
  sudo apt-get install screen
  sudo apt-get install screen


== Key terms ==
== Key terms ==
* window -it's a separate window that you can switch between
* '''window''' - it's a separate window that you can switch between
* region -your terminal screen can be divided in regions where each can hold multiple windows
* '''region''' - your terminal screen can be divided in regions where each can hold multiple windows


== Useful commands and key bindings ==
== Useful commands and key bindings ==
$ screen -ls  #list detached sessions
<source>
$ screen -r    #re attach
$ screen -ls  #list detached sessions
$ screen -r    #re attach
</source>


C^a c -create new prompt
C^a tab -move to a next window
C^a | -split vertically
C^a S -split horizontly
C^a \ -kill all windows, terminate any ssh sessions and exit GNU Screen program


{| class="wikitable"
;Quick start
*<code>C^a c</code> create new prompt
*<code>C^a tab</code> move to a next window
*<code>C^a |</code> split vertically
*<code>C^a S</code> split horizontly
*<code>C^a \</code> kill all windows, terminate any ssh sessions and exit GNU Screen program
 
 
;Key bindings
{|
! Key
! Key
! Action
! Action
! Notes
! Notes
|-
|-
| Ctrl+a c
| <code>Ctrl+a c</code>
| new window
| new window
|  
|  
|-
|-
| Ctrl+a n
| <code>Ctrl+a n</code>
| next window
| next window
| I bind F12 to this
| I bind F12 to this
|-
|-
| Ctrl+a p
| <code>Ctrl+a p</code>
| previous window
| previous window
| I bind F11 to this
| I bind F11 to this
|-
|-
| Ctrl+a "
| <code>Ctrl+a "</code>
| select window from list
| select window from list
| I have window list in the status line
| I have window list in the status line
|-
|-
| Ctrl+a Ctrl+a
| <code>Ctrl+a</code>
| previous window viewed
| previous window viewed
|  
|  
Line 47: Line 53:
|  
|  
|-
|-
| Ctrl+a S
| <code>Ctrl+a S</code>
| split terminal horizontally into regions
| split terminal horizontally into regions
| Ctrl+a c to create new window there
| <code>Ctrl+a c</code> to create new window there
|-
|-
| Ctrl+a |
| <code>Ctrl+a <nowiki>|</nowiki></code>
| split terminal vertically into regions
| split terminal vertically into regions
| Requires screen >= 4.1
| Requires screen >= 4.1
|-
|-
| Ctrl+a :resize
| <code>Ctrl+a :resize</code>
| resize region
| resize region
|  
|  
|-
|-
| Ctrl+a :fit
| <code>Ctrl+a :fit</code>
| fit screen size to new terminal size
| fit screen size to new terminal size
| Ctrl+a F is the same. Do after resizing xterm
| <code>Ctrl+a F</code> is the same. Do after resizing xterm
|-
|-
| Ctrl+a :remove
| <code>Ctrl+a :remove</code>
| remove region
| remove region
| Ctrl+a X is the same
| <code>Ctrl+a X</code> is the same
|-
|-
| Ctrl+a tab
| <code>Ctrl+a tab</code>
| Move to next region
| Move to next region
|  
|  
Line 75: Line 81:
|  
|  
|-
|-
| Ctrl+a d
| <code>Ctrl+a d</code>
| detach screen from terminal
| detach screen from terminal
| Start screen with -r option to reattach
| Start screen with -r option to reattach
|-
|-
| Ctrl+a A
| <code>Ctrl+a A</code>
| set window title
| set window title
|  
|  
|-
|-
| Ctrl+a x
| <code>Ctrl+a x</code>
| lock session
| lock session
| Enter user password to unlock
| Enter user password to unlock
|-
|-
| Ctrl+a [
| <code>Ctrl+a [</code>
| enter scrollback/copy mode
| enter scrollback/copy mode
| Enter to start and end copy region. Ctrl+a ] to leave this mode
| Enter to start and end copy region. <code>Ctrl+a ]</code> to leave this mode
|-
|-
| Ctrl+a ]
| <code>Ctrl+a ]</code>
| paste buffer
| paste buffer
| Supports pasting between windows
| Supports pasting between windows
|-
|-
| Ctrl+a >
| <code>Ctrl+a ></code>
| write paste buffer to file
| write paste buffer to file
| useful for copying between screens
| useful for copying between screens
|-
|-
| Ctrl+a <
| <code>Ctrl+a <</code>
| read paste buffer from file
| read paste buffer from file
| useful for pasting between screens
| useful for pasting between screens
Line 107: Line 113:
|  
|  
|-
|-
| Ctrl+a ?
| <code>Ctrl+a ?</code>
| show key bindings/command names
| show key bindings/command names
| Note unbound commands only in man page
| Note unbound commands only in man page
|-
|-
| Ctrl+a :
| <code>Ctrl+a :</code>
| goto screen command prompt
| goto screen command prompt
| up shows last command entered
| up shows last command entered
Line 144: Line 150:


Example of a config file:
Example of a config file:
~$ cat screen-4regions.screen
<source>
layout FourScreens    #it's a new feature, makes screen aware of regions layout
~$ cat screen-4regions.screen
<span style="color: green"># Region 0</span>
layout FourScreens    #it's a new feature, makes screen aware of regions layout
screen -t mail1-queue    #creates new terminal/prompt
# Region 0
select 0                  #select window0
screen -t mail1-queue    #creates new terminal/prompt
stuff "echo Window0^M"    #echo a string between quotes, ^M translates to EOL means enter-return key
select 0                  #select window0
stuff "sshpass -p 'password' ssh -o PubkeyAuthentication=no root@example.com^M"  #ssh interactively
stuff "echo Window0^M"    #echo a string between quotes, ^M translates to EOL means enter-return key
 
stuff "sshpass -p 'password' ssh -o PubkeyAuthentication=no root@example.com^M"  #ssh interactively
split      #split horizontally
split -v  #split vertically
   
   
<span style="color: green"># Region 1</span>
split      #split horizontally
select 1
split -v  #split vertically
focus                   #get focus on a selected region
 
screen -t mail2-queue <span style="color: blue">sshpass -p 'password' ssh -o PubkeyAuthentication=no root@example.com</span>
# Region 1  
                      #create a new terminal/prompt '''-t mail2-queue''' in the focus window and
select 1
                      #executes <span style="color: blue">the command</span>
focus #get focus on a selected region
stuff "echo Window1^M"
screen -t mail2-queue sshpass -p 'password' ssh -o PubkeyAuthentication=no root@example.com
                      #create a new terminal/prompt '''-t mail2-queue''' in the focus window and
<span style="color: green"># Region 2</span>
                      #executes the command
select 2
stuff "echo Window1^M"
focus
 
screen -t mail1
# Region 2
stuff "echo Window2^M"
select 2
focus
split -v
screen -t mail1
stuff "echo Window2^M"
<span style="color: green"># Region 3</span>
 
select 3
split -v
focus
screen -t mail2
stuff "echo Window3^M"
altscreen on                                                                                     
term screen-256color                                                                             
bind ',' prev                                                                                     
bind '.' next                                                                                     
#                                                                                                 
#change the hardstatus settings to give an window list at the bottom of the                       
#screen, with the time and date and with the current window highlighted                           
hardstatus alwayslastline                                                                         
#hardstatus string '%{= kG}%-Lw%{= kW}%50> %n%f* %t%{= kG}%+Lw%< %{= kG}%-=%c:%s%{-}'             
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'
#layout save default  #makes regions saved when you re-attach a session


= Install Tmux =
# Region 3
sudo apt-get install tmux  #Linux
select 3
focus
screen -t mail2
stuff "echo Window3^M"


In Windows
altscreen on                                                                                     
# Install [https://github.com/git-for-windows/build-extra/releases Git for Windows SDK]
term screen-256color                                                                             
# run <code>/bin/pacman -S tmux</code>
bind ',' prev                                                                                     
bind '.' next                                                                                     
#                                                                                                 
#change the hardstatus settings to give an window list at the bottom of the                       
#screen, with the time and date and with the current window highlighted                           
hardstatus alwayslastline                                                                         
#hardstatus string '%{= kG}%-Lw%{= kW}%50> %n%f* %t%{= kG}%+Lw%< %{= kG}%-=%c:%s%{-}'             
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'
#layout save default  #makes regions saved when you re-attach a session
</source>


= Tmux =
== Sessions, windows, panes ==
== Sessions, windows, panes ==
*'''Session''' is a set of windows, plus a notion of which window is current.
Tmux is a so-called terminal multiplexer. Simply speaking, tmux acts as a window manager within your terminal1 and allows you to create multiple windows and panes within a single terminal window. Within one terminal window you can open multiple windows and split-views (called “panes” in tmux lingo). Each pane will contain its own, independently running terminal instance. This allows you to have multiple terminal commands and applications running visually next to each other without the need to open multiple terminal emulator windows.
*'''Window''' is a single screen covered with panes. (Once might compare it to a ‘virtual desktop’ or a ‘space’.)
 
*'''Pane''' is a rectangular part of a window that runs a specific command, e.g. a shell.
 
The server holds sessions and the windows and panes within them:
* '''session''' - is a set of windows, plus a notion of which window is current,there may be multiple sessions on a server,
* '''window(tab)''' - is a single screen covered with panes, each session may have many separate windows that you can switch between
* '''pane''' - is a rectangular part of a window that runs a specific command, e.g. a shell
 
:[[File:ClipCapIt-190810-144653.PNG]]
 
== Install Tmux ==
;Install - linux - use package manager
* <source lang="bash" inline>sudo apt-get install tmux</source>
 
;Install - Windows
* Install [https://github.com/git-for-windows/build-extra/releases Git for Windows SDK]
* <source inline>run /bin/pacman -S tmux</source>
 
;Quick Start
<source lang="bash">
/usr/bin/tmux
</source>


It’s tmux, a so-called terminal multiplexer. Simply speaking, tmux acts as a window manager within your terminal1 and allows you to create multiple windows and panes within a single terminal window. Within one terminal window you can open multiple windows and split-views (called “panes” in tmux lingo). Each pane will contain its own, independently running terminal instance. This allows you to have multiple terminal commands and applications running visually next to each other without the need to open multiple terminal emulator windows.
== Managging sessions ==
<source lang="bash">
tmux new -s database #start new session named 'database'
tmux ls              #lists all detached sessions
tmux attach -t 0    #attach to terminal 0 session
tmux rename-session -t 0 database
tmux switch        -t <session_name>
tmux kill-session  -t <session_name>
</source>


== Useful key bindings ==
;Key bindings
C^b c  -create a window aka new virtual desktop, it creates a full size window on top of your panes
*<code>C^b :new<CR></code> new session
C^b "  -split a pane horizontly
*<code>C^b $</code> name session
C^b %  -split a pane vertically
*<code>C^b (</code> previous session
C^d    -cloase a pane, also type ''exit''
*<code>C^b )</code> next session
C^b up,down,left,right arrow -move to neighbouring pane
*<code>C^b L</code> 'last' (previously used) session
C^b 0-9 -move to the window based on index
*<code>C^b s</code> choose a session from a list
C^b {} -swap panes { to left or to } right swap
C^b ,  -rename the current window
C^b d  -detach the current session
C^D D  -gives you a choice what session you wish to detach


;Screen navigation
== Key bindings ==
*<code>C^b c</code> create a window aka new virtual desktop, it creates a full size window on top of your panes
*<code>C^b "</code> split a pane horizontly
*<code>C^b %</code> split a pane vertically
*<code>C^b z</code> full screen pane resize, repeat to get back
*<code>C^d</code> close a pane, also type 'exit'
*<code>C^b Up,Down,Left,Right arrow</code> move to neighbouring pane
*<code>C^b q #index</code> display pane numbers, then press 0..9 to move to #paneIndex
*<code>C^b 0-9</code> move to the window based on index
*<code>C^b [] {}</code> swap panes '''[]''' left-right, '''{}''' up-down swap
*<code>C^b ,</code> rename the current window
*<code>C^b d</code> detach the current session
*<code>C^b D</code> gives you a choice what session you wish to detach


;Screen navigation, scroll and search
  Function                    vi              emacs
  Function                    vi              emacs
  --------                    --              -----
  --------                    --              -----
Line 230: Line 268:
  Search forward              /              C-s
  Search forward              /              C-s


;Copy/paste in the default Emacs style
== Copy-paste default mode (Emacs style) ==
C^b,[       # enter copy mode
<source>
# navigate to beginning of text, you want to select
Ctrl+b,[         # enter 'copy mode'
C^Space     # to activate highlighting
                # navigate using arrows to text you want to start coping
# move around using arrow keys to select region
Ctrl+Space       # start coping (highlighting)
Alt+w       # copy the region
                # move around using arrow keys to select region
C^b,]       # paste the selection
Ctrl+w or Alt+w # copy the region into the buffer
 
Ctrl+b,]         # paste in a possibly different Tmux pane/window
== Managging sessions ==
C^b,:show-buffer # show current buffer
C-b (    previous session
</source>
C-b )    next session
C-b L    'last' (previously used) session
C-b s    choose a session from a list
 
tmux new -s database                #creates a new session named ''database''
tmux rename-session -t 0 database
tmux switch -t session_name
tmux ls                              #lists all detached sessions
tmux attach -t 0                    #attach to terminal 0 session


= Terminator =
= Terminator =
Line 272: Line 301:
  Super+Shift+G  Ungroup all
  Super+Shift+G  Ungroup all
   
   
= [[ Windows ComEmu ]] =
= References =
= References =
*[https://www.gnu.org/software/screen/manual/screen.html User Guide] HTML one page
*[https://www.gnu.org/software/screen/manual/screen.html User Guide] HTML one page

Revision as of 16:08, 13 October 2019

Screen allows for multi window connection using a single ssh session. It also allows to detach from the session screen while still running a remote session.

Screen

sudo apt-get install screen

Key terms

  • window - it's a separate window that you can switch between
  • region - your terminal screen can be divided in regions where each can hold multiple windows

Useful commands and key bindings

$ screen -ls   #list detached sessions
$ screen -r    #re attach


Quick start
  • C^a c create new prompt
  • C^a tab move to a next window
  • C^a | split vertically
  • C^a S split horizontly
  • C^a \ kill all windows, terminate any ssh sessions and exit GNU Screen program


Key bindings
Key Action Notes
Ctrl+a c new window
Ctrl+a n next window I bind F12 to this
Ctrl+a p previous window I bind F11 to this
Ctrl+a " select window from list I have window list in the status line
Ctrl+a previous window viewed
Ctrl+a S split terminal horizontally into regions Ctrl+a c to create new window there
Ctrl+a | split terminal vertically into regions Requires screen >= 4.1
Ctrl+a :resize resize region
Ctrl+a :fit fit screen size to new terminal size Ctrl+a F is the same. Do after resizing xterm
Ctrl+a :remove remove region Ctrl+a X is the same
Ctrl+a tab Move to next region
Ctrl+a d detach screen from terminal Start screen with -r option to reattach
Ctrl+a A set window title
Ctrl+a x lock session Enter user password to unlock
Ctrl+a [ enter scrollback/copy mode Enter to start and end copy region. Ctrl+a ] to leave this mode
Ctrl+a ] paste buffer Supports pasting between windows
Ctrl+a > write paste buffer to file useful for copying between screens
Ctrl+a < read paste buffer from file useful for pasting between screens
Ctrl+a ? show key bindings/command names Note unbound commands only in man page
Ctrl+a : goto screen command prompt up shows last command entered

Scroll back - a copy mode

In GNU Screen press Ctrl + a + [ or C^a C^ESC to enter Copy Mode, then scroll PgUp/PgDown or up/down using keys j or k. Use Enter key to start and end selection coping to registry/buffer. Below are some other navigation keys:

h -    Move the cursor left by one character
j -    Move the cursor down by one line
k -    Move the cursor up by one line
l -    Move the cursor right by one character
0 -    Move to the beginning of the current line
$ -    Move to the end of the current line.
G -    Moves to the specified line
       (defaults to the end of the buffer).
C-u -  Scrolls a half page up.
C-b -  Scrolls a full page up.
C-d -  Scrolls a half page down.
C-f -  Scrolls the full page down.
PgUp / PgDown - Scrolls a page up/down

Define scrollback buffer size start screen with the following key (5000 lines in this example):

screen -h 5000

Update: You can use activate copy mode of GNU Screen also by Ctrl + Esc that might be more useful than Ctrl + a + [ shortcut (thanks to Yu-Jie Lin for this tip).

Custom configuration

By default the config is kept in ~/.screenrc file but using -c option we can pass a custom config

~$ screen -c screen-4regions.screen

Example of a config file:

~$ cat screen-4regions.screen
layout FourScreens    #it's a new feature, makes screen aware of regions layout
# Region 0
screen -t mail1-queue     #creates new terminal/prompt
select 0                  #select window0
stuff "echo Window0^M"    #echo a string between quotes, ^M translates to EOL means enter-return key
stuff "sshpass -p 'password' ssh -o PubkeyAuthentication=no root@example.com^M"  #ssh interactively
 
split      #split horizontally
split -v   #split vertically

# Region 1 
select 1
focus #get focus on a selected region
screen -t mail2-queue sshpass -p 'password' ssh -o PubkeyAuthentication=no root@example.com
                      #create a new terminal/prompt '''-t mail2-queue''' in the focus window and
                      #executes the command
stuff "echo Window1^M"

# Region 2
select 2
focus
screen -t mail1
stuff "echo Window2^M"

split -v

# Region 3
select 3
focus
screen -t mail2
stuff "echo Window3^M"

altscreen on                                                                                       
term screen-256color                                                                               
bind ',' prev                                                                                      
bind '.' next                                                                                      
#                                                                                                  
#change the hardstatus settings to give an window list at the bottom of the                        
#screen, with the time and date and with the current window highlighted                            
hardstatus alwayslastline                                                                          
#hardstatus string '%{= kG}%-Lw%{= kW}%50> %n%f* %t%{= kG}%+Lw%< %{= kG}%-=%c:%s%{-}'              
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'
#layout save default   #makes regions saved when you re-attach a session

Tmux

Sessions, windows, panes

Tmux is a so-called terminal multiplexer. Simply speaking, tmux acts as a window manager within your terminal1 and allows you to create multiple windows and panes within a single terminal window. Within one terminal window you can open multiple windows and split-views (called “panes” in tmux lingo). Each pane will contain its own, independently running terminal instance. This allows you to have multiple terminal commands and applications running visually next to each other without the need to open multiple terminal emulator windows.


The server holds sessions and the windows and panes within them:

  • session - is a set of windows, plus a notion of which window is current,there may be multiple sessions on a server,
  • window(tab) - is a single screen covered with panes, each session may have many separate windows that you can switch between
  • pane - is a rectangular part of a window that runs a specific command, e.g. a shell
ClipCapIt-190810-144653.PNG

Install Tmux

Install - linux - use package manager
  • sudo apt-get install tmux
Install - Windows
Quick Start
/usr/bin/tmux

Managging sessions

tmux new -s database #start new session named 'database'
tmux ls              #lists all detached sessions
tmux attach -t 0     #attach to terminal 0 session
tmux rename-session -t 0 database
tmux switch         -t <session_name>
tmux kill-session   -t <session_name>
Key bindings
  • C^b :new<CR> new session
  • C^b $ name session
  • C^b ( previous session
  • C^b ) next session
  • C^b L 'last' (previously used) session
  • C^b s choose a session from a list

Key bindings

  • C^b c create a window aka new virtual desktop, it creates a full size window on top of your panes
  • C^b " split a pane horizontly
  • C^b % split a pane vertically
  • C^b z full screen pane resize, repeat to get back
  • C^d close a pane, also type 'exit'
  • C^b Up,Down,Left,Right arrow move to neighbouring pane
  • C^b q #index display pane numbers, then press 0..9 to move to #paneIndex
  • C^b 0-9 move to the window based on index
  • C^b [] {} swap panes [] left-right, {} up-down swap
  • C^b , rename the current window
  • C^b d detach the current session
  • C^b D gives you a choice what session you wish to detach
Screen navigation, scroll and search
Function                     vi              emacs
--------                     --              -----
Half page down               C-d             M-Down
Half page up                 C-u             M-Up
Next page                    C-f             Page down
Previous page                C-b             Page up
Scroll down                  C-Down or C-e   C-Down
Scroll up                    C-Up or C-y     C-Up
Search again                 n               n
Search again in reverse      N               N
Search backward              ?               C-r
Search forward               /               C-s

Copy-paste default mode (Emacs style)

Ctrl+b,[         # enter 'copy mode'
                 # navigate using arrows to text you want to start coping
Ctrl+Space       # start coping (highlighting)
                 # move around using arrow keys to select region
Ctrl+w or Alt+w  # copy the region into the buffer
Ctrl+b,]         # paste in a possibly different Tmux pane/window
C^b,:show-buffer # show current buffer

Terminator

Terminator is user frendly, gui scalable terminal with layouts, multi windows, tabs and broadcast function

$ sudo apt install terminator

Useful key bindings

Alt+Arrow      Move to another terminal
C^+Shift+X     Maximise current window, press again to revert
C^+Shift+Z     Zooms the current terminal, press again to revert
C^+Shift+O     Split terminals Horizontally.
C^+Shift+E     Split terminals Vertically.
C^+Shift+Arrow Resize windows by moving parent dragbar
C^+Shift+T     Open new tab
C^+Shift+PgUp  Switch between tabs, PgDown in reverse order
C^+Shift+W     Close the current terminal.
C^+Shift+Q     Quit terminator
C^+Plus (+)    Increase  font  size. Note: this may require you to press shift, depending on your keyboard
C^+Minus(-)    Decrease font size. Note: this may require you to  press  shift
C^+Zero        Restore font size to original setting.
Super+G        Group all
Super+Shift+G  Ungroup all

Windows ComEmu

References