tmux
ScreenUtility보다 좋다고 들어서... 일단 한 화면 내에서 다시 창을 분할할 수 있다니 솔깃하다. (screen의 경우는 공식 버전에는 없고 패치만 있다는 듯) 그러나 역시 터미널 프로그램들은 사용법 처음 읽히려면 으으...
-
- 1. 설치 시 문제
-
- 2. 튜토리알
-
-
- 2.1. 기본 사용법
-
- 2.2. 참조한 문서들
-
3. .tmux.conf 설정
-
- 4. 좌충우돌 사용기
-
-
- 4.1. 256컬러
-
- 4.2. vim solarized 테마
-
- 4.3. vim용 신택스 파일과 예제 conf 파일들
-
- 4.4. 윈도우 이름 자동 변경
-
- 4.5. 서로 다른 세션 만들기, 세션 이름 붙이기
-
- 4.6. 한 유저계정에서 서로 다른 설정을 따르는 tmux 세션 만들기
-
- 4.7. 플러그인
-
- 4.8. 시스템 재부팅할 때 세션 복원
-
- 4.9. pane분할 또는 새 창에서 작업 디렉토리 유지
-
- 4.10. 윈도우를 다른 세션으로 넘기거나 링크하기
-
5. 기타
-
-
- 5.1. 세션이 있는데도 attach 가 안 될 때
-
- 5.2. 인덱스 10 이상의 윈도우로 한 번에 점프하기
-
6. Comments
-
1. 설치 시 문제
컴파일 도중에 특정 상수의 정의를 못 찾는다고 에러가 나더라.
control.c:103: error: ‘EVBUFFER_EOL_LF’ undeclared (first use in this function)
이건 의존성이 걸려 있는 libevent 의 버전이 낮아서 생긴 문제. yum 으로 설치한 게 1.4.13 이었는데 [이 글]을 보니 1.4.14나 2.0이 필요하다고 함. 그래서 libevent 를 따로 다운받아 컴파일,설치하여야 했음.
게다가 기존 1.4.13을 지우지 않았더만 링킹 과정에서 그게 먼저 적용되었는지 다음과 같은 형태의 에러가 줄줄이 났고
undefined reference to `bufferevent_write'
1.4.13을 지우고 나서 시도하니 컴파일이 거의 다 잘 되었는데 막판에
undefined reference to `__b64_ntop'
이 에러가 났는데, [이 글]을 참고해서 Makefile
의 LIBS
변수의 값에다가 -lresolv
를 넣어주니 해결되었음.
2. 튜토리알
screen과 비슷하게, tmux를 실행하면 하나의 session이 되고, session 안에서 여러 개의 window를 생성할 수 있고, 각 window를 또 여러 pane으로 분할해서 사용할 수 있다.
prefix
에 해당하는 키는 C-b
인데, 이건 vi의 스크롤과 충동하기도 하고 누르기도 불편하여 screen과 같이 C-a
로 설정함
시작과 종료
- tmux, tmux new -s 세션이름 : 세션 생성
- prefix d : 세션 detach
- tmux ls : 세션 목록 출력
- tmux attach -t 세션이름 : 세션 reattach
도움말
- prefix ? : 현재 바인드되어 있는 키 목록 열람
윈도우
- prefix c : 윈도우 생성
- prefix 0~9 : 해당 번호 윈도우로 이동
- prefix n, prefix p : 다음 윈도우, 이전 윈도우로 이동
- prefix l : 직전 사용하던 윈도우로 이동
- prefix w : 윈도우 리스트를 띄우고 선택
- prefix , : 윈도우 이름 바꾸기
pane
- prefix % : 좌우로 나누기
- prefix " : 상하로 나누기
- prefix q : pane 번호를 표시하고 번호를 눌러서 이동
- prefix o : pane을 순서대로 이동
- prefix 방향키 : 해당 방향으로 이동
- prefix Alt-방향키 : 해당 방향으로 크기 조절
- prefix Alt-1~5 : 몇 가지 미리 설정된 레이아웃을 고를 수 있고, prefix space로 이 레이아웃을 순서대로 돌아가며 선택 가능
카피 모드
- prefix [ : 카피 모드 진입
- prefix PgUp : 카피 모드 진입과 동시에 한 페이지 위로 스크롤
기초 사용법을 읽어볼 만한 것들을 뒤져봐서 찾은 것들. 이 페이지의 내용 중 많은 부분은 아래 글들의 내용을 주인장이 테스트하며 적었음.
3. .tmux.conf 설정
bind r source-file ~/.tmux.conf \; display "Reloaded!"
set -g prefix C-a
unbind C-b
bind C-a send-prefix
set-option -g visual-bell on
bind | split-window -h -c "#{pane_current_path}"
bind \ split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"
bind a last-window
bind C-p rotate-window
bind C-o select-pane -t :.+
set-window-option -g monitor-activity on
set-window-option -g monitor-silence 0
bind S set-window-option monitor-silence 30
bind M-s set-window-option monitor-silence 0
set-option -g base-index 1
set-window-option -g pane-base-index 1
bind-key -n C-S-Left swap-window -t -1
bind-key -n C-S-Right swap-window -t +1
set-option -g status-bg blue
set-option -g status-fg white
set-option -g status-attr default
set-window-option -g window-status-fg white
set-window-option -g window-status-bg default
set-window-option -g window-status-attr dim
set-window-option -g window-status-current-fg white
set-window-option -g window-status-current-bg red
set-window-option -g window-status-current-attr bold
set-option -g pane-border-fg colour235
set-option -g pane-active-border-fg colour240
set-option -g message-bg colour235
set-option -g message-fg colour166
set-option -g display-panes-active-colour colour33
set-option -g display-panes-colour colour166
set-window-option -g clock-mode-colour colour64
setw -g mode-mouse off
set -g mouse-select-pane off
set -g mouse-resize-pane off
set -g mouse-select-window off
set-option -g renumber-windows on
set -g @tpm_plugins ' \
tmux-plugins/tpm \
tmux-plugins/tmux-resurrect \
'
run-shell '~/.tmux/plugins/tpm/tpm'
- tmux 는
:source-file
명령으로 실행 도중에 설정 파일을 읽어서 적용시킬 수 있는데, 이게 또 매번 입력해주기 귀찮으니 prefix r을 누르면 되도록 함
- prefix를 C-b에서 C-a로 바꾸는 건 set과 unbind 두 줄만 있으면 되는데, 세번째 줄은 뭐냐하면 C-a를 두 번 연속으로 누르면 터미널에 C-a가 전달되도록 하는 것이다. 예를 들어 쉘에서는 C-a를 누르면 커서가 현재 라인의 제일 앞으로 이동하는데 이걸 tmux가 가로채어 버리니까 이렇게 추가로 전달방법을 만들어줌
- 상태바 설정이 정말 screen에 비하면 훨씬 알아보기 편하다. 이런 모습으로 꾸미기 위해서 .screenrc에는
hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "
라고 적어줬어야 했다.
- mouse로 pane을 선택하거나, pane경계를 클릭해서 크기를 조절할 수 있긴 한데, 이걸 켜니까 마우스로 터미널 내용을 긁어서 복사하는 게 동작하질 않아서, 좋은 해결책을 발견할 때까지는 일단 포기
- 윈도우들의 순서를 바꾸고 싶을 때는
swap-window
나 move-window
명령을 쓰면 되는데 그게 귀찮으니까 현재 윈도우를 왼쪽 또는 오른쪽 윈도우와 위치를 스왑하는 단축키를 Ctrl+Shift+왼쪽(또는 오른쪽)커서키
로 지정해줌. -n
옵션을 주면 prefix를 누르지 않고 바로 쓸 수 있다. ([출처])
4. 좌충우돌 사용기
실행할 때 tmux -2
라고 해야 256컬러 지원이 됨
(그냥 실행했을 때)
(-2 옵션을 주었을 때)
4.2. vim solarized 테마
이 놈의 컬러테마 하나 맘에 든다고 골랐다가 두고두고 귀찮게 군다.
[PuTTY]와 [vim]에 solarized 컬러 테마가 적용된 상태에서, tmux를 띄우고 vim을 실행하면 이게 또 색상이 요상하게 나온다. 눈치로 보면 색상 가짓수가 몇 개 안 되어 그런 듯하다. -2
옵션을 주어도 마찬가지.
(색상이 제대로 적용되지 않은 모습)
[vim-colors-solarized breaks inside tmux]의 마지막 답변글을 보아하니, tmux를 실행하는 시점의 TERM
변수의 값이 xterm
이었는데 이 상태에서는 8컬러까지만 지원하는 걸로 tmux가 인식하나보다. TERM변수의 값을 xterm-16color
로 설정하고 실행하니까 제대로 되었다. (오히려 -2
옵션이 없어도 되더라)
나는 아예 alias를 써서 tmux를 실행하면 TERM=xterm-16color tmux -2
를 실행하도록 하였음.
(제대로 적용된 모습)
4.3. vim용 신택스 파일과 예제 conf 파일들
tmux 소스 파일의 압축을 풀면 examples 디렉토리 안에 몇 가지 샘플 파일들이 있다. *.conf 파일들은 설정파일 예제들인데, tmux -f 파일명
으로 해당 파일을 로드해서 실행할 수 있으나, 이 설정 파일의 내용을 보면 자기 멋대로 여러 개의 창을 만들고 어떤 창에서는 mutt를 실행하는 등의 동작을 하도록 되어 있으니 주의.
그리고 설정 파일을 VimEditor로 편집할 때 신택스 하일라이트를 적용할 수 있다. tmux.vim 파일의 주석에 적힌 설명 참조.
4.4. 윈도우 이름 자동 변경
tmux를 실행하면 기본적으로 각 윈도우의 이름은 현재 포어그라운드에서 실행 중인 프로세스의 이름이 반영된다. 그런데 prefix ,
또는 :rename-window
로 이름을 지정하면 그 이름으로 고정되어 버리는데, 이걸 다시 원래대로 자동으로 프로세스 이름이 반영되게 하고 싶으면 다음처럼 automatic-rename 옵션을 켜주면 됨. (이 옵션이 원래 켜져 있다가 이름을 수동으로 바꾸면 저절로 꺼지는 식이다)
:set-window-option automatic-rename on
4.5. 서로 다른 세션 만들기, 세션 이름 붙이기
한 세션에 윈도우 십 수개씩 띄워놓으니 이것도 정신 사납다. 세션을 여러 개 만들어서 각각 서버 프로그램 띄워두는 용도, 자잘한 작업하는 용도 등으로 구분하자.
위에 기본 사용법에도 적었지만, 세션을 만들 때 이름을 따로 주고
tmux new -s SERVICE
나중에 원하는 세션에 붙어서 작업
tmux attach -t SERVICE
세션 이름을 처음에 짓지 않았다면 나중에 prefix :
명령 모드 들어가서 rename-session
4.6. 한 유저계정에서 서로 다른 설정을 따르는 tmux 세션 만들기
예를 들어 어떤 서버에 web 이라는 계정이 있고, 여러 사람이 각자 그 계정으로 접속해서 작업하는데, 각자 자신이 선호하는 설정의 tmux 세션을 띄우고 싶다고 하자. 그런데 하나의 계정이기 때문에, 기본 상태에서는 제일 처음 tmux를 실행한 사람의 설정을 그대로 따라가서 두번째 사람부터는 -f
옵션을 써도 안 통한다. reload하면 다른 사람들까지 전부 바뀌어버린다.
이런 경우는 -L socket-name
옵션을 써서 별개의 tmux 서버를 띄워 자신만의 독립적인 환경을 만들 수 있다.
tmux -L mysocket -f myconfig_file new-session
: 새 세션 만드는 경우
위 세션에 붙어 작업하고 싶다면 마찬가지로 -L
옵션을 쓴다.
tmux -L mysocket attach
잘은 모르겠는데 1.9 부터는 외부 플러그인을 가져와서 더 편한 기능을 덧붙여 쓸 수 있나보다. 게다가 그 플러그인들을 관리하는 툴도 또 따로 나왔다.
다른 플러그인은 모르겠고, 나중에 시스템 재부팅 등을 했을 때 tmux 세션과 윈도우 구성을 되살려주는 플러그인이 있더라.
4.8. 시스템 재부팅할 때 세션 복원
바로 위에서 말했듯이, 이런 플러그인이 있더라. 간단히 써보면 일단 윈도 구성까지는 잘 살려주는데, 실행 중이던 프로그램까지 복원해주는 건 다시 좀 복잡하게 설정해야 하는 것 같음
4.9. pane분할 또는 새 창에서 작업 디렉토리 유지
처음 tmux를 실행하고 인상적이었던 건 새 윈도우를 열 때나 pane을 가로, 세로로 분할했을 때, screen은 처음에 screen을 실행한 디렉토리에서 셸이 뜨지만 tmux는 현재 작업하던 디렉토리가 유지되는 것이었다.
그런데 1.9a를 설치하니까 그게 적용이 되지 않아서 살펴보니, 예전에는 default-path
설정이 있어서 그 값이 있다면 그 값을 새 창의 작업 디렉토리로 지정하고, 그 값이 없으면 현재 작업 디렉토리를 그대로 사용하게 했었나봄. 이제는 pane 분할 또는 새 창 생성 시에 -c path
옵션이 있고, #{pane_current_path}
와 같은 미리 정의된 변수가 몇 가지 있어서 그것을 경로명 자리에 대신 줄 수도 있다.
.conf 파일에 이걸 넣어서 기존과 같이 동작하도록 함.
4.10. 윈도우를 다른 세션으로 넘기거나 링크하기
이쪽 세션에서 작업하던 윈도우를 다른 세션으로 넘기고 싶으면
move-window -s chat:irc -t other_session
(세션:창 순으로 ID나 이름)
다른 세션에서 링크를 걸어 두 세션 모두에서 쓸 수 있게 하려면
link-window -s ... -t ...
5.1. 세션이 있는데도 attach 가 안 될 때
어느날 갑자기, ps 로 살펴보면 tmux 프로세스가 여전히 떠 있는데도 attach 를 시도하면 "no sessions"라고만 나오더라.
여기 답글에 있는 것처럼 killall -10 tmux
후 재시도하니 성공
5.2. 인덱스 10 이상의 윈도우로 한 번에 점프하기
prefix 0~9
로 이동하는 것은 인덱스 10 이상의 윈도우에는 쓸 수 없다.
6. Comments
컴퓨터분류