;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; Total Commander DreamLair ; ; Script: Selection the same name files and/or dirs in the panels ; ; Скрипт: Виділення в панелях однойменних файлів та/або каталогів ; ; Скрипт: Выделение в панелях одноимённых файлов и/или каталогов ; ; Version: 2.0 (2018.09.24) ; ; Required: Total Commander 9.0+ ; ; Tested on: Total Commander 9.21a ; ; Author: LonerD DreamLair.net ; ; Made in Donetsk People's Republic ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; Parameter: ; ; 1) Selection mode: ; ; 1 - all (default); 2 - only files; 3 - only dirs ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; Параметр: ; ; 1) Метод виділення: ; ; 1 - все (за замовч.); 2 - тільки файли; 3 - тільки каталоги ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; Параметр: ; ; 1) Метод выделения: ; ; 1 - всё (по умолчанию); 2 - только файлы; 3 - только каталоги ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; #NoEnv #NoTrayIcon #MaxMem 1024 #SingleInstance force SetBatchLines, -1 ; Визначаємо метод виділення Mode = %1% if Mode not in 1,2,3 Mode = 1 ; файли і каталоги ; Зберігаємо вміст буфера ClipSaved := ClipboardAll Clipboard := "" ; Отримуємо ID (якщо вікно Тотала неактивно - виходимо) if not ( WinExist("ahk_class TTOTAL_CMD") || WinActive("ahk_class TTOTAL_CMD") ) ExitApp WinGet, hw_TTOTAL_CMD, ID, A global hw_TTOTAL_CMD ; Блокуємо перемальовування вікна Тотала DllCall("LockWindowUpdate", "uint", hw_TTOTAL_CMD) ; Визначаємо активну панель та отримуємо шлях в активній панелі TCPanelA := SendMessageTC(1074, 1000, 0, A) ; get active panel: 1=left, 2=right hw_TCPathA := SendMessageTC(1074, 8+TCPanelA, 0, A) ; get HWND: 9=leftpath, 10=rightpath ControlGetText, PathA,, % "ahk_id " hw_TCPathA PathA := StrReplace(PathA, "\*.*", "\") ; і шлях у панелі призначення hw_TCPathB := SendMessageTC(1074, 11-TCPanelA, 0, A) ; get HWND: 9=leftpath, 10=rightpath ControlGetText, PathB,, % "ahk_id " hw_TCPathB PathB := StrReplace(PathB, "\*.*", "\") ; Знімаємо все виділення SendMessage, 1075, 524,,, % "ahk_id " hw_TTOTAL_CMD ; Виділяємо файли і каталоги (як вказано в налаштуваннях) SendMessage, 1075, 330 . Mode,,, % "ahk_id " hw_TTOTAL_CMD ; Перевіряємо - чи є виділення SelItems := SendMessageTC(1074, 1004+TCPanelA, 0, A) ; Якщо виділення немає - виходимо if ( SelItems = 0 ) Goto, Exit ; Якщо ж виділення є, то робимо нашу чорну справу ; Копіюємо імена всіх виділених елементів до буфера обміну (зі шляхами і без) SendMessage, 1075, 2017,,, % "ahk_id " hw_TTOTAL_CMD FilesA := Clipboard SendMessage, 1075, 2018,,, % "ahk_id " hw_TTOTAL_CMD FileListA := Clipboard ; Переводимо курсор на іншу панель SendMessage, 1075, 4006,,, % "ahk_id " hw_TTOTAL_CMD ; Повторюємо операції SendMessage, 1075, 524,,, % "ahk_id " hw_TTOTAL_CMD SendMessage, 1075, 330 . Mode,,, % "ahk_id " hw_TTOTAL_CMD ; Якщо зліва та справа одна й та сама панель - виходимо, залишивши виділення if ( PathA = PathB ) Goto, Exit ; Якщо немає виділення - повертаємось на першу панель і знімаємо виділення там SelItems := SendMessageTC(1074, 1007-TCPanelA, 0, A) if ( SelItems = 0 ) Goto, NoSelection ; Копіюємо імена всіх виділених елементів до буфера обміну (зі шляхами і без) SendMessage, 1075, 2017,,, % "ahk_id " hw_TTOTAL_CMD FilesB := Clipboard SendMessage, 1075, 2018,,, % "ahk_id " hw_TTOTAL_CMD FileListB := Clipboard ; Обробляємо отримані значення, складаємо список усіх однакових файлів за іменами FileListSel := "" Loop, Parse, FilesA, `n, `r { CurrentFile := A_LoopField Loop, Parse, FilesB, `n, `r { if ( CurrentFile = A_LoopField ) FileListSel := FileListSel A_LoopField "`r`n" } } ; Якщо не знаходимо співпадаючих файлів - знімаємо все виділення та виходимо if ( FileListSel = "" ) Goto, NoSelection ; А тепер складаємо списки файлів, що будуть виділятись FileListSelA := "" FileListSelB := "" FileListSelX := "" FileListX := FileListB Gosub, LoopFilelist FileListSelB := FileListSelX FileListX := FileListA Gosub, LoopFilelist FileListSelA := FileListSelX ; Видаляємо зайві шляхи (для режиму перегляду без каталогів, для архівів і т.д.) StringReplace, FileListSelA, FileListSelA, % PathA, , All StringReplace, FileListSelB, FileListSelB, % PathB, , All ; І відправляємо результат для панелі B до буфера обміну Clipboard := FileListSelB ; Завантажуємо виділення з буфера SendMessage, 1075, 2033,,, % "ahk_id " hw_TTOTAL_CMD ; Переводимо курсор на першу панель SendMessage, 1075, 400 . TCPanelA,,, % "ahk_id " hw_TTOTAL_CMD ; І відправляємо результат для панелі A до буфера обміну Clipboard := FileListSelA ; Завантажуємо виділення з буфера SendMessage, 1075, 2033,,, % "ahk_id " hw_TTOTAL_CMD Exit: Clipboard := ClipSaved ClipSaved := "" FileListA := "" FileListB := "" FileforSel := "" FileListSelA := "" FileListSelB := "" FileListSelX := "" ; Нарешті розблокуємо вікно Тотала та виходимо DllCall("LockWindowUpdate", "uint", 0) ExitApp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; Отака єклмн підпрограма для перевірки наявності імені файлу в списку файлів зі шляхами ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; LoopFilelist: Loop, Parse, FileListSel, `n, `r ; обираємо по черзі рядки зі співпадаючими файлами { FileforSel := A_LoopField FileLen := StrLen(FileforSel) ; визначаємо довжину файлу чи каталогу if ( FileLen > 0 ) { Loop, Parse, FileListX, `n, `r ; обираємо по черзі рядки для перевірки наявності в них файлу { StringLen := StrLen(A_LoopField) ; визначаємо довжину рядка (файл/каталог зі шляхом) SlashSymbol := SubStr(A_LoopField, StringLen - FileLen, 1) ; визначаємо порядковий номер символу перед ім'ям файлу, якщо це слеш - то це рядок з потрібним файлом StringRight, CurrentFile, A_LoopField, FileLen ; Обрізаємо рядок зі шляхом з кінця щоб залишилась лише назва файлу if (( StringLen - FileLen > 1 ) && ( SlashSymbol = "\" ) && ( CurrentFile = FileforSel )) ; якщо перевіряємий файл має ім'я, якщо рядок потрібноії довжини, якщо файл відділяється слешем, якщо назва файлу співпадає з перевіряємим файлом FileListSelX := FileListSelX A_LoopField "`r`n" ; тоді додаємо цей файл до списку виділення } } } Return ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; Якщо немає виділення чи співпадаючих файлів ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; NoSelection: SendMessage, 1075, 524,,, % "ahk_id " hw_TTOTAL_CMD SendMessage, 1075, 4006,,, % "ahk_id " hw_TTOTAL_CMD SendMessage, 1075, 524,,, % "ahk_id " hw_TTOTAL_CMD Goto, Exit ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; Total Commander Send Message function ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; SendMessageTC(TCMsg, wParam, lParam, aControl) { SendMessage, % TCMsg, % wParam, % lParam, % aControl, % "ahk_id " hw_TTOTAL_CMD return ErrorLevel } ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;