짜증

tmux copy-mode에서 로그를 위로 올려 y로 복사하면, 복사 직후 라이브 뷰(맨 밑)로 돌아가 버린다. 연속으로 몇 군데 복사하려고 하면 매번 다시 스크롤해야 한다.

고친 뒤

동작
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 전까지 값이 유지된다.

기본값을 off로 두고 싶다면

set -g @copy-stay "off"

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