Skip to main content

완벽한 도구를 기다리지 마세요 — AI 시대, 나만의 OS를 만드는 법

· By Simpson Gyusup Sim · 10 min read

Claude Code에서 출력된 명령어를 복사해서 붙여넣었더니 이렇게 됩니다.

! echo
'TOSS_API_SECRET_KEY=live_sk_BX7zk...' >>
.env.toss

원래는 한 줄이어야 하는 명령어가 세 줄로 찢어졌습니다. 당연히 실행하면 에러가 납니다. 이 문제 때문에 몇 달간 삽질했습니다. 터미널 설정 문제인 줄 알았고, Ghostty 설정을 바꿔봤고, tmux 옵션을 뒤졌습니다. 결국 GitHub Issue를 파보니 이 버그는 2016년부터 존재하고, 아직도 고쳐지지 않았습니다.

기다리는 걸 그만두고, 5줄짜리 스크립트를 만들었습니다. 문제가 사라졌습니다.

이 글은 그 5줄짜리 스크립트의 이야기이자, AI 시대에 도구를 대하는 태도에 대한 이야기입니다.

세 가지 도구가 만들어낸 완벽한 버그

이 문제는 단일 도구의 버그가 아닙니다. 세 가지 도구가 겹치면서 발생합니다.

첫 번째, Claude Code의 하드 래핑. Claude Code CLI는 터미널 폭에 맞춰 출력 텍스트에 실제 줄바꿈 문자(\n)를 삽입합니다. 일반 Unix 도구들은 연속된 텍스트를 출력하고 터미널이 시각적으로 줄바꿈을 처리하도록 맡기지만, Claude Code는 다릅니다. anthropics/claude-code GitHub에는 이 동작에 대한 이슈가 여러 건 올라와 있습니다. #6827에서는 80자 기준 하드 줄바꿈이 보고되었고, #15199에서는 포맷팅 아티팩트가 복붙 워크플로우를 깨뜨린다는 내용이 올라왔습니다. #24224에서는 텍스트 래핑을 제어하는 설정 옵션을 요청하고 있습니다.

두 번째, tmux의 soft-wrap 변환. tmux는 자체적으로 줄바꿈을 관리합니다. 화면에 보이는 시각적 줄바꿈(soft-wrap)을 클립보드에 복사할 때 실제 줄바꿈 문자(hard linebreak)로 변환합니다. Ghostty Discussion #7962에서 확인된 이 동작은 Ghostty, Alacritty, iTerm2 등 어떤 터미널을 써도 동일하게 발생합니다. 터미널의 문제가 아니라 tmux의 구조적 한계입니다.

세 번째, 좁은 pane 폭. tmux를 쓰는 가장 큰 이유 중 하나는 화면 분할입니다. 저는 보통 3개의 pane을 나란히 놓고 병렬 작업을 합니다. 각 pane의 폭은 약 80~90컬럼. 긴 명령어는 무조건 줄바꿈됩니다.

이 세 가지가 겹치면: Claude Code가 하드 래핑한 텍스트를 tmux가 다시 한번 줄바꿈하고, 복사하면 뉴라인이 중첩되어 원래 명령어를 복원할 수 없게 됩니다.

GitHub Issue만 8년째입니다

tmux의 줄바꿈 복사 문제는 새로운 것이 아닙니다. tmux/tmux #530은 2016년에 등록된 이슈입니다. "줄바꿈된 명령어를 복사할 때 뉴라인을 넣지 말아달라"는 요청이었습니다. 2026년 현재, 이 이슈는 여전히 열려 있습니다.

Claude Code 쪽도 마찬가지입니다. 하드 래핑 관련 이슈들이 2025년부터 꾸준히 올라오고 있지만, 터미널 출력 방식의 근본적 변경은 아직 이루어지지 않았습니다.

Stack Overflow의 2024년 개발자 설문에 따르면 개발자의 76%가 AI 도구를 사용 중입니다. 그리고 Cortex의 2026년 리포트에 따르면 AI 도구에서 가장 중요한 것은 "모델의 성능이 아니라 기존 워크플로우와의 통합"입니다. 도구가 워크플로우에 맞지 않으면, 아무리 강력해도 생산성을 깎아먹습니다.

5줄로 해결했습니다

기다리는 것을 그만뒀습니다. fish shell 함수 하나를 만들었습니다.

# ~/.config/fish/functions/cbfix.fish
function cbfix --description "Strip newlines from clipboard"
set -l before (pbpaste | wc -l | string trim)
set -l chars (pbpaste | wc -c | string trim)
if test "$chars" -eq 0
echo "Clipboard is empty."
return 1
end
set -l tmp (mktemp)
pbpaste > $tmp
tr '\n' ' ' < $tmp | sed 's/ */ /g' |
pbcopy
rm -f $tmp
set -l after (pbpaste | wc -l | string trim)
echo "Fixed: $before lines → $after line ($chars chars)"

end

동작 원리는 단순합니다.

  1. pbpaste > $tmp — 클립보드 내용을 임시 파일에 저장합니다 (fish의 변수 파싱 문제를 우회)
  2. tr '\n' ' ' — 모든 줄바꿈을 공백으로 변환합니다
  3. sed 's/ */ /g' — 연속된 공백을 하나로 정리합니다
  4. pbcopy — 정리된 텍스트를 다시 클립보드에 넣습니다
  5. before/after 라인 수를 출력해서 실제로 고쳐졌는지 확인합니다

사용법은 더 단순합니다. 텍스트를 복사하고, 아무 터미널 pane에서 cbfix를 입력합니다. 끝입니다. 붙여넣으면 한 줄로 깔끔하게 나옵니다.

fish abbreviation으로 cf만 쳐도 되게 설정하면 더 빠릅니다.

# ~/.config/fish/config.fish
abbr -a cf
cbfix

복사 → cf Enter → 붙여넣기. 이 세 동작이 전부입니다.

zsh 사용자라면 ~/.zshrc에 이렇게 추가하면 됩니다.

cbfix() {
local tmp=$(mktemp)
pbpaste > "$tmp"
tr '\n' ' ' < "$tmp" | sed 's/ */ /g' |
pbcopy
rm -f "$tmp"
echo "done"
}
alias cf=
cbfix

Linux 사용자라면 pbpaste/pbcopy 대신 xclip -selection clipboard -oxclip -selection clipboard를 사용하면 됩니다.

그런데 슬랙에 붙여넣으니 더 이상해졌습니다

cbfix로 명령어 복사 문제는 해결했습니다. 그런데 구조화된 텍스트 — 불릿 포인트, 문단 구분이 있는 메시지 — 를 복사해서 슬랙에 붙여넣었더니 한 덩어리로 뭉개졌습니다. 줄바꿈을 전부 날렸으니 당연한 결과입니다.

그래서 두 번째 도구를 만들었습니다. cbpara는 soft-wrap만 제거하고 문단 구조는 유지합니다.

# ~/.config/fish/functions/cbpara.fish
function cbpara --description "Join soft-wraps, keep paragraphs and bullets"
set -l chars (pbpaste | wc -c | string trim)
if test "$chars" -eq 0
echo "Clipboard is empty."
return 1
end
set -l before (pbpaste | wc -l | string trim)
set -l tmp (mktemp)
pbpaste > $tmp
python3 -c "
import re, sys
text = open('$tmp').read()
paras = re.split(r'\n{2,}', text)
out = []
for para in paras:
lines = para.split('\n')
merged, buf = [], ''
for line in lines:
stripped = line.strip()
if re.match(r'^[\-\•\*\#\→▶]|^\d+[\.\)]|^Phase|^@', stripped):
if buf: merged.append(buf.strip())
buf = line
else:
buf = (buf + ' ' + line).strip() if buf else line
if buf: merged.append(buf.strip())
out.append('\n'.join(merged))
sys.stdout.write('\n\n'.join(out))
" |
pbcopy
rm -f $tmp
set -l after (pbpaste | wc -l | string trim)
echo "cp: $before lines → $after lines ($chars chars, structure kept)"

end

핵심 로직: 빈 줄(문단 구분), 불릿(, -, *), 화살표(), 번호 목록, @멘션 앞에서는 줄바꿈을 유지하고, 나머지 soft-wrap만 공백으로 합칩니다.

abbreviation도 설정합니다.

abbr -a cf cbfix # 한 줄로 합치기 (명령어용)
abbr -a cp cbpara # 구조 유지 (슬랙/문서용)

명령어 약자 용도
cbfix cf 한 줄로 합치기 — 명령어, URL 복사
cbpara cp 구조 유지 — 슬랙, 노트, 문서 붙여넣기

틈이 하나가 아니었습니다. 처음 만든 도구가 새로운 틈을 드러냈고, 10분 만에 두 번째 도구로 메웠습니다. 이것이 나만의 OS가 자라나는 방식입니다.

진짜 교훈은 5줄이 아닙니다

이 스크립트는 중요하지 않습니다. 중요한 것은 이 스크립트를 만들겠다고 결정한 순간입니다.

몇 달 동안 저는 이런 패턴에 갇혀 있었습니다.

  1. 복붙이 깨진다
  2. GitHub Issue를 검색한다
  3. "알려진 문제"라는 걸 확인한다
  4. 다음 업데이트에서 고쳐지겠지 하고 기다린다
  5. 안 고쳐진다
  6. 1번으로 돌아간다

이 루프를 깨는 데 걸린 시간은 5분이었습니다. 그런데 5분짜리 해결을 결정하기까지 몇 달이 걸렸습니다. 업스트림 수정을 기다리는 것이 "올바른 방법"이라고 생각했기 때문입니다.

나만의 OS를 만든다는 것

Uno Platform의 2026년 AI 도구 트렌드 리포트에 따르면 지금 AI와 가장 잘 협업하는 팀은 가장 좋은 모델을 쓰는 팀이 아니라, 자기 워크플로우에 AI를 맞춘 팀입니다. 중요한 것은 도구의 스펙이 아니라 통합의 밀도입니다.

저는 이것을 "나만의 OS를 만든다"고 표현합니다. 비개발자가 클로드코드로 코딩하는 법에서도 썼지만, AI 도구를 잘 쓰는 것의 핵심은 도구 자체가 아니라 도구를 내 방식에 맞추는 과정에 있습니다.

운영체제가 하드웨어와 소프트웨어 사이의 접착제인 것처럼, 여러분의 개인 OS는 AI 도구들 사이의 접착제입니다. Claude Code, Ghostty, tmux, fish — 이 도구들은 각각 훌륭합니다. 하지만 조합하면 틈이 생깁니다. 그 틈을 메우는 것은 업스트림 개발자가 아니라 여러분 자신입니다.

cbfix는 그 틈을 메우는 접착제 중 하나일 뿐입니다. 중요한 것은 접착제를 만드는 습관입니다.

습관을 만드는 3단계:

  1. 마찰을 느낀다. 같은 불편을 두 번 이상 겪으면, 그것은 도구의 틈입니다. 무시하지 마세요.
  2. 10분 해결을 시도한다. 대부분의 틈은 셸 함수 하나, alias 하나, 스크립트 몇 줄로 메울 수 있습니다. 완벽할 필요 없습니다.
  3. 공유한다. 여러분이 겪은 틈은 다른 사람도 겪고 있습니다. 5줄짜리 스크립트라도 공유하면 누군가의 몇 달을 아껴줍니다.

완벽한 도구는 오지 않습니다

AI 도구들은 빠르게 진화하고 있습니다. Claude Code는 몇 달마다 대규모 업데이트를 합니다. Ghostty는 활발하게 개발 중입니다. tmux는 20년 넘게 유지되고 있습니다.

하지만 이 세 도구가 여러분의 특정 조합에서 완벽하게 작동할 날은 오지 않을 수도 있습니다. 도구의 제작자는 수백만 사용자를 대상으로 우선순위를 정합니다. 3개 pane을 나란히 놓고 Claude Code를 돌리는 여러분의 워크플로우는 그 우선순위 목록에서 높은 자리를 차지하기 어렵습니다.

그래서 나만의 OS가 필요합니다.

AI 시대의 생산성은 어떤 도구를 쓰느냐가 아니라, 도구들 사이의 틈을 얼마나 빠르게 메우느냐로 결정됩니다. AI 코딩 도구로 그로스 팀 역량 10배 높이기에서 다뤘듯이, 도구를 실전에 밀어넣는 속도가 경쟁력입니다. cbfix 같은 5줄짜리 접착제를 만드는 데 익숙해지세요. 그것이 여러분만의 OS가 되어갑니다.

GitHub Issue는 계속 열어놓으세요. 하지만 기다리지는 마세요.


이 글에서 언급한 GitHub Issues: - tmux/tmux #530 — 줄바꿈 복사 문제 (2016~) - ghostty-org/ghostty #7962 — tmux soft-wrap → linebreak - anthropics/claude-code #6827 — 80자 하드 줄바꿈 - anthropics/claude-code #15199 — 포맷팅 아티팩트 - anthropics/claude-code #24224 — 텍스트 래핑 설정 요청

About the author

Simpson Gyusup Sim
Updated on 2026년 3월 24일
무엇이든 물어보세요! 👋
15분 미팅 예약