[English](../../README.md) · [简体中文](../../README.zh.md) · [繁體中文](README.zh-Hant.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · [Español](README.es.md) · [Português](README.pt.md) · [Français](README.fr.md) · [Deutsch](README.de.md) · [Italiano](README.it.md) · **Русский** · [Tiếng Việt](README.vi.md) · [ไทย](README.th.md) · [Bahasa Indonesia](README.id.md) · [हिन्दी](README.hi.md) · [বাংলা](README.bn.md) · [العربية](README.ar.md) · [Türkçe](README.tr.md)
# QuickText
> менеджер сниппетов и расширитель текста в трее Windows.

**Перестаньте печатать одно и то же дважды.** QuickText живёт в системном трее Windows: сохраните текст, к которому вы обращаетесь снова и снова — письма, адреса, подписи, шаблоны, готовые ответы, изображения — один раз, а затем в **любом поле ввода** наберите несколько символов или аббревиатуру, и он окажется прямо у курсора. Многострочность, спецсимволы и эмодзи сохраняются символ в символ.
> Ваш многоразовый текст в паре нажатий клавиш — вставляется прямо у курсора.
- WPF / .NET 10, портативный exe одним файлом, **без аккаунта, офлайн по умолчанию** — только необязательная проверка обновлений обращается к GitHub.
- Данные — это **локальный JSON** в вашей собственной папке: положите её в Dropbox / OneDrive / на NAS для синхронизации.
- Тёмная и светлая темы (или как в Windows), **18 языков интерфейса** (с зеркалированием справа налево для арабского), настройки применяются мгновенно.
**[⬇ Скачать последнюю версию](https://github.com/rockbenben/QuickText/releases/latest)** —— Windows x64, портативный один файл. Не подписан, поэтому при первом запуске SmartScreen предупредит: **Подробнее → Выполнить в любом случае**.
- `QuickText--win-x64.zip` — среда выполнения .NET уже внутри, поэтому запускается на любом Windows 10/11 x64 без предварительной установки. Берите этот вариант, если сомневаетесь: компьютеры во внутренней сети или без интернета, а также запуск с флешки.
- `QuickText--win-x64-needs-dotnet10.zip` — требует установленной [среды выполнения .NET 10 Desktop](https://dotnet.microsoft.com/download/dotnet/10.0). Для своего компьютера с интернетом: установили один раз — и каждое обновление весит совсем немного.
- `QuickText.exe` — та же сборка без zip: запускается сразу, либо перезапишите ею существующую копию для обновления.
Возможности и данные одинаковые, разница только в том, вшита ли среда выполнения.
---
## Где это пригодится
Везде, где вы **печатаете одно и то же снова и снова в Windows**. Программа живёт в трее и работает в любом поле ввода (окна чатов, формы в браузере, редакторы, почтовые клиенты — не привязана к одному приложению). Это **менеджер сниппетов и расширитель текста в одном**, плюс поиск по пиньиню, шаблоны с переменными и изображения.
| Кто | Что хранят |
| ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| **Поддержка / электронная коммерция** | Готовые ответы, стандартные формулировки, рекламные тексты, QR-коды или фото товаров |
| **Продажи / бизнес** | Шаблоны писем, приветствия, коммерческие предложения, подписи |
| **Разработчики / DevOps** | Команды, конфиги, JSON, шаблонный код (`{...}` выводится дословно, никогда не разбирается) |
| **Офис / заполнение форм** | Email, адрес, телефон, номера документов, шаблоны заметок с совещаний (спрашивают вас и запоминают последнее значение) |
| **HR / администрирование / юристы** | Уведомления о приёме, стандартные оповещения, оговорки — локально, офлайн, подходит для конфиденциального содержимого |
> **Прежде чем хранить что-то чувствительное.** Сниппеты сохраняются как **JSON открытым текстом**, без шифрования и намеренно — чтобы вы могли сами прочитать файл, сравнить его и отредактировать. Для шаблонов и типовых фраз на машине, которой пользуетесь только вы, это нормально. Но это же означает, что номер документа или пароль, положенные туда, прочитает всё, что может прочитать файл: другие программы под вашей учётной записью и сервис синхронизации, если папка лежит в Dropbox / OneDrive. Настоящие секреты доверьте менеджеру паролей, а QuickText оставьте для текста, который не жалко держать на виду.
## Посмотрите за 30 секунд
В **любом месте, где можно печатать** — допустим, вам нужен ваш email в окне чата:
1. **Вызов** — нажмите `Ctrl+Shift+8`; панель появляется поверх активного окна.
2. **Поиск** — наберите несколько букв; совпадения подсвечиваются. Поиск идёт по имени, пиньиню (полному + инициалам), аббревиатуре и телу.
3. **Enter** — email вставляется **прямо туда, где был курсор**. Готово.
> Ничего не набирайте, чтобы просматривать по категориям, с закреплёнными сверху `Недавние` / `Избранное`; те, что вы используете чаще всего, **автоматически всплывают наверх**.
> `↑↓` перемещение · `←→` переключение категории · `Alt+1–9` быстрый выбор · двойной клик для отправки · `Esc` для закрытия.
## Три способа добраться до текста — выбирайте, что подходит
Одна и та же библиотека, три способа извлечь из неё текст; свободно комбинируйте их:
| Способ | Как вызвать | Лучше всего для |
| ------------------------------ | --------------------------------------------------------- | ----------------------------------------------------------- |
| 🔍 **Поиск в панели** | `Ctrl+Shift+8` → набрать → Enter | Много сниппетов, редкое использование, выбор через просмотр |
| ⌨️ **Встроенная аббревиатура** | Просто наберите `;sig`, затем Space / Tab / Enter | Часто используемые фиксированные фразы, без панели |
| 🧩 **Шаблон с переменными** | Вставьте сниппет с `{переменными}` любым из способов выше | Письма / формы: один шаблон, меняется пара слов |
- **Изображения тоже**: добавляйте из буфера обмена или из файла, при отправке вставляются как изображение; у изображений могут быть аббревиатуры, так что наберите аббревиатуру и получите картинку (QR-коды, подписи с логотипом).
- **Вывод для каждого сниппета**: фразы для чата отправляются автоматически после вставки, фрагменты кода — никогда, они не мешают.
Полные подробности об аббревиатурах и переменных — в разделе **Подробно** ниже, в подразделах **Плейсхолдеры** и **Аббревиатуры**.
---
**Подробно**
## Работает из коробки
Дважды кликните по **`QuickText.exe`**; программа живёт в **системном трее** (без кнопки на панели задач). При **первом запуске** она:
- добавляет небольшую **стартовую библиотеку** (две категории, на **вашем языке интерфейса**), чтобы вы могли сразу попробовать;
- показывает всплывающую подсказку с горячей клавишей вызова — по умолчанию **`Ctrl+Shift+8`**.
> Иконки в правом верхнем углу панели: **+ Создать** · **Менеджер** (открыть редактор) · **Настройки** · **📌 Закрепить** (оставить панель открытой после отправки, чтобы вставить несколько подряд). Переходите прямо в Менеджер / Настройки, не возвращаясь в трей.
## Добавление / редактирование вашего текста

- **Трей → Открыть Менеджер** — полноценный редактор: категории слева, сниппеты справа, редактор внизу. Добавляйте/переименовывайте/удаляйте категории (с меткой из **7 цветов**), редактируйте сниппеты (имя, аббревиатура, тело, изображение). Перетаскивайте для изменения порядка или перемещения между категориями; `Ctrl+Z` отменяет удаление.
- **Трей → Создать из буфера обмена** — создаёт новый сниппет из текущего содержимого буфера обмена и открывает его в Менеджере для завершения (нажмите **Сохранить**, чтобы записать на диск; закрытие Менеджера спросит, сохранить изменения или отказаться от них).
- **Создание в панели** — введите текст в поле поиска и нажмите `Ctrl+N`, чтобы сохранить его как новый сниппет (этот текст становится телом; `@категория …` помещает его в эту категорию) и перейти в Менеджер для завершения (`Ctrl+E` редактирует выбранный).
> **Длинный текст / код**: кнопка `⤢` над телом открывает его в редакторе почти на весь экран (либо нажмите `Ctrl+Shift+Enter` в теле); `Esc` или «Готово» завершает правку; если что-то изменено, сначала спросит, сохранить или отменить. Когда отмечено «включить плейсхолдеры {переменная}», токены **окрашиваются по типу** — переменные бирюзовым, автоматические токены вроде `{date}` янтарным, `{snippet:x}` фиолетовым, `{cursor}` бирюзовым пунктиром — а опечатка в имени сниппета, неверный формат даты или незакрытая фигурная скобка получают **красную волнистую линию**, при наведении на которую видна причина. Всё это вставляется **дословно** при отправке — раньше это можно было заметить только после вставки не того, что нужно. Наведение на токен даты также показывает предпросмотр его итогового значения. Для кода оставьте галочку снятой: подсветка полностью отключается, так что тело, полное `{}`, остаётся спокойным, а строка состояния просто сообщает, сколько токенов будет выведено как есть. Также добавлено: **Enter сохраняет отступ** и **`Tab` делает отступ для всего многострочного выделения**.
>
> Увеличенное окно **всегда показывает номера строк**, а в его нижней части есть выбор **формата кода** — JSON, YAML, XML, HTML, Markdown, SQL, Python, JavaScript/TypeScript, C#, Java, PowerShell, Shell и INI, всего 13 — который подсвечивает синтаксис тела и запоминается для каждого сниппета отдельно. **Сохранённый текст остаётся обычным, а то, что вставляется, не меняется.** Подсветка плейсхолдеров заливает фон, а подсветка синтаксиса окрашивает символы, поэтому они никогда не конфликтуют: тело JSON с `{variables}` одновременно показывает и свою структуру, и свои переменные.
## Плейсхолдеры (один шаблон, множество ситуаций) · включаются для каждого сниппета отдельно
Плейсхолдеры — это **переключатель для каждого сниппета**: отметьте «**Включить плейсхолдеры {переменная}**» в редакторе Менеджера, и токены ниже будут подставлены при отправке; **если галочка снята (по умолчанию), тело отправляется дословно** — код, скрипты и JSON, полные литеральных `{...}`, никогда не разбираются ошибочно и не запрашивают ввод.
> При обновлении: раньше плейсхолдеры были всегда включены. Первый запуск после обновления автоматически ставит галочку для **существующих сниппетов**, чьё тело содержит `{...}`, так что поведение не меняется; снимите её в Менеджере для тех, что на самом деле являются кодом.
Когда включено, эти плейсхолдеры подставляются при отправке:
| Плейсхолдер | Что делает |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `{name}` (любая метка) | **Запрашивает у вас значение** перед вставкой; **запоминает последнее значение**, чтобы при повторе не спрашивать снова |
| `{name:John}` | Переменная со **значением по умолчанию**, заранее вписанным в запрос |
| `{env\|dev\|test\|prod}` | Переменная с **вариантами** — запрос показывает выпадающий список (первый вариант заодно служит значением по умолчанию; свободный ввод по-прежнему разрешён) |
| `{clipboard}` | Вставляет текущее содержимое буфера обмена |
| `{cursor}` | Оставляет каретку в этом месте после вставки (также подавляет авто-Enter) |
| `{date}` `{time}` `{datetime}` | Вставляет текущую дату/время; поддерживает смещения вроде `{date+7}` (через 7 дней) и пользовательские форматы вроде `{date=yyyy-MM-dd}` / `{time=HH:mm:ss}`, сочетаемые со смещением: `{date+7=MM-dd}`. Китайские псевдонимы `{日期}` / `{时间}` / `{日期时间}` также работают |
| `{uuid}` `{random}` | Случайные значения: UUID / 6 цифр, новые для каждого вхождения |
| `{snippet:name}` | **Встраивает тело другого сниппета** (до 3 уровней вложенности, защита от циклов) — держите общие подписи в одном месте |
Пример: подпись `Best regards,\n{name}` (с включёнными плейсхолдерами) → при отправке спрашивает имя → вставляет готовую подпись.
## Аббревиатуры (раскрываются по мере набора, без панели) · опционально
Присвойте сниппету **аббревиатуру**, чтобы раскрывать его прямо в любом поле ввода. **Префикс-триггер** задаётся один раз в Настройках (по умолчанию `;`):
1. В Менеджере наберите только **саму аббревиатуру** — например, `sig` для вашей подписи. Префикс добавляется автоматически (не набирайте его повторно); поле показывает текущий префикс `;` впереди.
2. В любом поле ввода наберите **`;sig`** (= префикс + аббревиатура), затем **Space / Tab / Enter** → она удаляет `;sig` и раскрывает тело (`{плейсхолдер}` сначала запросит ввод, если у сниппета включены плейсхолдеры).
3. **Ошиблись?** Нажмите **Backspace сразу после** раскрытия, чтобы вернуть его обратно к `;sig` (то же окно, в течение 5 с).
Подробности: сопоставление **регистронезависимо** (`;SIG` срабатывает при включённом CapsLock); опечатка, исправленная Backspace, всё равно раскрывается; два сниппета с одинаковой аббревиатурой получают **встроенное предупреждение** в Менеджере; а в меню трея есть переключатель **«Приостановить раскрытие»** в один клик (для демонстраций/игр).
> **О префиксе:** префикс (по умолчанию `;`) не даёт обычному набору / пиньиню ложно срабатывать на голую аббревиатуру. Меняйте его в **Настройки → Аббревиатуры → Префикс-триггер** (на `,`, `:`, …) или **оставьте пустым**. Аббревиатура с префиксом самоограничивается и срабатывает даже приклеенная к предыдущему тексту (например, `thx;sig`); без префикса она срабатывает только как отдельное слово (никогда как хвост более длинного, вроде `graf`). Можно также отключить аббревиатуры для отдельных приложений (чёрный список, например `cmd.exe; putty.exe`) или выключить их полностью.
## Вывод и общие настройки (Трей → Настройки)
- **Вывод** — по умолчанию «вставить в активное приложение»; или «только скопировать в буфер обмена» (вы вставляете через `Ctrl+V`). Опционально: нажать Enter после вставки, отправка одним кликом, “Сохранять мой буфер обмена” (восстановление по умолчанию выключено — приложения, которые медленно читают буфер обмена, могут вставить старое содержимое). **Каждый сниппет может это переопределить** (Менеджер → Вывод: следовать глобальному / вставить / вставить + Enter / только копировать) — фразы для чата отправляются автоматически, фрагменты кода — никогда.
- **Положение панели** — следовать за активным окном (по умолчанию) / следовать за текстовой кареткой / запоминать последнее положение.
- **Способ вызова (выберите один)** — ① **комбинация клавиш**: кликните по полю и нажмите новую (обычным клавишам нужен `Ctrl`/`Alt`/`Shift`/`Win`; функциональные клавиши **`F1`–`F24` работают сами по себе**); или ② **касание модификатора**: **одно- или двойное нажатие одного модификатора** (например, правый `Ctrl`, правый `Shift`) для вызова (одиночный модификатор не может быть обычной горячей клавишей, поэтому определяется по нажатию). Выбор касания отключает комбинацию — они взаимоисключающие, так что всегда ясно, какой способ активен.
- **Горячая клавиша захвата** — опциональная вторая комбинация, которая **бесшумно сохраняет буфер обмена как новый сниппет** (обратная связь через всплывающую подсказку, без окна).
- **Папка данных** — укажите её на синхронизируемый диск; **экспорт / импорт резервной копии** (zip, проверяется с подтверждением перезаписи); ежедневное **автоматическое резервное копирование** на эту машину (хранятся 10 новейших, доступ к папке в один клик).
- **Язык** — **18 языков**: English · 简体中文 · 繁體中文 · 日本語 · 한국어 · Español · Português · Français · Deutsch · Italiano · Русский · Tiếng Việt · ไทย · Bahasa Indonesia · हिन्दी · বাংলা · العربية (RTL) · Türkçe, переключается мгновенно. **Запуск вместе с Windows** опционально.
- **Тема** — тёмная (по умолчанию) / светлая / как в Windows; применяется сразу, без перезапуска.
- **Проверка обновлений** — по умолчанию выключено; при включении при запуске один раз подключается к GitHub для проверки новой версии (единственный выход в интернет). «Проверить сейчас» запускает вручную.
## Шпаргалка по клавишам
| Действие | Клавиши |
| ---------------------------------------------- | ---------------------------------------------------------- |
| Вызвать / закрыть панель | `Ctrl+Shift+8` (настраивается) / `Esc` |
| Выбор / переключение категории / быстрый выбор | `↑↓` / `←→` / `Alt+1–9` |
| Отправить | `Enter` или двойной клик (одиночный клик опционально) |
| В избранное / из избранного | `Ctrl+D` |
| Создать / редактировать в панели | `Ctrl+N` / `Ctrl+E` |
| Отменить удаление (Менеджер) | `Ctrl+Z` |
| Аббревиатура: триггер / отмена | набрать аббр + Space·Tab·Enter / Backspace после раскрытия |
---
## Возможности вкратце
- **Вызов**: глобальная горячая клавиша — **комбинация клавиш** (функциональные клавиши работают как одна) или **одиночное/двойное нажатие модификатора** (например, правый Ctrl), **выберите один**; панель следует за активным окном / текстовой кареткой / запомненным положением; кнопки верхнего ряда переходят к **Создать / Менеджер / Настройки**; закрепите её, чтобы вставить несколько подряд; перетаскивание и изменение размера с запоминанием размера.
- **Поиск**: имя / пиньинь / инициалы / аббревиатура / тело, с подсветкой; **ничьи разрешаются по частоте использования (frecency)**; `@категория ключевые слова` ограничивает поиск одной категорией (голое `@категория` просматривает её).
- **Содержимое**: обычный текст (многострочный, спецсимволы, эмодзи без потерь), плейсхолдеры (значения по умолчанию / выпадающие списки вариантов / вложенность сниппетов / пользовательские форматы дат / uuid / random — **включаются для каждого сниппета отдельно**), **изображения** (из буфера обмена или файла, при отправке вставляются как изображение; **у изображений тоже могут быть аббревиатуры** — наберите аббревиатуру, получите изображение).
- **Аббревиатуры**: срабатывают по завершающему символу, запрос переменных, отмена одним нажатием, исправление опечатки через Backspace, регистронезависимость, клик разрывает токен, предупреждение о дубликатах, чёрный список по приложениям, **пауза в один клик из трея**.
- **Вывод**: прямая вставка / только копирование; опциональные авто-Enter, восстановление буфера обмена, отправка одним кликом; **переопределение вывода для каждого сниппета**; горячая клавиша захвата (буфер обмена → сниппет одним нажатием).
- **Менеджер**: **просторный редактор тела** (`⤢ Развернуть` открывает его в отдельном окне; несохранённые изменения всегда подтверждаются — при закрытии и при переходе к другой записи), **подсветка плейсхолдеров** (окрашивается по типу; битые ссылки на сниппеты / неверные форматы дат / незакрытые фигурные скобки подчёркиваются красной волнистой линией с причиной при наведении; когда плейсхолдеры выключены, ничего не подсвечивается — вместо этого об этом сообщает строка состояния), **дружелюбие к коду** (увеличенное окно всегда показывает номера строк и предлагает 13 форматов кода для подсветки синтаксиса; Enter сохраняет отступ, `Tab` делает отступ для многострочного выделения, режим без переноса), 7 цветов категорий, перетаскивание для изменения порядка / перемещения, **множественный выбор для пакетного перемещения / удаления** (выбор через Ctrl / Shift, затем правый клик), отмена удаления, **корзина (восстановление в течение 30 дней, с предпросмотром тела)**, предупреждение о дубликатах аббревиатур, статистика использования, обратная связь при сохранении.
- **Данные**: локальный JSON, горячая перезагрузка (автоматически объединяет внешние правки / синхронизацию), уведомление о конфликте синхронизации, экспорт / импорт резервной копии, **ежедневное автоматическое резервное копирование (хранится 10)**, запуск вместе с Windows.
- **Локализация**: **18 языков интерфейса** (упрощённый / традиционный китайский, English, 日本語, 한국어, Español, Français, Deutsch, Русский, العربية …) с **зеркалированием справа налево для арабского**, переключается на лету в Настройках. Тёмная и светлая темы (или как в Windows) — тоже сразу.
- **Надёжность**: единственный экземпляр (второй запуск вызывает панель поиска вместо повторной установки хуков); CI прогоняет тесты плюс дымовую проверку окна при каждом push и публикует обе сборки одним файлом на тегах `v*`.
## Данные и синхронизация
Папка данных (по умолчанию `Documents\QuickText`, меняется в Настройках, может указывать на синхронизируемый диск):
```text
/
├─ index.json # порядок категорий + имя файла и цвет каждой категории
├─ .json # сниппеты в этой категории (Snippet[])
├─ trash.json # мягко удалённые сниппеты (автоочистка через 30 дней)
└─ images/ # файлы изображений для сниппетов-изображений
```
- `Snippet`: `{ id, name, abbr, body, useVariables, outputMode, imagePath?, updatedAt }`.
- **Атомарная запись** (`*.tmp` → `File.Replace`), чтобы синхронизация никогда не читала наполовину записанный файл; горячая перезагрузка через `FileSystemWatcher` (с объединением событий) и защитой от собственной записи.
- Состояние, локальное для машины, остаётся **вне папки синхронизации**: настройки в `%APPDATA%\QuickText\settings.json`, счётчики использования / избранное в `%APPDATA%\QuickText\usage.stats` (они меняются при каждой отправке и конфликтовали бы между машинами), ежедневные автоматические резервные копии в `%APPDATA%\QuickText\backups\`.
- **Портативный режим** (без следов / для USB): включите его в **Настройки → Данные → Портативный режим** — он создаёт маркер `QuickText.portable` рядом с `QuickText.exe` и **применяется при следующем перезапуске** (первый портативный запуск переносит ваши настройки и статистику использования, так что перенастраивать ничего не нужно). Настройки, статистика использования, резервные копии и стартовая библиотека тогда живут в `\Data\` вместо `%APPDATA%` / Documents, а «запуск вместе с Windows» использует ярлык в папке автозагрузки, а не реестр — так что весь инструмент путешествует на флешке и не оставляет ничего на хост-машине. Приложение должно находиться в месте, доступном для записи (USB-флешка, а не `Program Files`); **текстовая библиотека переносится через Экспорт / Импорт резервной копии**. Запуск вместе с Windows отслеживается отдельно для каждого режима, так что после переключения отметьте его заново в новом режиме, если он вам нужен. Оставьте его выключенным для установленной раскладки выше (правильный выбор, когда папка данных находится на синхронизируемом диске).
_(Это должен быть именно файл-маркер, а не обычная настройка — он определяет, где живёт сам `settings.json`; переключатель вступает в силу только при следующем запуске, никогда не нарушая текущую сессию.)_
## Бренд
Ресурсы находятся в `assets/branding/`: `quicktext-mark.svg` (основной), `quicktext-mark-mono.svg` (монохромный), `quicktext.ico` (16–256, иконка приложения / трея), `quicktext-256.png`, `quicktext-social.png` (1200×630 og:image), `quicktext-social-2x.png` (2400×1260 @2x), `brand.html` (бренд-лист). Знак — это **текстовая каретка I-beam** на мятной плитке рядом с янтарным блоком только что вставленного текста — «text▮», то есть размещение вашего текста у курсора. Палитра «terminal dusk»: мятный (акцент приложения `#3DC2A0`) + янтарный `#F2B457` на чернилах с уклоном в бирюзовый; гротескный словесный знак в паре с моноширинным Cascadia Code.
## Архитектура
Чистое ядро (Core, без Win32, тестируемое юнит-тестами) держится отдельно от Win32/UI.
| Проект | Содержимое |
| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `src/QuickText.Core` | `Models`, `Persistence` (`Store`, `UsageStore`, `JsonConfig`), `Search` (`SearchIndex`), `Abbr` (`AbbrMatcher`), `Snippets` (`Placeholders`), `Pinyin`, `Settings`, `Localization` (.resx, 18 языков) |
| `src/QuickText.App` | WPF UI (`SearchPanel` / `ManagerWindow` / `SettingsWindow` / `AppDialog` / `VariablesDialog`), `Ui/Theme.xaml` (тёмная тема), `Interop` (`GlobalHotkey`, `KeyboardHook`, `PasteEngine`, `Autostart`, `NativeMethods`) |
| `tests/QuickText.Core.Tests` | Юнит-тесты ядра (xUnit) |
## Сборка и запуск
```bash
dotnet build QuickText.sln -c Debug
dotnet test tests/QuickText.Core.Tests/QuickText.Core.Tests.csproj
dotnet run --project src/QuickText.App # or run QuickText.exe under bin
```
Опубликовать портативную сборку одним файлом (win-x64):
```bash
dotnet publish src/QuickText.App -c Release -p:PublishProfile=win-x64
dotnet publish src/QuickText.App -c Release -p:PublishProfile=win-x64-needs-dotnet10
```
Требуется .NET 10 SDK. Только Windows (глобальная горячая клавиша Win32 / хук клавиатуры / буфер обмена).
## Лицензия
[MIT License](../../LICENSE) · Copyright © 2026 rockbenben. Свободно использовать, изменять и распространять.
## О плане 365 Open Source
Проект **#023** из [плана 365 Open Source](https://github.com/rockbenben/365opensource) — один человек + ИИ, 300+ открытых проектов за год.
[Предложить свою идею →](https://365.aishort.top/) · [Discord](https://discord.gg/PZTQfJ4GjX) · [Telegram](https://t.me/aishort_top)