Вопрос или проблема
Я буду редактировать файлы, активно используя клавиатуру и иногда мышь, особенно для переключения окон и тому подобного. Мои программы открываются с ошибками синтаксиса, которые в конечном итоге появляются из-за вставки из буфера обмена в редактор. Это происходит в любом обычном редакторе, не так сильно в 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 секунд, что позволяет оставаться уверенным в отсутствии случайных вставок:
-
Создание скрипта
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
-
Создание сервиса:
Сохраните следующее содержимое с именем
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
-
Запуск и активация сервиса:
В командной строке выполните:
sudo systemctl daemon-reload sudo systemctl enable disable-middle-click-all.service sudo systemctl start disable-middle-click-all.service
Этот подход позволит вам избежать случайных вставок из-за среднего клика, обеспечивая более безопасное и комфортное использование текстовых редакторов на Linux. Важно помнить, что хотя такое решение эффективно, оно является обходным путем, и если чересчур нарушает привычки работы, возможно, стоит рассмотреть изменения в программных настройках конкретных приложений или же выбор аппаратных средств, например, использование более подходящей модели мыши.