● LIVE· № 001 · SANITIZE ВСЁ, ЧТО УХОДИТ В GIT: ЧИСТКА ПУБЛИЧНЫХ РЕПО ОТ УТЕЧЕК ИДЕНТИЧНОСТИ · 2026.05.11· № 002 · IMAGEGEN-MCP: СВОЙ MCP-СЕРВЕР ДЛЯ ОБЛОЖЕК БЛОГА · 2026.05.11· № 003 · SMART PASTE: ЧИЩУ МУСОР ИЗ ТЕРМИНАЛА ПЕРЕД ВСТАВКОЙ ОДНИМ ХОТКЕЕМ · 2026.05.10· № 004 · CLAUDE CODE TEAM TELEMETRY: ЦЕНТРАЛИЗОВАННАЯ СТАТИСТИКА ПО КОМАНДЕ · 2026.05.07· № 005 · ГАЙД ДЛЯ НОВИЧКОВ: КАК ВКАТЫВАТЬСЯ В CLAUDE CODE · 2026.05.06· 11 СТАТЕЙ · 0 ЧЕРНОВИКОВ
RU / EN
·6 МИН

Smart Paste: чищу мусор из терминала перед вставкой одним хоткеем

Скрипт под Raycast и Stream Deck, который срезает рамки, спиннеры, ANSI-коды и хвостовые пробелы из буфера обмена и сразу вставляет в активное приложение.

Боль

Половина моей работы происходит в терминале — 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, который:

  1. Берёт текущий клипборд через pbpaste
  2. Прогоняет через perl -CSD (это важно — sed на macOS лажает с UTF-8 многобайтовыми символами, perl с флагом -CSD корректно работает в Unicode)
  3. Срезает мусор регэкспами по Unicode-диапазонам
  4. Кладёт обратно в клипборд через pbcopy
  5. Симулирует Cmd+V через osascript — вставляет в активное приложение

Один хоткей вместо ручной чистки.

Что именно срезается

Регэксп бьёт по диапазонам, не по конкретным символам — так покрытие шире и стабильнее:

ЧтоUnicode-диапазонЗачем
ANSI escape sequences\x1b\[...mцветовые коды из ls --color, grep --color, bat и т.п.
Box-drawingU+2500–U+257Fрамки │ ├ └ ─ ┌ ┐ ╔ ╗ ║ ═ всех видов
Block elementsU+2580–U+259Fпрогресс-бары █ ▌ ▏ ░ ▒ ▓
Braille patternsU+2800–U+28FFспиннеры Claude Code ⠋ ⠙ ⠹ ⠸ ⠼
Zero-widthU+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:

  1. ~/raycast-scripts/ добавить как Script Directory в настройках Raycast (Extensions → Script Commands → +)
  2. Назначить хоткей. У меня — ⌘⌥B (cmd + option + b)
  3. System Settings → Privacy & Security → Accessibility → включить Raycast (нужно для osascript keystroke)

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 в будущем прорвётся новый артефакт — диапазон добавляется одной строкой.