QuickText

[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. ![Вызовите панель поверх любого окна, введите несколько букв — сниппет вставится на месте курсора](../images/quicktext-demo.webp) **Перестаньте печатать одно и то же дважды.** 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`**. > Иконки в правом верхнем углу панели: **+ Создать** · **Менеджер** (открыть редактор) · **Настройки** · **📌 Закрепить** (оставить панель открытой после отправки, чтобы вставить несколько подряд). Переходите прямо в Менеджер / Настройки, не возвращаясь в трей. ## Добавление / редактирование вашего текста ![Менеджер: категории слева, сниппеты в центре, редактор справа](../images/quicktext-manager.webp) - **Трей → Открыть Менеджер** — полноценный редактор: категории слева, сниппеты справа, редактор внизу. Добавляйте/переименовывайте/удаляйте категории (с меткой из **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)