터미널 멀티플렉서 – tmux

여러 터미널을 동시에 사용하고 싶을 때 GNU Screen이나 tmux같은 터미널 멀티플렉서를 사용한다. 요즘은 Tmux를 주로 사용하는데 각 창의 레이아웃, 현재 디렉터리 위치 등을 저장하고 있다가 다시 호출할 때 그대로 되돌려주는 기능을 가지고 있다. 작업에 따라서 저장 기준이 되는 session은 여러 window를 가지고 있으며 각각의 윈도우는 여러 pane을 가지고 있다. pane은 하나의 쉘이다.


     +-session2--------------------------------+
    /|  +-window1-------+   +-window2-------+  |
   / |  | +------+ +--+ |   | +-----------+ |  |
*======================*|   | |pane1      | |  |
| +-session1-----------|--------------------+  |
| |  +-window1-------+ | +-window2-------+  |  |
| |  | +------+ +--+ | | | +-----------+ |  |  |
| |  | |p1    | |p2| | | | |pane1      | |  |--+
| |  | |      | |  | | | | |           | |  |
| |  | +------+ +--+ | | | +-----------+ |  |
| |  +---------------+ | +---------------+  |
| +--------------------|--------------------+
*======================*
           ||
        ---++---

Tmux에서 vim을 수행한 예
Tmux에서 vim을 수행한 예

최신 버전을 사용하기 위해 컴파일해서 설치했다.

sudo apt install libevent-dev
sudo apt install libncurses5-dev
wget https://github.com/tmux/tmux/releases/download/2.7/tmux-2.7.tar.gz
tar xvfz tmux-2.7.tar.gz
cd tmux-2.7/
./configure
make
sudo make install

Tmux Plugin Manager를 사용하여 아래 3개의 플러그인을 주로 사용하고 있다.

vim-tmux-navigator

하나의 pane에서 vim 에디터를 실행하면 여러 pane과 vim의 창들이 화면에 가득 차에 된다. 이때 Vim Tmux Navigator를 사용하면 일관되게 커서를 이동할 수 있다. 이 플러그인은 vim 플러그인으로 tmux의 설정 파일인 .tmux.conf 수정 방법도 설명한다.

tmux-open

tmux-open을 사용하면 tmux copy-mode에서 아래 명령을 수행할 수 있다.

  • o 키는 선택된 문자열을 시스템 디폴트 프로그램을 연다, OS X에서는 open 리눅스에서는 xdg-open 프로그램.
  • Ctrl-o 키는 선택된 문자열을 $EDITOR로 정의된 프로그램으로 연다.
  • Shift-s 키는 선택된 문자열을 구글로 검색

tmux-yank

tmux-yank를 사용하면 아래 명령으로 선택된 텍스트를 클립보드로 복사할 수 있다.

  • prefix-y 키는 터미널 현재 라인을 클립보드로 복사
  • prefix-Y 키는 터미널 현재 디렉터리 경로를 클립보드로 복사
  • copy-mode에서 y키는 현재 선택된 텍스트 클립보드로 복사

copy-mode에서 V 키를 사용하여 라인 블럭을 사용할 수 있는데 v 키를 사용하여 문자 블럭을 사용하고 싶다면 아래 명령을 .tmux.conf에 넣기 바란다.

# .tmux.conf
bind-key -T copy-mode-vi v send-keys -X begin-selection

그리고 클립보드로 복사한 이전 텍스트들은 prefix-= 명령을 사용하여 붙여 넣을 수 있다. tmux-yank 사용이 불편하다면 .tmux.conf를 수정하는 방법도 사용할 수 있다. 추가로 아래 플러그인들을 사용하고 있다.

set -g @tpm_plugins '             \
  tmux-plugins/tmux-sidebar       \
  tmux-plugins/tpm                \
  tmux-plugins/tmux-sensible      \
  tmux-plugins/tmux-resurrect     \
  tmux-plugins/tmux-copycat       \
  tmux-plugins/tmux-yank          \
  tmux-plugins/tmux-open          \
  tmux-plugins/tmux-continuum     \
  tmux-plugins/tmux-battery       \
  tmux-plugins/tmux-online-status \
  tmux-plugins/tmux-cpu           \
'

마무리

이 외에도 많은 Tmux 플러그인들을 찾을 수 있다. Tmux를 최신 버전으로 유지하기를 강력히 추천한다. 2.6 버전을 사용하니 세션 이동할 때 세션을 미리 볼 수 있는 창이 아래에 나타났다. 2.5 버전에서는 없었던 기능이다. 만약에 세션 만들기가 번거롭다면 tmuxinator를 사용하기 바란다. 세션 구성을 yaml 파일로 관리해주고 실행시에 tmux에게 전달하여 세션의 윈도우와 pane들을 구성한다. 설치를 위해서는 ruby의 gem 이 필요하다.

참고1: 새로 만드는 세션 이름과 이미 생성된 세션 이름의 충돌이 불편하다면 아래 스크립트를 사용하기 바란다.

https://forums.gentoo.org/viewtopic-t-836006-start-0.html

만약에 fzf를 사용하고 있다면 아래 스크립트를 사용할 수도 있다.

tm() {
  [[ -n "$TMUX" ]] && change="switch-client" || change="attach-session"
  if [ $1 ]; then
    tmux $change -t "$1" 2>/dev/null || (tmux new-session -d -s $1 && tmux $change -t "$1"); return
  fi
  session=$(tmux list-sessions -F "#{session_name}" 2>/dev/null | fzf --exit-0) &&  tmux $change -t "$session" || echo "No sessions found."
}

참고2: Tmux prefix로 백틱을 사용하고 있다. 하나의 키 입력으로 처리 가능해서 편리하다. 실제 백틱을 입력하기 위해서는 백틱을 2번 연속으로 눌러야하는 점이 불편하지만 감수하고 있다.

# tmux prefix
unbind C-b
set -g prefix `
bind ` send-prefix

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.