컨텐츠 바로가기

[OS X, Ubuntu] 터미널에서 tmux 사용해 보기

http://mcchae.egloos.com/11246020

이제 2017년 새해가 밝았습니다.
우선 제 블로그를 찾아주시는 모든 분들께 인사드립니다.
"새해 복 많이 받으십시오"



2007년 11월 20일 최초 발표를 하였고 최신 안정판도 몇달 전에 발표되는 등 
유닉스 터미널 프로그램 치고는 상당히 최신의 따끈 따끈한 프로그램이라고 할 수 있겠습니다.

많은 곳에서 screen 대비 좋은 장점을 가지고 있다고 하는데 
실제로 사용해 보니 screen 보다 좋네요.

특히 2.1 버전 이후 부터는 마우스를 지원하기 때문에 창(pane)을 분할해 놓고
창을 선택, 크기 조종, 이전 결과를 스크롤 하는 등의 마우스 지원이 아주 잘 되었습니다.

우선 설치는 무척 간편합니다.

우분투 16.04 LTS 에서는

 $ sudo apt-get install tmux

라고 하고,

macOS 에서는

$ brew install tmux

라고 하면 잘 설치가 됩니다.

우분투는 2.1 버전이, 맥에서는 2.3 버전이 설치되었는데
큰 차이는 없습니다.

설치를 마치고, 자신의 홈 디렉터리에 .tmux.conf 라는 파일에


$ cat ~/.tmux.conf
set-option -g mouse on
set-option -g history-limit 10000

라고 한 줄을 넣고 시스템을 Reboot 하면 (시스템을 다시 시작하여야 마우스가 먹었습니다)
마우스 지원을 잘 했습니다. (위의 설정은 버전 2.1 부터 적용됩니다. 가능하면 그 이후 버전을 사용하십시오)

(참고로 두번째 줄은 디폴트로 스크롤을 하면 디폴트로 1480 라인 정도만 가지고 있는데 
이를 10,000줄로 늘리는 옵션입니다.)

우선 터미널에서

$ tmux 
로 실행하고 나서

창 분할을 시작 합니다.

우선 tmux 에서는 모든 명령이 Ctrl+b 입니다.
(Screeen의 Ctrl+a 와 같은 의미의 명령어 Prefix 입니다)

Ctrl+b "
라고 명령을 내리면 창이 가로로 나뉘고

Ctrl+b %
라고 명령을 내리면 창이 세로로 분할 됩니다.

이 상태는

위와 같이 창이 나뉘어 졌음을 알 수 있습니다.

만약 이 상태에서 

Ctrl+b d
라고 하면 tmux 가 종료되는 것 처럼 보이지만 실제로는 
이전 상태를 유지하고 계속 실행되고 있이며

이를 동일 터미널 또는 다른 터미널에서

$ tmux attach

라고 하여 이전 실행되던 곳으로 돌아갈 수 있습니다.

이때 재미있는 것은 현재 돌아가고 있는 터미널은 그대로 있는 상태에서
다른 사용자가 다른 서버에서 터미널로 들어와서 attach 시키면
동일 창이 동시에 여러 곳에 보일 수 있습니다.

마치 협업을 하는 것처럼 작업을 동시에 보고 작업할 수 있게 됩니다.
(주의. 두 터미널이 동일 가로X세로 크기를 가져야 합니다.)

마우스가 지원되면 창(pane)을 선택하면 해당 창으로 이동하게 되며
창과 창 사이를 드래그 하여 창 크리를 조종할 수 있습니다.

Ctrl+b q 
라는 명령을 내리면,

위와 같이 창의 번호가 나오며 나뉘어진 것을 확인 할 수 있습니다.

만약 마우스 지원이 어렵다면 

Ctrl+b 화살표키
를 이용하여 창을 이동할 수 있습니다.

터미널 창이라 이전 작업 결과를 스크롤을 해서 확인 가능한데,
마우스로는 윌 또는 트랙패드는 두손가락 업다운 재스쳐로 
이전 버퍼링 되어있는 터미널 결과를 각 창(pane) 마다 해 볼 수 있는데
만약 키로 해야한다면

Ctrl+b PgUp
Ctrl+b PgDn
키로 스크롤이 가능합니다.
키로 스크롤을 했을 때는 q 로 끝내줘야 스크롤 모드가 끝납니다.


또한 

Ctrl+b c
라고 하여 현재 작업하던 창 말고 새로운 창(window)을 새롭게 만들어 작업할 수도 있습니다.

종료는 
Ctrl+d
로 종료 됩니다.

tmux 디폴트 명령어로 이전 작업했던 window와 Pane 나누기 크기 등등을 저장했다가
다시 복원하면 좋겠는데, 디폴트 기능은 아니고 다른 참조할 만한 것이 있으나
여기까지 적용하지는 않았습니다.

또한 마우스로 드래그하여 복사한 것을 paste 하는 키는

Ctrl+b ]

입니다. 우분투나 맥 어디서든 잘 되었습니다.

특별히, 맥에서는 마우스로 Drag를 하면 하면 선택되는 것처럼 보이며 이것은
tmux Copy & Paste 모드가 되어 일반 선택처럼 맥의 클립보드에 복사되지 않습니다.
기존 처럼 복사하기 위해서는 "Option(Alt)" 키를 누르고 마우스 Drag를 한 다음
"Command+c" 로 맥의 복사를 하셔야 됩니다.

하지만 창을 Pane으로 나누었을 경우, 위와 같은 선택 방법은 어렵습니다.
그냥 간단히 iTerm2 App 을 이용하고, 
설정에서

위에서와 같이 Preferences > General > Selection 에서
"Applications in terminal may access clipboard" 를 체크하시고 
마우스에서 선택하면 자동으로 맥의 클립보드로 저장됩니다.


그리고 한가지 다른 팁.
처음 터미널을 크게 띄우고 나서 tmux 를 구동시키고나서는
가로 세로 창을 나누어 4개로 나누어 작업을 시작하고는 하는데,
동일한 작업을 반복하게 되어 조금 알아보았더니,

.bashrc 또는 .bash_profile 에 다음과 같이 tm 이라는 alias 를 걸어놓고
터미널에서 tm 명령을 내렸더니 간편하게 시작할 수 있었습니다.

alias tmb='tmux new-session -d && tmux split-window -h && tmux split-window -v && tmux select-pane -L && tmux split-window -v && tmux select-pane -U && tmux attach-session -d'

alias tms='tmux new-session -d && tmux split-window -v && tmux split-window -v && tmux select-pane -U && tmux select-pane -U && tmux split-window -v && tmux select-pane -U && tmux attach-session -d'

그러면 tmb 명령은 2x2의 박스로 표현되고,
tms 명령은 4줄의 창으로 표현됩니다.


암튼 최근 알게된 tmux를 이용하여 screen 명령보다 더 편하게 작업할 수 있을 것 같습니다.

2017년 첫 포스팅 이었습니다.

필요한 부분이 있어 추가분입니다.

OS X 에서 PS1에 컬러로 나오게 하려면,

$ vi ~/.bash_profile
# for terminal ls color
export PS1="\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "
export CLICOLOR=1
export LSCOLORS=ExFxBxDxCxegedabagacad
alias ls='ls -GFh'

라고 추가시킵니다.

그러면 tmux로 창을 나누어도 잘 나왔습니다.

이제 우분투에서 접속해서 해 보았는데,
tmux로 나눈창은 프람프트(prompt PS1) 이 칼라로 나오지 않는 것이었습니다.

이 경우에는 디폴트 ~/.bashrc에서
#force_color_prompt=yes
부분을
force_color_prompt=yes
로 풀어 주면 팡을 나누어도 컬러로 프람프트가 잘 보였습니다.


이전에 작업하던 것에 대한 작업 내용을 덧 붙입니다.

만약 창을 나누어 작업을 열심히 하고 있었는데 이를 놔두고 그냥 벗어나려면 (detach)

Ctrl+b, d

라고 명령을 내리면 됩니다.

그 다음 다시 attach 하려는데 여러개의 tmux 세션이 있을 수 있으므로
세션을 보기 위하여,

$ tmux ls
0: 1 windows (created Mon Aug 14 14:03:10 2017) [200x54] (attached)
1: 1 windows (created Mon Aug 14 16:38:48 2017) [200x54]

와 같이 결과가 나옵니다.

한개의 세션만 존재한다면 다른 누가 attached 되어 있건간에 상관없이

$ tmux attach
라고 명령을 내려 이전 세션을 그대로 복원할 수 있습니다.

만약 위와 같이 한 개 이상의 세션이 있었다면

$ tmux attach -t 1
과 같이 명령을 내려 해당 세션으로 붙일 수 있습니다.

만약 다른 사용자가 이미 attach 되어 있었을 수가 있습니다.
그런 경우 작은 화면 크기로 맞추어져 있고 큰 쪽에서는 ... 으로 보입니다.

필요에 따라 다른 사람이 attach 되어 있는 것을 끊고 자기가 attach 하려면,

$ tmux a -dt 1

과 같이 명령하면 됩니다.

...

TMUX를 잘 사용하고 있다가 또다른 요구사항이 생겼습니다.
현재 창을 가로 또는 세로로 분할을 하는데 무조건 처음에 들어왔던
디렉터리로 가게 됩니다. 이를 현재 폴더를 그대로 유지하면서 창을 나누려고 합니다.

그러려면, 

$ cat vi ~/.tmux.conf
set-option -g mouse on
set-option -g history-limit 10000
bind \ split-window -h -c '#{pane_current_path}'  # Split panes horizontal
bind - split-window -v -c '#{pane_current_path}'  # Split panes vertically

위에 처럼 마지막 두 줄을 추가해 줍니다.

그러면, 창을 나눌 때,

Control+b " 뿐만 아니라 Control+b - 키로 동일 폴더를 유지하면서 가로 나누기,
Control+b % 뿐만 아니라 Control+b \ 키로 동일 폴더를 유지하면서 세로 나누기가 됩니다.

Copy Paste 등은 별도 tmux 것을 이용할 수 있습니다.
마우스로 보통 긁어서 사용하고는 했는데 어떤 경우에는 그것이 먹지 않습니다.
(원격 접속 리눅스 등에서)
이런 경우에는 다음 내용을 ~/.tmux.conf 에 넣어주고 사용합니다.

# 1) prefix [ : enter copy mode
# 2) use cursor keys to move to the start copy position
# 3) v : to start copy
# 4) y : copy to the buffer
# 5) r : toggle rectangle mode
# 6) prefix P : paste from buffer
set-window-option -g mode-keys vi
bind P paste-buffer
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-selection
bind-key -T copy-mode-vi r send-keys -X rectangle-toggle

또, 참고로 한 터미널에서 tmux를 이용하고 있는데 그 안에서 다른 여러 호스트에 들어가 있고,
그 안에서 tmux 를 띄웠는데 창을 나누려고 하면 같은 키 바인딩 때문에 나중에 실행한 tmux 가 아니라
그 이전 tmux 가 나뉘어지는 현상이 있습니다.
이럴 때에는 prefix인 Control+b 를 다른 것으로 바꾸면 해결되는데,

위의 .tmux.conf 파일에서
# remap prefix from 'C-b' to 'C-a'
unbind C-b
set-option -g prefix C-a
bind-key C-a send-prefix

라는 것을 추가해 주면 됩니다.

기존에 동작하고 있던 tmux 세션에는 적용이 안되는데,

$ tmux source-file ~/.tmux.conf

라고 해 주면 적용됩니다.

결국, 샘플로,

$ cat vi ~/.tmux.conf
# remap prefix from 'C-b' to 'C-f'
unbind C-b
set-option -g prefix C-f
bind-key C-f send-prefix

set-option -g mouse on
set-option -g history-limit 10000
bind \ split-window -h -c '#{pane_current_path}'  # Split panes horizontal
bind - split-window -v -c '#{pane_current_path}'  # Split panes vertically

# 1) prefix [ : enter copy mode
# 2) use cursor keys to move to the start copy position
# 3) v : to start copy
# 4) y : copy to the buffer
# 5) r : toggle rectangle mode
# 6) prefix P : paste from buffer
set-window-option -g mode-keys vi
bind P paste-buffer
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-selection
bind-key -T copy-mode-vi r send-keys -X rectangle-toggle


어느분께는 도움이 되셨기를...


덧글|덧글 쓰기|신고