짜증

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 값에 따라 분기복사함
Entercopy-mode 종료, 라이브 뷰로복사함
q / Escapecopy-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"

한 줄만 바꾸면 된다. 토글 키는 그대로 동작.