tmux 안에서만 OSC 52 복사가 안 될 때 — set-clipboard external

tmux 밖에서는 되는 OSC 52 클립보드 복사가 tmux 안에서만 무음 실패한다. tmux 3.4+ 기본값 set-clipboard external 이 안쪽 앱의 OSC 52 를 호스트 터미널로 전파하지 않기 때문이다.

tmux 안에서 CLI 도구가 “클립보드에 복사했습니다”라고 말하는데 Windows 쪽에서 Ctrl+V 를 누르면 아무것도 안 나온다. 에러도 없다. 그냥 조용히 실패한다.

같은 명령을 tmux 밖의 평범한 WSL 셸에서 실행하면 잘 된다면, 범인은 도구가 아니라 tmux 다.

환경은 Ubuntu on WSL2, tmux 3.6a, Windows Terminal 이었다.

증상 정리

  • tmux 안에서 Claude Code OAuth 화면의 c(copy URL)를 눌러도 Windows 클립보드가 비어 있다.

  • tmux 안에서 OSC 52 를 직접 쏴도 변화가 없다.

    printf '\033]52;c;%s\a' "$(echo -n test | base64)"
  • tmux 밖에서 같은 명령을 실행하면 클립보드가 정상 갱신된다.

  • ~/.tmux.conf 의 copy-mode 키바인딩이 pbcopy 를 쓰고 있다면 그것도 조용히 실패한다. 이건 별개 문제다 — WSL 에는 pbcopy 가 없다.

마지막 항목 때문에 원인을 두 번 찾게 된다. pbcopy 를 고쳐도 OSC 52 는 여전히 막혀 있다.

원인 — external 은 받기만 한다

set-clipboard 옵션에는 값이 셋 있다.

동작
off OSC 52 를 완전히 무시
external tmux 가 받기만 한다. 호스트 터미널이 보낸 OSC 52 는 tmux 버퍼에 저장하지만, 안쪽 앱이 보낸 OSC 52 는 호스트 터미널로 전파하지 않는다
on 양방향. 안쪽 앱의 OSC 52 를 호스트 터미널로 포워딩하면서 tmux 버퍼에도 저장

tmux 3.4 부터 기본값이 external 이다. 이름만 보면 “외부와 주고받는다”처럼 읽히는데 실제로는 한 방향만 열려 있다. 그래서 안쪽 앱이 보낸 OSC 52 가 tmux 에서 멈추고 Windows Terminal 까지 도달하지 못한다.

확인은 한 줄이면 된다.

$ tmux show -s set-clipboard
set-clipboard external   # ← 원인

해결

~/.tmux.conf 에 추가한다.

set -s set-clipboard on

지금 떠 있는 세션에 바로 반영하려면:

tmux set -s set-clipboard on
tmux source-file ~/.tmux.conf

검증:

$ tmux show -s set-clipboard
set-clipboard on

종단간 테스트는 아까 그 명령을 다시 쓴다.

printf '\033]52;c;%s\a' "$(echo -n 'osc52-test-1234' | base64)"
# Windows 어디서든 Ctrl+V → osc52-test-1234

덤으로 따라오는 것

on 으로 바꾸면 tmux copy-mode 의 copy-selection / copy-pipe 액션도 OSC 52 로 호스트 터미널 클립보드에 직접 쏜다. 외부 명령에 의존하던 키바인딩이 외부 명령 없이 동작한다는 뜻이다.

이게 macOS / Linux / WSL 공용 tmux 설정을 쓸 때 꽤 크다. 보통은 이런 식으로 OS 를 분기한다.

# 플랫폼마다 다른 명령을 물려야 했던 예전 방식
bind -T copy-mode-vi y send -X copy-pipe-and-cancel "pbcopy"        # macOS
bind -T copy-mode-vi y send -X copy-pipe-and-cancel "xclip -sel c"  # Linux
bind -T copy-mode-vi y send -X copy-pipe-and-cancel "clip.exe"      # WSL

set-clipboard on 이면 copy-selection-and-cancel 하나로 세 환경이 다 커버된다. 클립보드를 채우는 주체가 tmux 가 아니라 호스트 터미널 에뮬레이터로 넘어가기 때문이다.

기존 pbcopy 호출을 남겨둬도 겉보기에는 동작한다. WSL 에서 pbcopy 는 무음 실패하지만 OSC 52 경로가 클립보드를 채워주기 때문이다. 정리하고 싶다면 지워도 되고, 다른 기기와 설정을 공유 중이라면 그냥 둬도 손해는 없다.

이 문제가 아닌 경우

복사는 되는데 한글만 깨진다면 OSC 52 문제가 아니다. OSC 52 는 내용을 base64 로 실어 나르므로 코드페이지의 영향을 받지 않는다. 그건 clip.exe 가 stdin 을 CP949 로 해석해서 생기는 별개 증상이고, WSL2 → Windows 클립보드 한글 깨짐에 따로 적었다.

증상으로 갈라보면 이렇다. 아무것도 안 붙여넣어지면 set-clipboard, 깨진 글자가 붙여넣어지면 인코딩.