|
######################################## |
|
# common.conf — 공통 설정 (inner/base 공유) |
|
# |
|
# 2-layer tmux 구조에서 양쪽 레이어가 공유하는 설정. |
|
# inner(tmux.conf)와 outer(tmux_base.conf) 모두 |
|
# source-file로 이 파일을 먼저 로드한다. |
|
# |
|
# prefix, reload, status-left, status-bg/fg 등 |
|
# 레이어별로 달라야 하는 설정은 각 파일에서 별도로 정의한다. |
|
######################################## |
|
|
|
|
|
######################################## |
|
# General |
|
######################################## |
|
|
|
# 창 이름 자동 변경 끄기 — 수동으로 이름 지정한 것을 유지 |
|
setw -g automatic-rename off |
|
|
|
# copy-mode에서 vi 키바인딩 사용 |
|
setw -g mode-keys vi |
|
|
|
# 스크롤백 버퍼 크기 (줄 수) |
|
set -g history-limit 10000 |
|
|
|
# ESC 키 지연 제거 — 2-layer 구조에서 키 입력 지연 최소화에 필수 |
|
# 기본값 500ms → 0ms로 설정하여 vim 등에서 ESC 반응 즉시 |
|
set -sg escape-time 0 |
|
|
|
# 포커스 이벤트를 터미널에서 tmux로 전달 |
|
# inner tmux가 포커스 변경을 감지할 수 있도록 outer에서도 필요 |
|
set -g focus-events on |
|
|
|
# 터미널 타입 — tmux-256color로 통일 (screen-256color, xterm-256color 대신) |
|
# tmux의 기능(italics 등)을 온전히 지원하는 terminfo |
|
set -g default-terminal "tmux-256color" |
|
|
|
# xterm 스타일 키 시퀀스 활성화 (Shift/Ctrl+화살표 등) |
|
set -g xterm-keys on |
|
|
|
# alternate screen 비활성화 — less/man 종료 후 출력이 터미널에 남도록 |
|
# smcup(alternate screen 진입), rmcup(복귀)를 무효화 |
|
set -g terminal-overrides 'xterm*:smcup@:rmcup@' |
|
|
|
|
|
######################################## |
|
# Clipboard (OSC52) |
|
######################################## |
|
|
|
# tmux 버퍼에 텍스트가 설정될 때마다 OSC52 이스케이프 시퀀스로 |
|
# 시스템 클립보드에 복사. SSH 원격 환경에서도 로컬 클립보드로 전달 가능. |
|
# copy-osc52.sh 스크립트가 ~/.local/bin/ 에 있어야 동작. |
|
# after-set-buffer: copy-mode 복사, load-buffer 등으로 버퍼가 변경될 때 트리거 |
|
set-hook -g after-set-buffer 'run-shell "tmux show-buffer | ~/.local/bin/copy-osc52.sh"' |
|
|
|
|
|
######################################## |
|
# MOUSE |
|
######################################## |
|
|
|
# prefix + m 으로 마우스 모드 토글 |
|
# 마우스 ON: pane 선택, 스크롤, 리사이즈 가능 |
|
# 마우스 OFF: 터미널 네이티브 선택/복사 사용 가능 |
|
unbind m |
|
bind-key m if-shell 'tmux showw -gv mouse|grep on' \ |
|
'set -g mouse off' \ |
|
'set -g mouse on' \ |
|
; |
|
|
|
|
|
######################################## |
|
# VI Copy-mode |
|
######################################## |
|
|
|
# v: 비주얼 선택 시작 (vim의 v와 동일) |
|
bind -T copy-mode-vi v send -X begin-selection \; |
|
|
|
# y: 선택 영역이 있으면 복사, 없으면 yy(줄 복사) 대기 모드로 전환 |
|
# - 선택 중: 선택 영역을 버퍼에 복사 → OSC52 hook으로 클립보드 전달 |
|
# - 미선택: copy-await 테이블로 전환하여 다음 키 대기 |
|
bind -T copy-mode-vi y if -F "#{selection_active}" \ |
|
{ send -X copy-selection; } \ |
|
{ send -X begin-selection; switch-client -T copy-await } |
|
|
|
# yy: 현재 줄 전체 복사 (vim의 yy와 동일한 동작) |
|
# copy-await 테이블에서 y를 다시 누르면: |
|
# 1. 현재 줄 선택 → 2. 짧은 대기(선택 반영) → 3. 복사 → 4. copy-mode-vi로 복귀 |
|
bind -T copy-await y { \ |
|
send -X select-line ; \ |
|
run "sleep 0.3" ; \ |
|
send -X copy-selection ; \ |
|
display-message 'Line Copied' ; \ |
|
switch-client -T copy-mode-vi ; \ |
|
} |
|
|
|
# Escape: copy-mode 종료 (vim 사용자에게 자연스러운 키) |
|
bind -T copy-mode-vi Escape send -X cancel |
|
|
|
|
|
######################################## |
|
# PANE |
|
######################################## |
|
|
|
# prefix + s: 모든 pane에 동일한 입력을 보내는 synchronize-panes 토글 |
|
# 여러 서버에 동시에 같은 명령을 실행할 때 유용 |
|
bind-key s set-window-option synchronize-panes |
|
|
|
# prefix + h/j/k/l: vim 스타일 pane 이동 |
|
# h=왼쪽, j=아래, k=위, l=오른쪽 |
|
bind-key h selectp -L |
|
bind-key j selectp -D |
|
bind-key k selectp -U |
|
bind-key l selectp -R |
|
|
|
# prefix + H/J/K/L (대문자): vim 스타일 pane 리사이즈 |
|
# -r: 반복 가능 (repeat-time 내에 prefix 없이 연속 입력) |
|
bind-key -r H resize-pane -L 2 |
|
bind-key -r J resize-pane -D 2 |
|
bind-key -r K resize-pane -U 2 |
|
bind-key -r L resize-pane -R 2 |
|
|
|
|
|
######################################## |
|
# Windows |
|
######################################## |
|
|
|
# prefix + Space: 다음 윈도우 |
|
# prefix + BSpace(백스페이스): 이전 윈도우 |
|
bind-key Space next |
|
bind-key BSpace prev |
|
|
|
# 새 윈도우/분할 시 현재 pane의 디렉토리를 유지 |
|
# 기본 동작은 홈 디렉토리에서 시작하므로 override |
|
bind '"' split-window -c "#{pane_current_path}" # 수평 분할 |
|
bind % split-window -h -c "#{pane_current_path}" # 수직 분할 |
|
bind c new-window -c "#{pane_current_path}" # 새 윈도우 |
|
|
|
|
|
######################################## |
|
# Other Binding |
|
######################################## |
|
|
|
# prefix + A: 현재 윈도우 이름 변경 프롬프트 |
|
bind-key A command-prompt "rename-window '%%'" |
|
|
|
|
|
######################################## |
|
# STATUS BAR (공통 부분) |
|
######################################## |
|
|
|
# 상태줄 구분자 — 초록색 대괄호로 각 섹션을 감싸는 데코레이션 |
|
# @B1 = '[', @B2 = ']' (초록색) |
|
# status-left, status-right 등에서 #{@B1}...#{@B2} 패턴으로 사용 |
|
set -g @B1 '#[default]#[fg=green][#[default]' |
|
set -g @B2 '#[default]#[fg=green]]#[default]' |
|
|
|
# 비활성 윈도우: 시안색 인덱스 + 흰색 이름 |
|
set-window-option -g window-status-format '#[fg=cyan]#I#[fg=blue]:#[fg=white]#W#[dim]#F' |
|
|
|
# 활성 윈도우: 파란 배경 + 볼드체로 강조 |
|
set-window-option -g window-status-current-format '#[bg=blue,bold]#[fg=cyan]#I#[fg=blue]:#[fg=white]#W#[dim]#F' |
|
|
|
# 우측: [현재 경로(~치환)] [pane 타이틀] [날짜 시간] |
|
# #{s|#{HOME}|~|:pane_current_path} — tmux 내장 포맷 치환 (3.1+) |
|
# 외부 셸 프로세스(sed) 없이 $HOME을 ~로 변환 |
|
set -g status-right-length 120 |
|
set -g status-right '[#{s|#{HOME}|~|:pane_current_path}]#{@B1}#T#{@B2}#{@B1}#[fg=blue]%Y-%m-%d #[default]%H:%M#{@B2}' |