Создание ультра‑лёгкого приложения заметок на AutoHotkey
Важно: все примеры в статье рассчитаны на стабильную текущую версию AutoHotkey (v1). Перед запуском убедитесь, что вы установили актуальную версию с официального сайта.
О чём эта статья
Этот материал проведёт вас шаг за шагом от установки AutoHotkey до работающего мини‑приложения заметок (MUONotes). Мы разберём исходный код, подробно объясним каждую часть, предложим варианты улучшения и включим контрольный список для тестирования и внедрения.
Основная идея и план
Цель проекта простая и прагматичная:
- Создать очень лёгкое окно заметок, которое появляется мгновенно по горячей клавише.
- Сохранять каждую заметку в обычный текстовый (Markdown) файл.
- Минимум элементов — только заголовок, тело заметки и сохранение.
План действий:
- Установить AutoHotkey.
- Создать новый .ahk файл и открыть его в редакторе.
- Описать переменные для пути сохранения и суффикса имени файла.
- Создать GUI с двумя полями Edit и кнопкой OK.
- Реализовать обработчик кнопки для сохранения файла (включая очистку/санитизацию заголовка).
- Добавить обработчики закрытия/escape и инструкцию по назначению сочетания клавиш.
Установка AutoHotkey
- Перейдите на официальный сайт AutoHotkey и нажмите кнопку «Download». Выберите актуальную стабильную версию (обычно подпись “Download Current Version”).
- Установите программу — после установки AutoHotkey не меняет систему заметно: он выступает как интерпретатор для .ahk скриптов.
Совет: если вы новичок, короткое введение по синтаксису AutoHotkey поможет понять, как работают метки (labels), Gui, переменные и команды вроде FileAppend.
Создание нового скрипта
В Проводнике Windows: Правый клик → “Создать” → “AutoHotkey Script”. Альтернативно: создайте текстовый файл и переименуйте расширение TXT → AHK.
Откройте файл в вашем редакторе кода (Notepad++, VS Code, обычный Блокнот). Ниже — рабочая ядровая часть скрипта и пояснения.
ALT: Меню Windows Проводника с пунктом “New > AutoHotkey Script”.
Основные переменные и настройка путей
Чтобы было удобно настраивать сохранение, зададим две переменные в начале скрипта:
NotesPath = A:\00_Cloud_Storage\Dropbox\Notes\Obsidian\Duckland!Inbox
FileNameExtra = _MUOnote.mdПояснения:
- NotesPath — полный путь к папке, куда будут сохраняться заметки. Обязательно замените на свой путь.
- FileNameExtra — суффикс/расширение имени файла. Например, _MUOnote.md чтобы сохранить заметки в формате Markdown.
Важно: используйте двойные обратные слэши в строках кода в Windows‑пути, если вы помещаете путь в кавычки или в контекст, где обратный слэш имеет специальное значение. В простом присваивании AHK корректно воспринимает одиночные слэши, но явное удвоение безопаснее в документации.
ALT: Фрагмент кода скрипта с переменными NotesPath и FileNameExtra, выделенные в редакторе.
Создание GUI: элементы интерфейса
Мы создадим окно с тремя элементами: поле заголовка, большое поле заметки и кнопку OK. Для удобства вынесем шрифты в отдельные строки.
Код для создания GUI:
Gui, QN:Font, s14 c666666
Gui, QN:Add, Edit, x5 y5 w550 h60 vTitle, Title - Filename
Gui, QN:Font, s12 c444444
Gui, QN:Add, Edit, x5 y70 w550 h600 vNote, %Clipboard%
Gui, QN:Add, Button, x5 y680 w550 h50, OK
Gui, QN:Show, x0 y0 w560 h735, MUONotes
returnПояснения:
- Gui, QN:Font — задаёт шрифт для последующих элементов: размер (s14), цвет (c666666 — серый).
- Первый Edit — поле для заголовка (vTitle). Текст внутри используется как основа для имени файла.
- Второй Edit — многострочное поле (vNote), предзаполняется содержимым буфера обмена (%Clipboard%).
- Button — кнопка OK.
- Gui, QN:Show — отображает окно в позиции x0 y0 с размерами.
- return — важно завершить основной блок скрипта, иначе AHK продолжит выполнять последующие метки сразу.
ALT: Редактор с кодом добавления GUI-элементов в AHK и визуальное представление окна.
Обработчик кнопки: сохранение заметки
Добавим метку, которая будет срабатывать при нажатии кнопки OK и сохранять файл в NotesPath.
QNButtonOK:
FileEncoding, UTF-8-RAW
Gui, QN:Submit
TempClipboard = %ClipBoard%
ClipBoard = %Title%
gosub CleanText
FileName = %ClipBoard%
ClipBoard = %TempClipboard%
FinalFileName = %NotesPath%\%FileName%%FileNameExtra%
FileDelete, %FinalFileName%
FileAppend, %Note%, %FinalFileName%
returnРазбор по шагам:
- FileEncoding, UTF-8-RAW — устанавливает кодировку создаваемого файла в UTF‑8 без BOM (подходит для Markdown и кодирования символов).
- Gui, QN:Submit — подхватывает значения полей GUI в переменные (vTitle → Title, vNote → Note).
- Мы временно сохраняем текущий буфер обмена в TempClipboard, затем помещаем Title в буфер обмена, чтобы использовать его как вход для процедуры очистки (CleanText). Это упрощает передачу строки в функцию без сложных аргументов.
- gosub CleanText — вызывает метку, которая очищает текст от нежелательных символов и возвращает результат в ClipBoard.
- FileName — получает очищенную строку из буфера обмена и используется в FinalFileName.
- FileDelete заранее удаляет существующий файл с тем же именем (опционально), затем FileAppend записывает Note.
Примечание: если вы предпочитаете не затирать существующие файлы, пропустите FileDelete или добавьте логику нумерации.
ALT: GUI с двумя полями ввода и кнопкой OK, показывающий пример заполнения.
Функция очистки заголовка (санитизация)
Чтобы имя файла было валидным и переносимым, мы удаляем все символы, кроме букв и цифр, и сводим множественные пробелы к одному.
CleanText:
CleanMePlease = %ClipBoard%
CleanMePlease := Regexreplace(CleanMePlease, "[^a-zA-Z0-9 ]", " ")
loop
{
StringReplace, CleanMePlease, CleanMePlease, %A_SPACE%%A_SPACE%, %A_SPACE%, all
if ErrorLevel <> 0
break
}
ClipBoard = %CleanMePlease%
ReturnПояснения и уточнения:
- Regexreplace заменяет все символы, кроме латинских букв, цифр и пробела, на пробел. Если вам нужны символы национальных алфавитов (кириллица, умляуты и т.д.), расширьте выражение, например, добавив диапазоны Unicode или конкретные символы.
- Цикл убирает двойные пробелы, возникающие после замены на пробелы.
- Результат возвращается в ClipBoard и далее копируется в FileName.
Важно: в исходной версии мы специально использовали латинские символы для совместимости с файловыми системами и сервисами синхронизации. Если вы используете только локальную систему с поддержкой UTF‑8 в именах файлов, можете изменить RegEx, чтобы разрешить кириллицу.
Обработка закрытия и выхода
Чтобы окно корректно завершало приложение и скрипт не оставался в трейе, добавим метки для Escape/Close:
QNGuiEscape:
QNGuiClose:
ExitApp
returnРазместите эти метки в конце файла. Они гарантируют, что при закрытии окна или нажатии Esc приложение полностью завершится.
ALT: Скриншот с выделением кода ExitApp в AHK скрипте.
Полный минимальный пример скрипта
Ниже — собранный минимальный скрипт, который можно сохранить как MUONotes.ahk и запустить.
NotesPath = A:\00_Cloud_Storage\Dropbox\Notes\Obsidian\Duckland!Inbox
FileNameExtra = _MUOnote.md
Gui, QN:Font, s14 c666666
Gui, QN:Add, Edit, x5 y5 w550 h60 vTitle, Title - Filename
Gui, QN:Font, s12 c444444
Gui, QN:Add, Edit, x5 y70 w550 h600 vNote, %Clipboard%
Gui, QN:Add, Button, x5 y680 w550 h50, OK
Gui, QN:Show, x0 y0 w560 h735, MUONotes
return
QNButtonOK:
FileEncoding, UTF-8-RAW
Gui, QN:Submit
TempClipboard = %ClipBoard%
ClipBoard = %Title%
gosub CleanText
FileName = %ClipBoard%
ClipBoard = %TempClipboard%
FinalFileName = %NotesPath%\%FileName%%FileNameExtra%
FileDelete, %FinalFileName%
FileAppend, %Note%, %FinalFileName%
return
CleanText:
CleanMePlease = %ClipBoard%
CleanMePlease := Regexreplace(CleanMePlease, "[^a-zA-Z0-9 ]", " ")
loop
{
StringReplace, CleanMePlease, CleanMePlease, %A_SPACE%%A_SPACE%, %A_SPACE%, all
if ErrorLevel <> 0
break
}
ClipBoard = %CleanMePlease%
Return
QNGuiEscape:
QNGuiClose:
ExitApp
returnСовет: перед использованием замените NotesPath на свой путь и убедитесь, что у вашего аккаунта есть права записи в эту папку.
Назначение горячей клавиши для запуска приложения
Самый надёжный способ — создать ярлык на рабочем столе, затем в Свойствах ярлыка задать “Shortcut key” и нажать комбинацию (например, Ctrl+Alt+N). Windows автоматически добавит комбинацию к ярлыку.
Альтернативно, можно добавить в системный автозапуск (Startup) или прописать горячую клавишу прямо в AHK‑скрипте, чтобы запускать второе окно без создания отдельного ярлыка. Пример, если ваш скрипт всегда запущен и вы хотите, чтобы по Ctrl+Alt+N показывался/скрывался GUI:
^!n::
Gui, QN:Show
returnЗдесь ^ — Ctrl, ! — Alt, n — клавиша N.
Варианты улучшения и расширения (альтернативные подходы)
- Автоматическая нумерация файлов: если FinalFileName уже существует, добавлять суффикс _1, _2 и т.д.
- Добавить временную метку в имя файла: %A_Now% или форматированную дату для удобства сортировки.
- Поддержка тегов: хранить в имени файла или внутри Markdown фронтматтер (YAML) теги и метаданные.
- Добавить кнопку «Сохранить и открыть» — после FileAppend вызывать Run, %FinalFileName% чтобы открыть заметку в редакторе.
- Локальная поддержка кириллицы: изменить Regexreplace, чтобы разрешать диапазон кириллических символов.
- Синхронизация: сохранять в папку облачного хранилища (Dropbox, OneDrive) для доступа с других устройств.
Когда такой подход не подходит (ограничения и контрпримеры)
- Требуется мощная организация, поиск по тегам, версии и блоки шаблонов — используйте Obsidian, Notion или специализированные приложения.
- Нужна мобильная синхронизация с полноценным интерфейсом — лучше выбрать облачное приложение с мобильными клиентами.
- Требуется сложная обработка вложений, изображений и бинарных файлов — AHK‑скрипт для plain text не подходит.
Модель зрелости: от прототипа до продакшена
- Уровень 0 — Прототип: минимальный скрипт, как выше. Подходит для личного использования.
- Уровень 1 — Надёжность: добавлена обработка ошибок, логирование, проверка прав доступа к папке.
- Уровень 2 — Автоматизация: автозапуск при старте системы, горячие клавиши, поддержка тем/стилей.
- Уровень 3 — Интеграция: синхронизация с облаком, плагины для поиска/индексации, резервное копирование.
Чек‑лист ролей (кто что должен проверить)
- Пользователь:
- Путь NotesPath установлен корректно.
- Скрипт запускается и окно появляется по горячей клавише.
- Заметка сохраняется в указанной папке.
- Разработчик/автоматизатор:
- Обработаны ошибки записи в файл.
- Код имеет return после каждого логического блока.
- Добавлен лог (по желанию) для отладки.
- Администратор системы:
- Папка для заметок доступна (права NTFS).
- Политики безопасности не блокируют исполнение .ahk файлов.
Критерии приёмки
- Окно открывается и фокус устанавливается в поле заголовка не позднее 0.5 секунды после команды Show.
- Содержимое буфера обмена автоматически появляется в основном поле заметки.
- При нажатии OK создаётся файл с ожидаемым именем и кодировкой UTF‑8.
- Скрипт корректно завершает работу и не остаётся в трее после закрытия окна.
Тестовые случаи
- TC1: Открыть окно, вставить текст в заголовок с недопустимыми символами, нажать OK → проверьте, что имя файла очищено и файл создан.
- TC2: Вставить большое тело заметки (>10000 символов) → проверьте, что FileAppend не обрезает текст.
- TC3: Папка NotesPath отсутствует → проверить поведение (предупреждение или автоматическое создание папки).
- TC4: Параллельные вызовы (два открытия приложения) → проверить, не перезаписывается ли файл.
Советы по локализации и путям для русскоязычных пользователей
- Если вы хотите использовать кириллицу в имени файла, измените регулярное выражение в CleanText, добавив диапазон \u0400-\u04FF (кириллица). Пример: “[^a-zA-Z0-9\u0400-\u04FF ]”.
- При использовании облачных папок учтите особенности синхрона: некоторые сервисы не любят частых мелких файлов и могут приводить к задержкам.
- Для совместимости с Windows рекомендую избегать специальных символов в именах файлов и лишних пробелов в начале/конце.
Безопасность и приватность
- Скрипт сохраняет заметки в открытом виде в указанной папке. Если в заметках конфиденциальная информация, храните папку зашифрованной (например, контейнер VeraCrypt) или используйте шифрование на уровне файлов.
- AutoHotkey‑скрипты потенциально могут запускать команды и иметь доступ к файловой системе — не запускайте скрипты из непроверенных источников.
Быстрые приемы и сниппеты (cheat sheet)
- Запуск скрипта по сочетанию клавиш, если скрипт всегда запущен:
^!n::
Gui, QN:Show
return- Открыть сохранённый файл после сохранения:
FileAppend, %Note%, %FinalFileName%
Run, %FinalFileName%- Добавить временную метку в содержимое файла перед сохранением:
TimeStamp := "# " . A_Now . "`n`n"
FileAppend, %TimeStamp% . Note, %FinalFileName%Глоссарий (одно предложение на термин)
- AutoHotkey — скриптовый язык для автоматизации действий в Windows.
- GUI — графический интерфейс пользователя (окно и его элементы в AHK).
- FileAppend — команда AHK для добавления текста в файл.
- Regexreplace — функция для замены по регулярному выражению.
Заключение
Создание ультра‑лёгкого приложения заметок с помощью AutoHotkey — практичная задача, не требующая сложных знаний. Вы получаете быстрое, настраиваемое решение, которое всегда под рукой и легко масштабируется. Если нужно больше функциональности (поиск, теги, мобильные клиенты), рассматривайте интеграцию с более продвинутыми инструментами или добавление плагинов.
Краткие рекомендации:
- Настройте NotesPath и протестируйте запись в файл.
- При необходимости расширяйте очистку заголовков под вашу локаль.
- Не забывайте о безопасности при хранении конфиденциальных заметок.
Спасибо за внимание — удачного кодинга и продуктивных заметок!
Похожие материалы
Как установить GIF‑обои в Windows 10 и 11
Массовое переименование файлов в Windows
Установка Docker Desktop на Mac
Как находить и воспроизводить GIF в Google Картинках
Сделать Windows 10 похожей на Windows 7