Вставить выделенный текст в Windows, как в Linux (средняя кнопка мыши)

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

Мне очень нравится эта функция в системах 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 для правильной работы.

Краткий обзор существующих решений

  1. True X-Mouse
    Это решение меняет поведение вашей мыши и позволяет вставлять текст при нажатии средней кнопки. Однако, у него есть значительный недостаток: оно может мешать управлению меню, таким как меню "Пуск", и затрудняет закрытие вкладок в браузере.

  2. AutoClipX
    Это приложение также нацелено на улучшение работы с буфером обмена, тем не менее, оно просто вставляет содержимое буфера, а не выделенный текст, что не соответствует вашим требованиям.

  3. Скрипты 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.

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

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