Почему Autokey некорректно работает в LibreOffice Writer: решение проблемы

Вы используете 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 «добирает» символы из буфера с опозданием.

Дополнительные настройки и подводные камни

Даже с исправленным скриптом могут возникать нюансы:

  1. Зависимость от версии LibreOffice – в старых релизах (до 7.4) проблема проявляется чаще. Обновите пакет, если возможно.
  2. Конфликты с другими горячими клавишами – убедитесь, что Ctrl+V не переопределён в настройках Writer (Сервис → Параметры → Клавиатура).
  3. Буфер обмена – некоторые менеджеры буфера (типа Clipman) могут перехватывать содержимое. На время отключайте их для тестов.

Если скрипт всё равно работает нестабильно, добавьте вторую задержку после вставки:

keyboard.send_keys("+v")
time.sleep(0.05)  # Дополнительная пауза для Writer

Помните: Writer – не идеален для автоматизации. Для частой работы с шаблонами дат попробуйте встроенные функции («Поле → Дата») или макросы. Но если хочется именно Autokey, приведённый метод – самый стабильный из известных.

P.S. Кстати, аналогичная проблема бывает в Vim и Emacs – там мешают собственные сочетания клавиш. Для них лучше использовать плагины вместо Autokey.

Новое
Интересное