Search

tmux

Created
2021/04/07 09:33

Subjects

현재 이용 중인 ~/.tmux.conf는 아래와 같다.
set -g prefix C-Space unbind C-b bind C-Space send-prefix setw -g mode-keys vi set -g mouse on set -g default-terminal "xterm-256color" set -g history-limit 100000 set -g focus-events on set -g status off #bind -n M-Left select-pane -L #bind -n M-Right select-pane -R #bind -n M-Up select-pane -U #bind -n M-Down select-pane -D bind -n S-Left resize-pane -L bind -n S-Right resize-pane -R bind -n S-Up resize-pane -U bind -n S-Down resize-pane -D # Smart pane switching with awareness of Vim splits. # See: https://github.com/christoomey/vim-tmux-navigator is_vim="ps -o state= -o comm= -t '#{pane_tty}' \ | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'" bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h' 'select-pane -L' bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j' 'select-pane -D' bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k' 'select-pane -U' bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l' 'select-pane -R' tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")' if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \ "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\' 'select-pane -l'" if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \ "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\' 'select-pane -l'" bind-key -T copy-mode-vi 'C-h' select-pane -L bind-key -T copy-mode-vi 'C-j' select-pane -D bind-key -T copy-mode-vi 'C-k' select-pane -U bind-key -T copy-mode-vi 'C-l' select-pane -R bind-key -T copy-mode-vi 'C-\' select-pane -l
Shell
복사

1. tmux

tmuxTerminal Multiplexer이다. iTerm2에서의 화면 분할 기능을 잘 이용하고 있는데도 tmux를 찾게된 이유는 2가지이다.
첫 째는 Terminal을 종료하더라도 컴퓨터를 종료하지만 않으면 기존 작업을 그대로 복원할 수 있다는 것이었다. 이는 로컬 환경 뿐 아니라 ssh와 함께하면 원격 환경에서도 좋겠다는 생각이 많이 들었다. 원격에 접속 중인 서버와 연결이 끊기더라도 서버가 종료되지만 않는다면 기존 작업을 그대로 이어서 할 수 있으니 말이다.
둘 째는 tmux 내에서의 화면 분할이 훨씬 더 보기 편했고, 분할된 화면들을 위의 상위 개념이 하나 더 있다는 점이었다. 그리고 이 모든 분할들이 모두 tmux 위에서 동작하여 위의 이점을 그대로 누릴 수 있다는 것이었다.
Terminal 위에서의 코딩을 조금 더 많이 이용하고 싶어서 더 편리한 환경을 만들어 나가는 중이었고, Visual Studio Code를 대신하기 위해 이것저것 찾아보던 중 좋은 걸 찾아내지 않았나 싶다.
tmux를 설치하고 이용하기 전에 용어에 대해서 먼저 잡고 가겠다. Terminal의 화면들이 분할 되는 단위를 Pane이라고 하고, 한 화면에서 보이는 Pane들의 전환 단위는 Window이다. 이 Window들은 하나의 Session에 종속된다.
tmux를 이용하면서 여러 Session을 둘 수 있고 이 중에 하나의 Session으로 작업을 하고 있다고 해보면, 한 Session 내에는 여러 Window가 있어서 프로세스간 ALT + Tab 혹은 CMD + Tab으로 전환하듯 Window를 전환할 수 있고, Window에는 분활된 Pane들이 여럿 존재할 수 있다는 것이다. 이 모든 것이 한 Terminal에서 일어날 수 있다.

2. tmux 설치

tmuxbrew를 통해 편리하게 설치할 수 있다.
brew install tmux
만일 위 명령어로 tmux가 설치되지 않는다면, tmux에 요구되는 의존성들을 직접 설치 후 위 명령어를 다시 시도해보자. tmuxlibeventncurses에 의존성이 있다. 두 의존성은 아래 명령어를 통해 설치할 수 있다.
brew install libevent brew install ncurses
brew를 통해 install을 마치고, zsh에서 brew_cask 관련 오류가 난다면 아래 명령어를 통해 brew를 정리해보자.
brew cleanup

3. tmux 단축키 prefix

tmux에서의 단축키는 공통적으로 prefix를 통해 이뤄진다. 여기서 말하는 prefix<C-b>이고 이는 Ctrl + b를 의미한다. 단축키를 이용하는 방식에 대해서 안 익숙한 사람들이 많을텐데, <C-b> + $Key라는 말은 Ctrlb$Key를 동시에 누르는 것이 아니라, 순차적으로 <C-b>를 먼저 처리 후에 $Key를 누르면 된다. (Ctrl + b를 먼저 눌렀다 뗀 후, $Key를 누르면 된다.)
다음 Chapter에서 Session, Window, Pane에 대한 명령어와 단축키를 알아보자.

4. Session

1) Session 생성

tmux의 시작은 Session을 생성하는데 있다. 아래 명령어를 통해 Session을 생성할 수 있다.
tmux
명령어가 처리되면 기존을 Terminal 위에 Session을 나타내는 한 줄이 생긴다. Session의 이름을 지정하지 않은 채로 생성했기 때문에 기본 네이밍은 index로 처리된다.

2) Session Detach

생성된 Session을 이용하다가 tmux 밖으로 나가는 행위를 Detach라고 한다. Detach를 수행하면, 생성된 Session은 백그라운드에 남아있는 상태로 유지된다.
tmux detach
Detach 행위는 명령어로만 처리할 수 있는 것이 아니라, 단축키로도 처리할 수 있다.
prefix + d

3) Session 목록 보기

tmuxSession을 이용하고 있든 하고 있지 않든, 현재 생성되어 있는 Session의 목록을 보기 위해선 아래 명령어를 이용한다.
tmux ls

4) Session Attach

tmuxSession 밖으로 나가는 것을 Detach라고 했는데, 이와 반대로 생성된 Session을 재개하는 것을 Attach라고 한다.
가장 최근에 DetachSessionAttach를 하기 위해서 아래 명령어를 이용한다.
tmux attach
생성해둔 Session이 여럿 있고, 그 중 하나를 직접 골라 Attach하기 위해선 아래 명렁어를 이용한다. 이를 확인하기 위해 Session을 2개 정도 더 만들어두었다.
tmux attach -t

5) Session 전환

위에서 이용했던 것처럼 여러 Session들을 두었다고 했을 때, Session간 전환을 위해 일일이 DetachAttach를 수행하면 꽤나 귀찮을 것이다. tmux로 유지 중인 Sessiontmux ls를 통해 확인 후 아래 명령어를 이용하면 Session을 전환할 수 있다.
tmux switch -t
위처럼 Session 목록 확인 명령어와 Session 전환 명령어를 이용하지 않고 단축키만을 통해서도 가능하다. 아래처럼 단축키를 이용하면 생성된 Session들을 확인하여 Session을 골라서 전환할 수 있다.
prefix + s
위에서 사용했던 첫 번째 Session을 그대로 이용하다가 Session 전환 단축키를 누르게 되면 목록이 나오는 것을 확인할 수 있는데, 목록 중에서 하나를 선택하여 <enter>를 누르면 Session이 전환되는 것을 확인할 수 있다.
위처럼 명령어를 통해서 Session을 전환하거나 Session 목록에서 골라 전환하는 것 말고도, 이전 Session 전환과 다음 Session 전환이 가능하다.
현재 0번째 Session에서 작업 중이었다가 아래의 단축키를 입력하게 되면, 이전 Session2번째 Session으로 전환되는 것을 볼 수 있다.
prefix + (
반대로 다음 Session으로의 전환은 아래의 단축키를 통해서 수행할 수 있다.
prefix + )
Session 간 전환을 많이하며 작업을 하는 경우에는 이전에 작업하던 Session으로 바로 이동하고 싶은 경우도 있을 것이다. 이 경우에는 아래 단축키를 통해 빠르게 이전 작업 Session으로 전환이 가능하다.
prefix + L

6) Session 종료

Session 종료에는 단일 Session 종료를 의미하는 Session Kill과 모든 Session 종료를 의미하는 Server Kill 두 종류가 있다. Session 종료는 Detach와는 다르게 말 그대로 Session이 끝나기 때문에 작업 복구가 어려우므로 신중히 사용해야 한다.
단일 Session 종료
tmux kill-session -t
모든 Session 종료
tmux kill-server

5. Window

tmux를 이용하기 위해 Session을 생성하면 기본적으로 하나의 Window가 생성되어 이를 이용하게 된다. 같은 Session에 작업 별로 Window를 두는 식으로 이용하기 위해, 하나의 Session에 여러 Window를 추가하여 이용할 수 있다. Window에 대한 제어는 명령어보다는 일반적으로 prefix를 이용한다.

1) Window 생성

위 그림을 보면 Session을 처음으로 생성하게 되면 1개의 Window와 1개의 Pane이 생성되어 있는 것을 확인할 수 있다. 아래 단축키를 통해 Window를 추가할 수 있다.
prefix + c

2) Window 목록 보기

prefix + sSession 목록을 확인했을 때는 Session에 해당하는 Window들이 접혀 있어 일일이 방향키로 열어야 Window들을 확인할 수 있었다. 아래 단축키를 이용하면 Session에 해당하는 Window들을 모두 펼친 상태로 목록을 확인할 수 있다.
prefix + w

3) Window 전환

단축키를 통해서 여러 Window가 생성되어 있을 때, Window를 전환할 수 있는 방법은 2가지가 있다. 하나는 생성된 Windowindex를 이용하는 것이고, 나머지 하나는 이전 indexWindow와 다음 indexWindow로 전환하는 것이다.
위 그림처럼 3개의 Window가 생성되어 있고 현재 열어둔 Windowindex2일 때, index0Window로 이동하고 싶다면 아래 단축키를 이용하면 바로 Window 전환이 된다.
prefix + index
현재 열어두고 있는 Windowindex0이므로 아래 명령어를 통해서 이전 indexWindow로 옮겨 갈 수 있다.
prefix + p
이전 indexWindow로 옮겨온 상태에서 다시 아래 단축키를 이용하면 다음 indexWindow로 넘어가면서 원래 보고 있던 Window로 돌아올 수 있다.
prefix + n
Session과 마찬가지로, 동일 Session 내에 여러 Window로 전환하며 작업한 경우에는 이전에 작업하던 Window로의 전환이 필요할 수 있다. 이 때 아래 단축키를 이용하면 편리하게 이전 작업 Window로 전환할 수 있다.
prefix + l

4) Window 종료

열어둔 Window의 종료는 아래 단축키를 통해 수행할 수 있다. 단축키를 입력하고 나면 바로 Window가 종료되는 것이 아니라, 종료에 대한 확인을 하기 때문에 y 또는 n으로 응답하면 된다. y를 입력하면 현재 이용중이던 Window가 최종적으로 종료된다.
prefix + &

6. Pane

Session을 생성하게 되면 기본적으로 하나의 Window가 생성되었던 것처럼, Window를 생성하게 되면 기본적으로 하나의 Pane이 생성된다. 같은 Session에 작업 별로 Window를 두는 식으로 Window를 생성했던 것처럼, 하나의 작업을 위한 Window에서도 화면을 분할하여 여러 Pane으로 작업을 진행할 수 있다. Pane에 대한 제어 역시 명령어보다는 일반적으로 prefix를 이용한다.

1) Pane 분할

Pane 생성은 곧 Window의 화면 분할을 의미한다. Terminal 혹은 Vim 환경이 익숙하다면 화면 분할의 개념이 그렇게 어렵지 않을 것이다. Pane 분할은 수평 분할수직 분할이 있다.
2번째 Session에는 현재 1개의 Window가 있고, 0으로 표기된 indexWindow에는 1개의 Pane이 존재하는 것을 볼 수 있다. 아래의 단축키를 통해서 현재 이용하고 있는 Window수직 분할하여 Pane을 늘릴 수 있다.
prefix + %
분할에 대해선 현재 Window의 현재 이용하고 있는 Pane을 대상으로 한다. 따라서 위와 같은 상태에서 수평 분할을 하게 되면 현재 이용하고 있는 Pane에서 수평 분할이 일어난다. 아래 단축키를 이용해보면 예상한 결과가 나오는 것을 확인할 수 있다.
prefix + "
수직 분할수평 분할을 통해서 1개의 Pane을 3개의 Pane으로 만들었다. 2번째 Session0Window에는 1개의 Pane이 존재했었던 이전과 달리 현재 tmux의 상태를 보면 3개의 Pane을 유지 중인 것을 확인할 수 있다.

2) Pane 전환

여러 개의 Session 또는 Window를 유지하고 있을 때는 목록을 통해서 보는 것이 아니면 한 화면에서 모두 보는 것이 불가능하기 때문에 각 요소의 전환을 위해서 index를 이용했었다. Pane의 경우에는 동일 Window에 속해 있기만 한다면 한 화면에서 분할된 모든 Pane을 볼 수 있기 때문에 이를 손쉽게 전환하고 제어할 수 있다. 방향키로 원하는 방향의 Pane에 접근하는 것도 가능하고, 각 Pane 마다도 index가 매겨져 있기 때문에 다음 Pane으로의 전환도 가능하다. Window의 전환과는 달리 Pane의 경우 한 화면 내에서 빈번한 전환이 일어날 가능성이 매우 높으므로 이전에 작업하던 Pane으로의 전환도 가능하다. 혹은 작업 중인 Pane이 새로운 작업 범주가 된다면 이를 새로운 Window로 빼내는 것도 가능하다.
현재 작업 중인 Pane을 기준으로 다양한 방향의 Pane으로 전환은 아래 단축키를 통해서 수행할 수 있다.
prefix + 방향키
다음 index에 해당하는 Pane으로의 전환도 가능한데, 우선은 현재 Pane들의 index를 확인하는 방법부터 알아보자. indexPane이 생성된 순서대로 붙게된다.
prefix + q
현재는 0번에 해당하는 Pane에 위치하고 있으므로, 아래 단축키를 이용하면 1번에 해당하는 Pane으로 전환된 것을 확인할 수 있다.
prefix + o
0번에 해당하는 Pane에서 1번에 해당하는 Pane으로 전환했기 때문에, 이전에 작업하던 Paneindex0이다. 아래 단축키를 이용하면 이전에 작업하던 0Pane으로 바로 전환되는 것을 확인할 수 있다.
prefix + ;
만일 위 그림과 같이 Pane에서 작업을 하던 도중에 현재 Pane을 새로운 Window로 분류해내고 싶다면 아래 단축키를 이용하면 된다.
prefix + !

3) Pane Rotation

다른 Pane으로의 전환 외에 Pane을 반시계 방향으로 위치를 밀거나 시계 방향으로 밀어내는 것이 가능하다.
위 그림과 같이 Window 상에서 작업을 하고 있다고 해보자. 아래 명령어를 이용하면 모든 Pane이 반시계 방향으로 돌아가는 것을 확인할 수 있다.
prefix + <C-o>
시계 방향으로의 전환은 아래 단축키로 수행할 수 있다. (<C-b>라는 prefix로는 단축키 충돌이 있기 때문에 다음 Chapter에서 prefix를 다른 키로 변경 후에 이용할 수 있다.)
prefix + <A-o>
모든 Pane들을 Exchange하지 않고, 단일 Pane과의 Exchange도 가능하다. 아래 단축키를 이용하면 이전 indexPane과 현재 indexPaneExchange한다.
prefix + {
반대로 현재 indexPane과 다음 index에 해당하는 PaneExchange 할 수도 있다.
prefix + }

4) Pane 크기 변경

Pane의 크기도 변경하여 작업 중인 Pane을 조금 더 늘려서 보거나 줄여서 보는 것이 가능하다. 방향키를 통해서 자유롭게 제어가 가능하며, Pixel 단위로 조정하게 된다.
아래 명령어를 이용하면 1 Pixel 단위로 크기 조정이 가능하다. (<C-b>라는 prefix로는 단축키 충돌이 있기 때문에 다음 Chapter에서 prefix를 다른 키로 변경 후에 이용할 수 있다.)
prefix + <C-방향키>
현재 Pane들이 위와 같이 있을 때, 아래 명령어를 이용하면 5 Pixel 단위로 크기 조정이 가능하다. 이 때 여러 번 크기 조정을 하고 싶다면 ALT 키를 누른 상태로 방향키를 누르면 된다.
prefix + <A-방향키>

5) Pane 레이아웃

작업 중이던 Window에서 여러 차례의 수직 분할과 수평 분할을 하고 나면, 레이아웃이 상당히 지저분하거나 원하지 않는 형태의 레이아웃이 되어 있을 수 있다. 아래 단축키를 이용하면 이를 재배치하는 것이 가능하다.
prefix + Space
여러 차례 시도해보면, 다양한 레이아웃으로 정리되는 것을 확인할 수 있다.

6) Pane 종료

현재 이용 중인 Pane의 종료는 아래 단축키를 통해 수행할 수 있는데, 단축키를 입력하면 바로 종료되는 것이 아니라 Window 종료와 마찬가지로 종료에 대한 확인을 거친다. y 또는 n으로 응답하며 y를 입력하면 현재 이용중이던 Pane이 최종적으로 종료된다.
prefix + x

5. Customization

현재 이용 중인 Mac OS X외에도 다양한 플랫폼에서 Session, Window, Pane 관련 단축키 이용에 있어서 다양한 다른 단축키와 충돌이 생겨 원활한 이용이 불가능한 경우가 여럿 있을 것이다. 플랫폼마다 tmux 이용에 최적인 prefix 키가 있겠지만, 이번 Chapter에서는 Mac OS X 기준으로 최대한 충돌이 없는 prefix를 설정해볼 것이다.

1) prefix

기존의 prefix 키는 <C-b>이지만, Mac OS X에서 tmux를 이용하는 많은 사용자들은 <C-Space> 혹은 <C-a>prefix를 이용한다. prefix와 같은 것들은 tmux의 설정이기 때문에 tmuxconfig 파일을 건드려주면 된다. tmuxconfig 파일은 홈 디렉토리에 위치하고 있으며 .tmux.conf 라는 이름을 갖고 있다. 혹시 별도의 설정을 하지 않아 홈 디렉토리.tmux.conf가 존재하지 않는다면, 따로 생성하여 설정 값 기록 후 저장하면 된다.
<C-a>prefix로 이용하고 싶다면 아래 주어진 스크립트에서 C-Space에 해당하는 구문들을 모두 C-a로 바꿔서 기록하면 된다. 여기서는 <C-Space>prefix로 이용하는 방법을 다룬다.
기본적으로 Mac OS X에서는 <C-Space>를 입력 소스에 대한 설정으로 되어 있기 때문에 이를 꺼줘야한다. 아래 그림처럼 System PreferencesKeyboard 항목에서 Shortcuts 탭의 Select the previous input source를 해제해줘야 한다. 이후에 주어진 스크립트를 홈 디렉토리.tmux.conf에 기록하면 <C-Space>prefix로 이용할 수 있다.
# prefix 키를 <C-Space>로 변경 set -g prefix C-Space # 기존 prefix 바인딩을 해제하고, <C-Space>라는 터미널 입력 키를 prefix로 바인딩 unbind C-b bind C-Space send-prefix
Shell
복사

2) mode-keys

prefix를 이용한 단축키는 모드 별 동작이 정의되어 있는 상태로 이용된다. 별도의 mode 설정을 하지 않으면 tmux의 기본 설정은 emacs로 동작하도록 되어 있다. 만일 vim을 사용하는 경우에는 vim 상의 단축키의 원활한 활용을 위해서 mode를 바꾸는 것이 필요하다. 아래 구문을 홈 디렉토리.tmux.conf에 추가하면 된다.
setw -g mode-keys vi
Shell
복사

3) cursor

tmux 이용을 하다보면 초기 vim과 같이 마우스 이용이 불가능한 것을 문득 깨달을 수 있다. 아래 구문을 홈 디렉토리.tmux.conf에 추가하여 마우스를 이용할 수 있도록 하면 된다.
set -g mouse on
Shell
복사

4) color

tmux 상에서의 명령어 입력 혹은 vim에서 이용하던 색상이 제대로 출력이 안 되는 경우도 있다. 아래 구문을 홈 디렉토리.tmux.conf에 추가하면 이를 해결할 수 있다.
set -g default-terminal "xterm-256color"
Shell
복사
위 구문으로 해결이 안 되는 경우에는 아래 구문을 이용해보자.
set - g default-terminal "screen-256color"
Shell
복사

5) history

tmuxhistory 크기 기본 값은 1000라인이다. 이를 더 늘리도록 설정하려면 아래 구문을 홈 디렉토리.tmux.conf에 추가하면 된다.
set -g history-limit 100000
Shell
복사

6) binding

tmux의 모든 단축키는 기본적으로 prefix를 입력 후에 이용하도록 되어 있다. 자주 이용하는 단축키에 대해서는 prefix를 매번 입력하는 것이 정말 불편할 수 있다. prefix를 이용하지 않고 단축키를 이용하기 위해선 별도의 binding이 필요하다. 몇 가지 설정을 해볼 것인데 아래에 주어진 구문들은 홈 디렉토리.tmux.conf에 추가하면 된다.
# prefix 키 없이 <A-방향키>만으로 Pane 전환 bind -n M-Left select-pane -L bind -n M-Right select-pane -R bind -n M-Up select-pane -U bind -n M-Down select-pane -D # prefix 키 없이 <S-방향키>만으로 Pane 크기 변경 bind -n S-Left resize-pane -L bind -n S-Right resize-pane -R bind -n S-Up resize-pane -U bind -n S-Down resize-pane -D
Shell
복사

6. Naming

이전 Chapter들에서 SessionWindow를 다룰 때 별도의 이름 설정을 하지 않고 이용을 했다. 따라서 첨부된 그림들을 자세히 살펴보면 모든 이름들이 index로 붙어있는 것을 확인할 수 있다. 가볍게 이용하고자 한다면 index로 이름이 붙은 상태로 이용을 해도 무방하겠지만, 특정 형태의 범주로 분류하고 이를 헷갈리지 않게 이용하고 싶다면 Session 혹은 Window에 별도의 이름을 붙이는 단축키들이 존재한다.
Session의 이름 변경은 아래 단축키로 수행할 수 있다.
prefix + $
Window의 이름 변경은 아래 단축키로 수행할 수 있다.
prefix + ,
tmux에는 여기서 제시한 것보다 훨씬 더 많은 명령어와 단축키들이 존재한다. 따라서 Naming까지 활용하여 tmux를 이용할 수 있다면 더 많은 명령어와 단축키를 찾아서 사용해보길 바란다. 이름을 정말 유용하게 이용할 수 있을 것이다. 온라인의 매뉴얼을 통해서 확인할 수도 있겠지만 (마지막 단축키로...) 아래 단축키를 통해서도 확인할 수 있다.
prefix + ?

7. Reference