Linux вставляет содержимое буфера обмена в “случайные” моменты времени.

Вопрос или проблема

Я буду редактировать файлы, активно используя клавиатуру и иногда мышь, особенно для переключения окон и тому подобного. Мои программы открываются с ошибками синтаксиса, которые в конечном итоге появляются из-за вставки из буфера обмена в редактор. Это происходит в любом обычном редакторе, не так сильно в Gvim (в основном из-за неординарных последовательностей клавиш).

У моей мыши есть колесо прокрутки. Колесо прокрутки можно нажать как кнопку. У него есть 2 основные кнопки слева и справа.

Также есть 2 кнопки слева с надписями + и -, которые я почти никогда не нажимаю. Я редко, если вообще когда-либо, нажимаю на колесо прокрутки, но использую его для прокрутки активных окон.

На что мне обратить внимание? Это стандартная установка Debian

$ set |grep DESKTOP
CHROME_DESKTOP=code-url-handler.desktop
DESKTOP_SESSION=mate
MATE_DESKTOP_SESSION_ID=this-is-deprecated
ORIGINAL_XDG_CURRENT_DESKTOP=MATE
XDG_CURRENT_DESKTOP=MATE
XDG_SESSION_DESKTOP=mate

$ cat /etc/*release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.1 LTS"
PRETTY_NAME="Ubuntu 22.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.1 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

Также есть 2 кнопки слева с надписями + и -, которые я почти никогда не нажимаю. Я редко, если вообще когда-либо, нажимаю на колесо прокрутки, но использую его для прокрутки активных окон.

Это средний щелчок мыши. Обычно в графических UNIX он используется как “вставить из буфера обмена”. Так что это ожидаемое поведение! Вы не сможете отключить это во всех программах, но в некоторых сможете. Это зависит от программы.

Я использую Ubuntu 24.04 и сталкиваюсь с той же проблемой. Я часто использую TextEdit и Sublime Text для редактирования исходного кода. Я заметил, что мой код постоянно портится при редактировании с помощью любого редактора из-за случайной вставки текста в код во время прокрутки колесом мыши. Прежде всего, позвольте мне объяснить поведение колеса мыши под разными операционными системами, а затем я дам вам решение для Ubuntu.

Вот разбивка того, как по умолчанию ведет себя средняя кнопка мыши (щелчок колеса) в Windows и Ubuntu:

Windows (10/11):

  • По умолчанию, Windows не включает функцию щелчка средней кнопки с помощью колеса мыши для большинства приложений (включая текстовые редакторы). Вместо этого, щелчок средней кнопкой обычно используется в специализированных приложениях (например, веб-браузерах для управления вкладками или в программном обеспечении для 3D-моделирования), но он не активно сопоставляется с вставкой содержимого буфера обмена в большинстве случаев.
  • Вставка из буфера обмена: В Windows функция вставки средней кнопкой не привязана автоматически к буферу обмена в большинстве приложений. Требуется более специфическая программа или действие для этого, что может быть причиной, по которой вы не сталкиваетесь с этой проблемой.

Ubuntu (Linux):

  • В Ubuntu и многих других дистрибутивах Linux средняя кнопка мыши
    (щелчок колеса) часто сопоставляется с вставкой содержимого буфера обмена или текущего выделения по умолчанию. Такое поведение обычно связано с оконной системой X11 и тем, как она обрабатывает события мыши. Средний щелчок вставляет содержимое текущего буфера обмена или выделения в текстовые поля или документы, что может вызвать проблему, когда вы случайно нажимаете на колесо во время прокрутки, как вы испытываете.

Почему это происходит?

  • Управление буфером обмена: В Linux (Ubuntu) механизм “Primary Selection” отличается от Windows и macOS. В Linux щелчок средней кнопкой по умолчанию вставляет буфер обмена “Primary Selection” (то есть последний выделенный текст), а не буфер обмена, который вы активно копируете с помощью Ctrl+C.

  • Windows и macOS не используют такое поведение, поэтому функция средней кнопки
    в основном зарезервирована для других функций (например, для открытия
    ссылок в браузерах или для использования в специфических программах, а не для вставки из буфера обмена).

Мой случай использования
Я редактирую большой скрипт и замечаю, что неправильно назвал переменную из-за ошибки в написании. Чтобы решить проблему, я:

  • Дважды щелкаю по неправильно написанному имени переменной.

  • Нажимаю Ctrl+f, чтобы найти все вхождения.

  • Не снимая выделение с того, что я ранее выделил двойным кликом, я прокручиваю колесо мыши, чтобы увидеть все выделенные вхождения.

  • Прокручивая колесо мыши, я случайно нажимаю на него и, бац! Поскольку текст, который я искал, все еще выделен благодаря двойному клику, этот выделенный текст был вставлен в мой код. Я этого не заметил, так как это уже пролисталось за экран.

  • Я сохраняю свои изменения и запускаю скрипт, и появляются ошибки. Я обнаруживаю, что текст, который я искал, был вставлен 6 раз в казалось бы случайных местах в моем скрипте. Если я не помню текст, который искал, исправить код очень сложно.

Чтобы решить свою проблему, я создал службу systemd в /etc/systemd/system, которая будет отключать все щелчки колесом мыши каждые 10 секунд, независимо от того, сколько мышей подключено. Вот код:

Обновленный скрипт с обработкой ошибок (disable_all_middle_click.sh)

#!/bin/bash

# Проходим все подключенные устройства указателя (мыши)
for device_id in $(xinput list | grep -i "pointer" | grep -oP 'id=\K\d+'); do
    # Пытаемся отключить средний щелчок (кнопку 2) для каждого устройства
    if xinput set-button-map "$device_id" 1 0 3 4 5 2>/dev/null; then
        echo "Средний щелчок отключен для устройства $device_id"
    else
        # Если была ошибка (например, устройство отключено), переходим к следующему устройству
        echo "Ошибка отключения среднего щелчка для устройства $device_id. Устройство может быть отключено."
    fi
done

/etc/systemd/system/disable-middle-click-all.service

[Unit]
Description=Отключение среднего щелчка для всех мышей

[Service]
ExecStart=/path/to/disable_all_middle_click.sh
Restart=always
RestartSec=10
User=<your-username>
StandardOutput=null
StandardError=journal

[Install]
WantedBy=multi-user.target

Надеюсь, это поможет.

Ответ или решение

Вопрос о случайной вставке содержания буфера обмена в редакторе на Linux, как выяснилось, связан с особенностями работы операционных систем семейства GNU/Linux и их взаимодействия с элементами управления, такими как мышь. Рассмотрим подробно теоретическую часть, затем приведем примеры, и наконец, я предложу практическое решение проблемы.

Теория

Для начала, давайте разберемся, как в Linux реализуется взаимодействие между средствами ввода пользователем и оконной системой. В отличие от Windows, в Linux используется концепция двух буферов обмена: "Clipboard" и "Primary Selection". "Clipboard" — это аналог буфера обмена в Windows, который заполняется при помощи комбинаций клавиш, таких как Ctrl+C и Ctrl+V. "Primary Selection" — это другой механизм, который запоминает выделенный пользователем текст без явного копирования.

В X11 системах, таких как Ubuntu, "Primary Selection" вставляется с помощью среднего клика мыши (нажатием на колесо прокрутки). Эта функция может вызвать проблемы, когда пользователь случайно нажимает колесо в процессе прокрутки, что и приводит к вставке текста из "Primary Selection" в местах, где курсор находится в данный момент.

В отличие от Linux, операционные системы Windows и macOS не используют это поведение по умолчанию, и средний клик используется для других функций, таких как открытие ссылок в новых вкладках или управление специализированным софтом.

Пример

Предположим, вы занимаетесь изменением текста в редакторе, таком как Sublime Text или Gedit. Вы выделили слово, которое пытаетесь найти в тексте, и начинали прокручивать документ своим колесом прокрутки, не отпуская выделение. В процессе этого случайно нажали на колесо. В результате выделенная часть текста была вставлена в документ в месте текущего положения курсора, причем, если вы не заметите это сразу, может привести к ошибкам в коде или просто к структурным изменениям текста, затрудняющим его дальнейшее редактирование.

Приложение

Чтобы устранить эту проблему в среде Linux, существуют несколько подходов, начиная от технического отключения функции срединного клика до корректировок пользовательских привычек. Один из способов состоит в том, чтобы отключить функцию среднего клика на уровне системы, используя утилиту xinput.

Рассмотрим настройку службы systemd, которая будет отключать функцию среднего клика каждые 10 секунд, что позволяет оставаться уверенным в отсутствии случайных вставок:

  1. Создание скрипта disable_all_middle_click.sh:

    #!/bin/bash
    
    for device_id in $(xinput list | grep -i "pointer" | grep -oP 'id=\K\d+'); do
       if xinput set-button-map "$device_id" 1 0 3 4 5 2>/dev/null; then
           echo "Middle-click disabled for device $device_id"
       else
           echo "Error disabling middle-click for device $device_id. Device may be unplugged."
       fi
    done
  2. Создание сервиса:

    Сохраните следующее содержимое с именем disable-middle-click-all.service в каталоге /etc/systemd/system/:

    [Unit]
    Description=Disable middle-click for all mice
    
    [Service]
    ExecStart=/path/to/disable_all_middle_click.sh
    Restart=always
    RestartSec=10
    User=<your-username>
    StandardOutput=null
    StandardError=journal
    
    [Install]
    WantedBy=multi-user.target
  3. Запуск и активация сервиса:

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

    sudo systemctl daemon-reload
    sudo systemctl enable disable-middle-click-all.service
    sudo systemctl start disable-middle-click-all.service

Этот подход позволит вам избежать случайных вставок из-за среднего клика, обеспечивая более безопасное и комфортное использование текстовых редакторов на Linux. Важно помнить, что хотя такое решение эффективно, оно является обходным путем, и если чересчур нарушает привычки работы, возможно, стоит рассмотреть изменения в программных настройках конкретных приложений или же выбор аппаратных средств, например, использование более подходящей модели мыши.

Оцените материал
Добавить комментарий

Капча загружается...