Вы используете Autokey для автоматизации ввода даты, но в LibreOffice Writer вместо аккуратной замены «dt» на «25 February 2024» получаете странные артефакты вроде «dt 25 February 2t today»?. Проблема связана с особенностями обработки ввода в Writer, но её можно обойти парой хитрых модификаций скрипта.
Почему Writer «ломает» Autokey
LibreOffice Writer, в отличие от других редакторов (Thunderbird, терминал), обрабатывает ввод символов с задержкой. Когда Autokey отправляет данные слишком быстро, Writer не успевает их принять. В логах видно, что скрипт отправляет три Backspace для удаления «dt» и сразу вставляет дату. Но Writer теряет часть действий из-за своей медленной обработки – отсюда «рассыпавшиеся» символы.
Окно лога Autokey для Writer:
Input queue at end of handle_keypress: deque([' ', 'd', 't'], maxlen=150)
Send special key: [<Key.BACKSPACE: ''>] (трижды)
Sending string: '25 February 2025'
Для сравнения, в Betterbird (аналог Thunderbird) очередь ввода очищается корректно, и дата вставляется без ошибок. Разница – в скорости обработки событий.
Как заставить скрипт работать в Writer
Решение – использовать буфер обмена и добавить небольшую задержку. Вот модифицированный код:
import time
# Формируем дату через time вместо system.exec_command
datestring = time.strftime('%d %B %Y')
# Копируем в буфер обмена (это надёжнее прямого ввода)
clipboard.fill_clipboard(datestring)
# Даём Writer время на обработку (0.1 сек обычно достаточно)
time.sleep(0.1)
# Вставляем через Ctrl+V
keyboard.send_keys("+v")
Почему это работает:
- Буфер обмена – вставка через Ctrl+V воспринимается Writer как единое действие, а не поток символов;
- Задержка time.sleep(0.1) – даёт приложению «передохнуть» перед вставкой;
- Отказ от system.exec_command – генерация даты через time.strftime быстрее и стабильнее.
Кстати, если после вставки появляется лишний пробел, попробуйте убрать его из скрипта или уменьшить задержку до 0.05 секунд. Иногда Writer «добирает» символы из буфера с опозданием.
Дополнительные настройки и подводные камни
Даже с исправленным скриптом могут возникать нюансы:
- Зависимость от версии LibreOffice – в старых релизах (до 7.4) проблема проявляется чаще. Обновите пакет, если возможно.
- Конфликты с другими горячими клавишами – убедитесь, что Ctrl+V не переопределён в настройках Writer (Сервис → Параметры → Клавиатура).
- Буфер обмена – некоторые менеджеры буфера (типа Clipman) могут перехватывать содержимое. На время отключайте их для тестов.
Если скрипт всё равно работает нестабильно, добавьте вторую задержку после вставки:
keyboard.send_keys("+v")
time.sleep(0.05) # Дополнительная пауза для Writer
Помните: Writer – не идеален для автоматизации. Для частой работы с шаблонами дат попробуйте встроенные функции («Поле → Дата») или макросы. Но если хочется именно Autokey, приведённый метод – самый стабильный из известных.
P.S. Кстати, аналогичная проблема бывает в Vim и Emacs – там мешают собственные сочетания клавиш. Для них лучше использовать плагины вместо Autokey.