1

Тема: AutoHotkey и Total Commander: удобное выделение имени в некотор. окнах

Некоторые юзеры TC делают (скриптами) автоматическое нажатие кнопки ОК в окнах копирования/перемещения. Я - нет. И одна из причин такая: эти окна позволяют всякие расширенные функции. Например, можно скопировать/переместить файл/папку под новым именем. Лично я нахожу это удобным. Скажем, принес я от друга кучу фильмов на CD, а они (фильмы) все поголовно называются "videoout.avi". Можно, разумеется сначала его скопировать на хард, а затем переименовать, но мне удобнее переименовывать прямо в процессе копирования (в этих самых окнах копирования/перемещения). Однако есть одно неудобство: имя файла нужно сначала выделить. С клавы это делать очень неудобно. Мышью удобнее, но за неё нужно сначала взяться, потом как следует прицелиться, а потом бросить мышь, и начать вводить новое имя (я печатаю обеими руками). Неудобно - факт.
Вот я и накатал скриптец для выделения имени. Работает так: нажимаем в Тотале F5 (обычная гор.клавиша для копирования), и в появившемся окне копирования снова нажимаем F5. Имя (без расширения) выделилось. Теперь можно сразу вводить новое имя (выделенное будет удалено). Или нажать какую-нибудь из стрелок (на клаве, разумеется) и выделение будет снято, а курсор останется в конце имени. Теперь к имени можно дописать просто номер или что-то другое. То же самое и с папками. Очень удобно.
Эта фича работает в окнах копирования, перемещения, упаковки, переименования, копирования в ту же панель. Возможно, вы добавите ещё какие-нибудь окна.
Фишка не работает, если копируются/перемещаются несколько файлов/папок за раз, но это ограничения самого Тотала (я где-то читал, что в седьмой версии эти ограничения будут сняты).
Вот, короче, скриптец.

;*******************************************************************************
; AutoHotkey Version:   1.0.44.09+
; Автор:                Androgen Belkin
; Имя скрипта:          TCNameSelect.ahk (v.1.5)
;*******************************************************************************
; Выделение имени в окнах копирования, перемещения, упаковки, переименования в ТС.
;*******************************************************************************
;~ #NoTrayIcon ; не отображать иконку скрипта в трее
#NoEnv         ; запрещаем имена переменных как у переменных окружения (повышаем производительность скрипта)
SendMode Input ; новый режим высылки без задержки и повышенной надежности

; ========== НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ ===============
Total_Copy_Move_Other = TInpComboDlg|TCheckEditBox|TDLGZIP|TSTDTREEDLG ; окна, где вы хотите такую фишку
; список обрабатываемых окон (1 копир-е/перемещ-е, 2 копир-е в ту же панель, 3 упаковка, 4 переименование)
; ========== КОНЕЦ НАСТРОЕК ПОЛЬЗОВАТЕЛЯ ==========
Loop, parse, Total_Copy_Move_Other, | ; обработать список окон для обработки (разделитель - "|")
    GroupAdd, TC_WinGroup, ahk_class %A_LoopField% ; добавляем все указанные окна в группу

;-----------------------------------------------------------------------------
~F5:: ; F5 - выделение имени в окнах копирования, перемещения, упаковки, переименования в ТС
;-----------------------------------------------------------------------------
IfWinActive, ahk_group TC_WinGroup ; если активно к-либо окно из группы, то...
{
    ControlGetText, Text_From_Control, TEdit1, ahk_group TC_WinGroup ; получить текст из контрола
    SplitPath, Text_From_Control,,, Ext, Name_No_Ext ; получить из строки имя и расширение
    Send, % "{END}{LEFT " StrLen( Ext ) + StrLen( Name_No_Ext ) + 1 "}" ; переместить курсор к началу имени
    IfInString, Text_From_Control, *.* ; если обрабатываемое имя - имя папки, или выделено несколько файлов, то...
        Send, +{END} ; выделить имя    целиком (прихватив "расширение" "*")
    Else
        Send, % "+{RIGHT " StrLen( Name_No_Ext ) "}" ; выделить только имя
}
Return ; закончить обработку горячей клавиши
;-----------------------------------------------------------------------------

;-----------------------------------------------------------------------------
#IfWinActive, ahk_group TC_WinGroup ; если активное окно из назначенной группы ТС, то...
;-----------------------------------------------------------------------------
    ~Right:: Check_Sel( "Left" ) ; снимаем выделение, перемещая курсор, и возвращаем курсор назад
    ~Left:: Check_Sel( "Right" ) ; снимаем выделение, перемещая курсор, и возвращаем курсор назад
    ~Down:: Check_Sel( "Left" ) ; снимаем выделение, перемещая курсор, и возвращаем курсор назад
    ~Up:: Check_Sel( "Right" ) ; снимаем выделение, перемещая курсор, и возвращаем курсор назад
;-----------------------------------------------------------------------------
    Check_Sel( Key ) ; функция корректировки положения курсора в зависимости от наличия выделения
    {
        BatchLinesBefore = %A_BatchLines% ; запоминаем текущую скорость выполнения скрипта
        SetBatchLines, -1 ; ставим макс. скорость
        VarSetCapacity( Sel_Start, 4 ) ; обеспечиваем вместимость переменной для 32-битного целого числа
        VarSetCapacity( Sel_End, 4 ) ; обеспечиваем вместимость переменной для 32-битного целого числа
        ; 0xB0 = EM_GETSEL
        SendMessage 0xB0, &Sel_Start, &Sel_End, TEdit1, ahk_group TC_WinGroup ; получаем выделение в окне (синтаксис адресации)
        Sel_Start := *( &Sel_Start ) + ( *( &Sel_Start + 1 ) << 8 ) ; получаем начало выделения (номер символа)
        Sel_End := *( &Sel_End ) + ( *( &Sel_End + 1 ) << 8 ) ; получаем конец выделения (номер символа)
        ControlGetText, Text_From_Control, TEdit1, ahk_group TC_WinGroup ; получить текст из контрола
        If ( Sel_Start != Sel_End ) ; если что-то выделено, то...
            Send, {%Key%} ; корректируем положение курсора (возвращаем его назад после сдвига горячей клавишей)
        If ( Sel_End = StrLen( Text_From_Control ) AND Key = "Left") ; если курсор был в конце и была нажата клавиша Right, то...
            Send, {Right} ; отменяем предыдущую коррекцию положения курсора (возвращаем его на место)
        SetBatchLines, %BatchLinesBefore% ; возвращаем прежнюю скорость выполнения скрипта
    } ; конец функции
;-----------------------------------------------------------------------------
Крокодил, крокожу и буду крокодить! (Твёрдое обещание нетрезвого кодера).