Синхронная смена каталогов
Select messages from
# through # FAQ
[/[Print]\]
Goto page 1, 2, 3, 4, 5, 6, 7, 8, 9  Next  :| |:
Total Commander -> Автоматизация Total Commander

#1: Синхронная смена каталогов Author: ingerard PostPosted: Sat Dec 23, 2017 19:37
    —
Есть встроенная ТК команда "cm_SyncChangeDir", но она настолько немая и тугая что раздражает, она не показывает что включена или сбросилась, не показывает в какие каталоги лучше не заходить чтоб она не сбросилась. Вот это ее авто-отключение все портит, особенно когда имеешь дело с большим количеством каталогов.
Самый простой вариант решения этой проблемы - пока она включена, то в каталоги у которых нет похожих на другой панели заходить нельзя, то есть при нажатии "Enter" ничего не происходит. Или с этой функцией запускать еще "cm_CompareDirsWithSubdirs", которая хоть как-то будет отображать в какие папки не заходить. Но скорее все это реализовать сложно или невозможно, по-этому прошу скрипт, который открывает одновременно папку под курсором в активной панели и папку похожую по названию в другой панели, а если такой папки нет, то в скрипте будет две опции "ничего не делать" или "зайти в папку только в активной панели".

p.s. нашел в памяти ТК флаг состояния "cm_SyncChangeDir" по адресу "0075C4D8" размер 1 байт, можно ли его как-то использовать?

#2:  Author: FlasherLocation: Москва PostPosted: Sat Dec 23, 2017 21:07
    —
ingerard wrote:
она не показывает что включена или сбросилась
Почему же? Показывает. Что в тулбаре, что в главном меню.

#3:  Author: ingerard PostPosted: Sat Dec 23, 2017 22:00
    —
Flasher
Quote:
Почему же? Показывает. Что в тулбаре, что в главном меню.

Можно ли как-то считывать ее состояние?

И что насчет скрипта, сделать возможно?

#4:  Author: AvadaLocation: Россия, Саратов PostPosted: Sun Dec 24, 2017 00:32
    —
ingerard
Активность команды прекрасным образом отображается нажатым состоянием кнопки для неё на панели инструментов. Или обрамлением значка в меню. Если кнопка самопроизвольно стала отжатой, синхронизировать больше стало нечего. Вот и всё. Идею насчёт отображения "в какие папки не заходить" я, честно говоря, в изложенном виде не понял — ни со скриптом, ни без скрипта. Не говоря про то, что синхронно открываются папки не с похожими названиями, а с теми же самыми.

#5:  Author: FlasherLocation: Москва PostPosted: Sun Dec 24, 2017 13:03
    —
ingerard wrote:
Можно ли как-то считывать ее состояние?
Теоретически. Если бы был неких стиль окна, то — без проблем.
ingerard wrote:
И что насчет скрипта, сделать возможно?
Конечно. И опять же, не похожие, а одноимённые. Сделал пока по цепочке после буквы диска:
Code:
'============================== VBS ==============================
' Синхронное открытие каталогов в панелях ТС за вычетом букв диска
' Параметры: %V "%P" "%T"
' Ключ запрета несинхронного открытия: /n
'=================================================================
Set A = WSH.Arguments : V = A(0) : T = A(2)
With CreateObject("Scripting.FileSystemObject")
   If .FolderExists("\\?\" & V) And .FolderExists("\\?\" & T) Then
    If V <> A(1) Then Fd = T & .GetFileName(V) Else _
    V = .GetParentFolderName(V) : Fd = .GetParentFolderName(T)
    If .FolderExists("\\?\" & Fd) Then R = " /R=""" & Fd & """" _
    Else If A.Named.Exists("n") Then WSH.Quit
   End If
End With : If Mid(Fd, 2) = Mid(V, 2) Then _
CreateObject("WScript.Shell").Exec "%COMMANDER_EXE% /S /O /L=""" & V & """" & R

Можно сделать и как в ТС, но с учётом исходных недовольств TC-шный синхронный переход при клике на .. из размноимённых папок не смущает?

#6:  Author: ingerard PostPosted: Sun Dec 24, 2017 14:44
    —
Flasher
Убрал кусок "If Mid(Fd, 2) = Mid(V, 2) Then _", просто не нужно строгое сравнение.
Теперь бы сделать скрипт на возврат к родительской папке и так чтоб сохранялась позиция курсора. И тогда будет все отлично Smile

Quote:
синхронный переход при клике на .. из размноимённых папок не смущает?

Было бы неплохо это учитывать.


Last edited by ingerard on Sun Dec 24, 2017 14:53; edited 1 time in total

#7:  Author: FlasherLocation: Москва PostPosted: Sun Dec 24, 2017 14:48
    —
ingerard
Строгое сравнение чего? Не вижу ответа на вопрос.

Позиция курсора нужна для сохранения в каком контексте?

#8:  Author: ingerard PostPosted: Sun Dec 24, 2017 14:56
    —
Flasher
Если оставить ту строчку сравнение, то при таком раскладе путей синхронизация не сработает:
Левая панель - "C:\Program Files\"
Правая панель - "D:\Copy\Program Files\"

Quote:
Позиция курсора нужна для сохранения в каком контексте?

Когда возвращаюсь на один каталог вверх, курсор сбрасывается на первый элемент "..", а должен стоять на папке откуда я вышел.

#9:  Author: FlasherLocation: Москва PostPosted: Sun Dec 24, 2017 15:10
    —
ingerard wrote:
Было бы неплохо это учитывать.
Что "это"?
ingerard wrote:
Когда возвращаюсь на один каталог вверх
Назад (Alt+влево) по истории?

#10:  Author: ingerard PostPosted: Sun Dec 24, 2017 15:25
    —
Quote:
Что "это"?

Quote:
при клике на .. из разноимённых папок не смущает?


Вы сделали скрипт для синхронного захода в папки, в нем все хорошо, только надо еще сделать условие для перехода по ".." если папки вдруг не одноименные, то синхронизацию не делать.

И так же еще нужен отдельно скрипт для синхронного выхода, только с учетом, что папки одноименные. И чтоб курсор был на этой же папке из которой вышли.

Нужно это для двух хоткеев, аналог "Enter", "Backspace"

#11:  Author: FlasherLocation: Москва PostPosted: Sun Dec 24, 2017 15:52
    —
ingerard wrote:
если папки вдруг не одноименные, то синхронизацию не делать
Вот теперь понятно.
ingerard wrote:
Нужно это для двух хоткеев, аналог "Enter", "Backspace"
Тогда чистой синхронности не получится. Придётся в каждой из панелей выполнять выход. Отдельный скрипт тут совсем ни к чему:
Code:
'••••••••••••••••••••••••• VBS •••••••••••••••••••••••••
' Синхронное открытие одноимённых каталогов в панелях ТС
' Условие: требуется TCScript.dll
' Ключ запрета несинхронного открытия:  /n
' Ключ перехода в родительский каталог: /b
'•••••••••••••••••••••••••••••••••• Автор: Flasher © •••
Option Explicit : Dim FSO, TCS, Key, SP, TP, N, i, T, Ln
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TCS = CreateObject("TCScript.Helper")
Set Key = WSH.Arguments.Named
With TCS .Pause = 0 : .Wait = True : SP = .GetSrcPath
  TP = .GetInfo("TP") : N = .GetInfo("SN") : .LockTC True
  If N = ".." Or Key.Exists("b") Then
    If StrComp(FN(SP), FN(TP), 1) = 0 Then
      If FSO.FileExists("\\?\" & Left(SP, Len(SP) - 1)) Then
        T = TP : If .GetInfo("A") = "R" Then TP = SP : SP = T
        .SetLeftPath SP & ":" : .SetRightPath TP & ":"
      ElseIf Right(SP, 1) = "\" Then Call Cm(2002)(4006)(2002)(4006) End If
    ElseIf Not Key.Exists("n") Then Cm(2002) End If
  Else : Dim REx : Set REx = New RegExp : REx.Pattern = "^\\{3}[^\\]+\\"
    If   FSO.FolderExists("\\?\" & REx.Replace(SP, "") & N) Then
      If FSO.FolderExists("\\?\" & REx.Replace(TP, "") & N) Then _
        Cm(2003) : .SetTrgPath TP & N & "\" :_
      Else If Not Key.Exists("n") Then Cm(2003)
    ElseIf FSO.FileExists("\\?\" & SP & N) Then
      If   FSO.FileExists("\\?\" & TP & N) Then .SetTrgPath TP & N & "\" :_
      .Sleep 40 : Ln = Len(.GetInfo("TP")) - Len(TP)
      Select Case True
        Case Ln > 0 Cm(2003)
        Case Ln < 0 Call Cm(4006)(570)(4006)
        Case Ln = "0" Or Not Key.Exists("n") Cm(1001)
      End Select
    End If
  End If : .LockTC False
End With : Set FSO = Nothing : Set TCS = Nothing
Function Cm(y) TCS.SendCommand y, 1: Set Cm = GetRef("Cm") End Function
Function FN(x) FN = FSO.GetFileName(Replace(x, "\\\", "")) End Function


Last edited by Flasher on Thu Dec 28, 2017 01:47; edited 9 times in total

#12:  Author: ingerard PostPosted: Sun Dec 24, 2017 18:47
    —
Flasher
Выдает ошибку:

Code:
Line:   9
Char:   22
Error:   Object required
Code:   800A01A8
Source:    TCScript

#13:  Author: FlasherLocation: Москва PostPosted: Sun Dec 24, 2017 18:50
    —
ingerard
Какая папка в этот момент в неактивной панели?

#14:  Author: ingerard PostPosted: Sun Dec 24, 2017 18:57
    —
Flasher
C:\ и D:\213\
В любых панелях на любых папках выдает ошибку.

Ссылается именно на .GetTrgPath. Команда .GetSrcPath работает нормально.

#15:  Author: FlasherLocation: Москва PostPosted: Sun Dec 24, 2017 19:05
    —
ingerard
После замены на .GetInfo("TP") проблема исчезает?



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page 1, 2, 3, 4, 5, 6, 7, 8, 9  Next  :| |:
Page 1 of 9

Powered by phpBB © 2001, 2005 phpBB Group