Вопрос или проблема
Мне очень нравится эта функция в системах Linux. Я хочу, чтобы она была и в моих системах Windows, но я не нашел подходящего решения.
Решения, которые я нашел:
- True X-Mouse
- AutoclipX
- Скрипт Autohotkey
Проблемы, с которыми я столкнулся:
- True X-Mouse изменяет фокус мыши, что я не хочу, чтобы было активно в Windows, потому что это просто мешает меню, как меню Пуск. Также вы не можете закрыть вкладки средней кнопкой мыши, если она активна.
- AutoClipX просто вставляет содержимое буфера обмена, а не выделенный текст.
- Скрипт Autohotkey найденный здесь мешает консольным приложениям в Windows. Если вы переключаетесь на консоль, щелкнув по ней, она вставит Ctrl+C, что довольно раздражает.
Кто-либо нашел подходящее решение или исправление для проблем, с которыми я столкнулся с этими тремя решениями?
Реализация копирования при выделении:
Попробуйте так:
#NoEnv
#SingleInstance Force
mousedrag_treshold := 20 ; пиксели
Горячая клавиша mbutton, paste_selection
; #IfWinNotActive ahk_class ConsoleWindowClass
~lButton::
MouseGetPos, mousedrag_x, mousedrag_y
keywait lbutton, T0.3
If (ErrorLevel)
{
keywait lbutton
mousegetpos, mousedrag_x2, mousedrag_y2
if (abs(mousedrag_x2 - mousedrag_x) > mousedrag_treshold
or abs(mousedrag_y2 - mousedrag_y) > mousedrag_treshold)
{
; MouseGetPos,,,WindowUnderMouse
; WinGetClass, Class, ahk_id %WindowUnderMouse%
; If (Class != "ConsoleWindowClass")
sendinput ^c
hotkey mbutton, on
}
}
return
~lButton Up:: return
; #IfWinNotActive
paste_selection:
sendinput {lbutton}
SendInput ^v
return
Я немного улучшил вышеуказанный скрипт в конце. Просто добавил условие, чтобы проверить, занят ли буфер обмена, и также очистил его после вставки. Другим улучшением является отключение горячей клавиши mbutton после вставки, чтобы она не мешала средним щелчкам для закрытия вкладок или прокрутки, пока не будет выделен и [автоматически] скопирован текст в следующий раз.
#NoEnv
#SingleInstance Force
mousedrag_threshold := 20 ; пиксели
Горячая клавиша mbutton, paste_selection
; #IfWinNotActive ahk_class ConsoleWindowClass
~lButton::
MouseGetPos, mousedrag_x, mousedrag_y
keywait lbutton, T0.3
If (ErrorLevel)
{
keywait lbutton
mousegetpos, mousedrag_x2, mousedrag_y2
if (abs(mousedrag_x2 - mousedrag_x) > mousedrag_threshold
or abs(mousedrag_y2 - mousedrag_y) > mousedrag_threshold)
{
; MouseGetPos,,,WindowUnderMouse
; WinGetClass, Class, ahk_id %WindowUnderMouse%
; If (Class != "ConsoleWindowClass")
sendinput ^c
hotkey mbutton, on
}
}
return
~lButton Up:: return
; #IfWinNotActive
Измененная часть:
paste_selection:
if clipboard!=""
{
sendinput {lbutton}
SendInput ^v
Sleep, 200 ; Дайте немного времени для вставки текста.
clipboard = ; очистить буфер обмена
hotkey mbutton, off
}
return
Работает безупречно -> https://github.com/capitanbarbosa/linux_middle_click_for_windows
#Requires AutoHotkey v2.0
MButton::
{
; Проверьте, находится ли курсор над элементом управления редактирования или другим текстовым вводом
if (A_Cursor = "IBeam")
{
prevClipboard := A_Clipboard
A_Clipboard := ""
; Попробуйте скопировать любой выделенный текст
Send("^c")
ClipWait(0.5)
if (A_Clipboard != "")
{
; Текст был выделен и скопирован, оставим его в буфере обмена
return
}
; Если текст не скопирован и ничего не выделено, вставьте предыдущий контент буфера обмена
if (A_Clipboard == "")
{
A_Clipboard := prevClipboard
Send("^v")
return
}
; Если текст не был скопирован, попробуйте выделить весь текст и скопировать
Send("^a^c")
ClipWait(0.5)
if (A_Clipboard != "")
{
; Текст был скопирован после выделения всего, оставим его в буфере обмена
Send("{Right}") ; Переместите курсор в конец текста
return
}
; Если опять нет текста, вставьте предыдущий контент буфера обмена
A_Clipboard := prevClipboard
Send("^v")
}
else
{
; Не над текстовым вводом, выполните обычный средний щелчок
Send("{MButton}")
}
}
Ответ или решение
Как вставить выделенный текст в Windows, как это делается в Linux (средняя кнопка мыши)
Многие пользователи Linux привыкли к удобству вставки выделенного текста с помощью средней кнопки мыши. Однако в Windows по умолчанию эта функция не реализована. В данной статье мы обсудим, как вы можете добиться аналогичного функционала, рассмотреть существующие решения и их недостатки, а также предоставить улучшенный скрипт на AutoHotkey для правильной работы.
Краткий обзор существующих решений
-
True X-Mouse
Это решение меняет поведение вашей мыши и позволяет вставлять текст при нажатии средней кнопки. Однако, у него есть значительный недостаток: оно может мешать управлению меню, таким как меню "Пуск", и затрудняет закрытие вкладок в браузере. -
AutoClipX
Это приложение также нацелено на улучшение работы с буфером обмена, тем не менее, оно просто вставляет содержимое буфера, а не выделенный текст, что не соответствует вашим требованиям. -
Скрипты AutoHotkey
Некоторые скрипты AutoHotkey могут имитировать это поведение, но они имеют свои ограничения. Например, решённая проблема с неправильным вставлением текста в консольные приложения.
Проблемы с первоначальными решениями
При использовании перечисленных решений вы столкнулись с рядом проблем:
- True X-Mouse interferes with menu operations and makes it difficult to close tabs.
- AutoClipX не копирует выделенный текст, а просто вставляет то, что находится в буфере обмена.
- Скрипты AutoHotkey накладывают ограничения на работу с консольными приложениями, вызывая нежелательное поведение при переключении между окнами.
Оптимизированный AutoHotkey скрипт
Для преодоления вышеупомянутых ограничений я предлагаю улучшенный скрипт на AutoHotkey. Этот скрипт будет копировать выделенный текст и позволит вставлять его, а также будет избегать конфликтов с другими функциями мыши:
#Requires AutoHotkey v2.0
MButton::
{
; Проверяем, находится ли курсор над текстовым полем
if (A_Cursor = "IBeam")
{
prevClipboard := A_Clipboard
A_Clipboard := ""
; Пытаемся скопировать выделенный текст
Send("^c")
ClipWait(0.5)
if (A_Clipboard != "") ; Если текст скопирован
{
return
}
; Если не был скопирован текст, вставляем предыдущий буфер
if (A_Clipboard == "")
{
A_Clipboard := prevClipboard
Send("^v")
return
}
; Если никакого текста нет, пробуем выбрать все и снова скопировать
Send("^a^c")
ClipWait(0.5)
if (A_Clipboard != "")
{
Send("{Right}") ; Перемещаем курсор в конец текста
return
}
; Если всё равно не удалось, вставляем предыдущий буфер
A_Clipboard := prevClipboard
Send("^v")
}
else
{
; Если не над текстовым полем, осуществляем обычное нажатие средней кнопки
Send("{MButton}")
}
}
Заключение
Предложенный скрипт является мощным инструментом, который позволяет эффективно копировать и вставлять текст помещением выделенного текста в буфер обмена по нажатию средней кнопки мыши. Это решение также устраняет проблемы с несоответствиями и конфликты в работе с различными приложениями и интерфейсами Windows.
При использовании AutoHotkey вы получаете гибкость и возможность настройки. Скрипт можно адаптировать под ваши специфические нужды, обеспечив максимум комфорта при работе. Если вы хотите узнать больше, вы можете ознакомиться с источником на GitHub: GitHub AutoHotkey Middle Click for Windows.
Эта информация, возможно, поможет вам восстановить привычное поведение из Linux и улучшить среду работы в Windows.