Боль
Половина моей работы происходит в терминале — Claude Code, логи, вывод утилит, табличные представления, прогресс-бары, спиннеры. И регулярно я хочу выдрать кусок этого вывода и вставить куда-то ещё: в IDE, в задачу, в чат, в документ.
Каждый раз одно и то же.
Выделяю строку из claude code или из kubectl get, копирую, вставляю — и получаю в IDE/таске:
│ src/auth/middleware.ts:42
│ function validateToken(token)
│ if (token.exp < Date.now())
└─────────────────────────────────Дальше начинается ритуал. Удалить вертикальные палочки │ слева. Удалить рамку снизу └─. Удалить хвостовые пробелы — их там вагон, потому что терминал паддит строки до ширины колонки. Удалить ANSI escape sequences, если копировал из менее аккуратного источника. Иногда выловить невидимые zero-width символы, которые ломают парсинг JSON или регэкспы.
Это занимает 10–30 секунд. Терпимо. Но я делаю это десятки раз в день. На больших отрезках текста — руками вычищать палочки построчно — это уже минуты, и каждый раз слегка подташнивает.
В Claude Code боль особенно яркая: tool-output блоки рамку рисуют, прогресс крутит спиннеры из Braille (⠋⠙⠹⠸), статус-строки забиты блок-элементами █▌▏░ для прогресс-баров. Скопировал ответ — и в чистый markdown летит мусор.
Решение
Скрипт под Raycast Script Command, который:
- Берёт текущий клипборд через
pbpaste - Прогоняет через
perl -CSD(это важно —sedна macOS лажает с UTF-8 многобайтовыми символами,perlс флагом-CSDкорректно работает в Unicode) - Срезает мусор регэкспами по Unicode-диапазонам
- Кладёт обратно в клипборд через
pbcopy - Симулирует
Cmd+Vчерезosascript— вставляет в активное приложение
Один хоткей вместо ручной чистки.
Что именно срезается
Регэксп бьёт по диапазонам, не по конкретным символам — так покрытие шире и стабильнее:
| Что | Unicode-диапазон | Зачем |
|---|---|---|
| ANSI escape sequences | \x1b\[...m | цветовые коды из ls --color, grep --color, bat и т.п. |
| Box-drawing | U+2500–U+257F | рамки │ ├ └ ─ ┌ ┐ ╔ ╗ ║ ═ всех видов |
| Block elements | U+2580–U+259F | прогресс-бары █ ▌ ▏ ░ ▒ ▓ |
| Braille patterns | U+2800–U+28FF | спиннеры Claude Code ⠋ ⠙ ⠹ ⠸ ⠼ |
| Zero-width | U+200B–U+200D, U+FEFF | невидимые ZWSP, ZWNJ, ZWJ, BOM |
| Trailing whitespace | [ \t]+$ | хвостовые пробелы и табы в каждой строке |
Отдельно — лидирующая рамка обрабатывается аккуратно: s/^[\x{2500}-\x{257F}]+[ \t]?//mg срезает рамку вместе с одним пробелом-разделителем после неё. Иначе │ code после удаления │ оставлял бы строку с лишним пробелом в начале — и индентация в IDE поехала бы.
Что не трогается: bullets •, стрелки → ← ↑ ↓, эмодзи, кириллица, обычные отступы кода. Это не мусор, это смысл.
Финальный скрипт
~/raycast-scripts/smart-paste.sh:
#!/bin/bash
# @raycast.schemaVersion 1
# @raycast.title Smart Paste
# @raycast.mode silent
# @raycast.icon ✨
# @raycast.packageName Clipboard
# @raycast.description Чистит буфер от box-drawing, спиннеров, прогресс-баров, ANSI escape, zero-width и trailing whitespace, затем вставляет
pbpaste | \
perl -CSD -pe '
s/\x1b\[[0-9;?]*[a-zA-Z]//g;
s/^[\x{2500}-\x{257F}]+[ \t]?//mg;
s/[\x{2500}-\x{257F}\x{2580}-\x{259F}\x{2800}-\x{28FF}]//g;
s/[\x{200B}-\x{200D}\x{FEFF}]//g;
s/[ \t]+$//mg;
' | \
pbcopy
osascript -e 'tell application "System Events" to keystroke "v" using command down'Подключение
Raycast:
~/raycast-scripts/добавить как Script Directory в настройках Raycast (Extensions → Script Commands →+)- Назначить хоткей. У меня —
⌘⌥B(cmd + option + b) - System Settings → Privacy & Security → Accessibility → включить Raycast (нужно для
osascriptkeystroke)
Stream Deck: на каждом профиле повесил кнопку в правом верхнем углу — System → Open на путь к скрипту. Теперь и с клавы хоткеем, и с дека одной кнопкой. Тому же Stream Deck нужно отдельное Accessibility-разрешение в Privacy & Security.
Итог
Замена 30-секундного ручного ритуала на одно нажатие. На длинных копипастах из Claude Code или kubectl экономия больше — там руками чистить рамки построчно было откровенным страданием.
Если кто-то захочет под себя докрутить — диапазоны в регэкспе расширяются тривиально. Например, если копируете много markdown-таблиц и хотите оставлять | (это ASCII U+007C, не box-drawing — он не входит в 2500–257F, его скрипт не трогает) — ничего делать не надо. Если, наоборот, хочется убирать ASCII pipe тоже — добавить s/^\|//mg или аналог.
У меня сейчас покрывает все мои кейсы. Если из Claude Code в будущем прорвётся новый артефакт — диапазон добавляется одной строкой.
