짜증
tmux copy-mode에서 로그를 위로 올려 y로 복사하면, 복사 직후 라이브 뷰(맨 밑)로 돌아가 버린다. 연속으로 몇 군데 복사하려고 하면 매번 다시 스크롤해야 한다.
환경: tmux 3.x 이상 필요. 이 글에 쓰인
if-shell -F,@사용자 옵션,copy-pipe-no-clear가 모두 3.x에 추가됐다.tmux -V로 확인.
고친 뒤
| 키 | 동작 |
|---|---|
y | 복사만, 스크롤 위치 유지 |
Enter | 복사 후 맨 밑으로 (기존 동작) |
| 마우스 드래그 | 복사만, 스크롤 위치 유지 |
Prefix + Ctrl-y | 위 동작 ON/OFF 토글 |
기본값 ON. 가끔 “복사 후 맨 밑으로"가 필요하면 토글하거나 그냥 Enter를 쓰면 된다.
설정
~/.tmux.conf 의 copy-mode 섹션:
setw -g mode-keys vi
# 복사 후 copy-mode 유지 토글 (기본 ON)
set -g @copy-stay "on"
# Prefix + Ctrl-y 로 ON/OFF
bind C-y if-shell -F '#{==:#{@copy-stay},on}' \
'set -g @copy-stay "off" ; display "copy-stay: OFF (y: 맨 밑으로)"' \
'set -g @copy-stay "on" ; display "copy-stay: ON (y: 스크롤 유지)"'
bind-key -T copy-mode-vi v send-keys -X begin-selection
# y: 스크롤 유지 / 맨 밑으로 분기
bind-key -T copy-mode-vi y if-shell -F '#{==:#{@copy-stay},on}' \
'send-keys -X copy-pipe-no-clear "pbcopy"' \
'send-keys -X copy-pipe-and-cancel "pbcopy"'
# Enter는 항상 기존 동작
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "pbcopy"
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-no-clear "pbcopy"
리눅스면 pbcopy 자리를 xclip -selection clipboard로 바꾸면 된다.
적용
tmux source-file ~/.tmux.conf
또는 tmux 안에서 Prefix + r.
어떻게 되는 건지
필수는 아니지만 알아두면 좋은 부분.
@copy-stay는 tmux의 사용자 옵션. 이름이@로 시작하면 사용자 저장소로 쓴다.if-shell -F '#{==:A,B}'는 A와 B가 같으면 첫 번째 명령, 다르면 두 번째 명령을 실행한다.-F덕분에 외부 셸을 안 쓰고 tmux format만으로 분기가 끝난다.copy-pipe-no-clear— 복사하고 copy-mode 유지 (연속 복사용)copy-pipe-and-cancel— 복사하고 copy-mode 종료 (라이브 뷰로 복귀)set -g로 지정한 옵션은 서버 전역. 세션을 여러 개 띄워도 한 번만 토글하면 전체 반영되고,tmux kill-server전까지 값이 유지된다.
copy-mode 종료 키 동작 차이
같은 copy-mode를 빠져나가는데도 키마다 동작이 다르다.
| 키 | 동작 | 클립보드 |
|---|---|---|
y | @copy-stay 값에 따라 분기 | 복사함 |
Enter | copy-mode 종료, 라이브 뷰로 | 복사함 |
q / Escape | copy-mode 종료, 라이브 뷰로 | 복사 안 함 |
"y 누르고 안 복사된 줄 알았는데 q로 빠져나갔다” 같은 사고가 가끔 있다. 종료 전에 복사가 끝났는지를 한 번 확인하는 습관이 안전하다.
일반 패턴 — @사용자 옵션 + if-shell 토글
이 글에서 쓴 토글 구조는 사실 이 한 케이스에 한정된 트릭이 아니다. @옵션에 상태를 저장하고 if-shell -F로 분기하는 패턴은 tmux 안에서 재사용 가능한 토글을 만드는 일반 기법이다.
응용 한 가지 예시 — 상태바에 시각 표시 ON/OFF 토글:
set -g @show-clock "off"
bind C-t if-shell -F '#{==:#{@show-clock},on}' \
'set -g @show-clock "off" ; set -g status-right ""' \
'set -g @show-clock "on" ; set -g status-right "%H:%M"'
@*로 시작하는 옵션은 tmux가 해석하지 않고 그대로 보관만 하므로, 이름은 자유다. 외부 스크립트 없이 tmux 설정 파일 한 곳에서 상태 + 분기 + 알림을 모두 처리할 수 있다는 게 이 패턴의 가치.
기본값을 off로 두고 싶다면
set -g @copy-stay "off"
한 줄만 바꾸면 된다. 토글 키는 그대로 동작.