AutoHotkey: From FileSync open another TC instance with selected files: Difference between revisions
Jump to navigation
Jump to search
mNo edit summary |
(Update for TC 9.0a (TC >= 8.51a) + Fix: big files + Fix: lister mode "Multimedia" + Fix: special characters ("[]")) |
||
Line 5: | Line 5: | ||
*/ ; --> <code><pre> | */ ; --> <code><pre> | ||
; //////////////////////////////////////////////////////////////////////////// | ; //////////////////////////////////////////////////////////////////////////// | ||
; // TC_Sync_OpenFolderInSecondTC.ahk V0. | ; // TC_Sync_OpenFolderInSecondTC.ahk V0.21 (W) StatusQuo 2008 - 2009 | ||
; // http://ghisler.ch/board/viewtopic.php?t=19713 | ; // http://ghisler.ch/board/viewtopic.php?t=19713 | ||
; // | ; // | ||
Line 22: | Line 22: | ||
sTCExe := "C:\totalcmd\TOTALCMD.EXE" | sTCExe := "C:\totalcmd\TOTALCMD.EXE" | ||
boAlwaysOpenNewTask := 0 ; set to 1 to not re-use TC target window (always open a new one) | boAlwaysOpenNewTask := 0 ; set to 1 to not re-use TC target window (always open a new one) | ||
boCdToFolderOnly := | boCdToFolderOnly := 0 ; set to 0 to have cursor placed on selected files; uses Lister (experimental?) | ||
iListerTimeOutSecs := 1 ; if using Lister: timeout after n seconds of not appearing Lister | iListerTimeOutSecs := 1 ; if using Lister: timeout after n seconds of not appearing Lister | ||
TCSync2nd_RunAsAdmin := 0 ; set to 1 to start 2nd TC | TCSync2nd_RunAsAdmin := 0 ; set to 1 to start 2nd TC as other user, e.g. administrator | ||
; static pidTC2 | ; static pidTC2 | ||
; | ; | ||
Line 35: | Line 35: | ||
SendMessage, %LB_GETTEXT%, %LB_CursorPosition%, &LB_String, %Panel_id% | SendMessage, %LB_GETTEXT%, %LB_CursorPosition%, &LB_String, %Panel_id% | ||
LB_CursorLine := LB_String | LB_CursorLine := LB_String | ||
Loop ; find subdirectory | Loop ; *** find subdirectory *** only working for VISIBLE lines - after scrolling dir line out of view, LB_GETTEXT fails! (Win2k, TC8.51a) | ||
{ | { | ||
If (SubStr(LB_String, StrLen(LB_String)) = "\") | If (SubStr(LB_String, StrLen(LB_String)) = "\") | ||
or (LB_CursorPosition < | or (LB_CursorPosition < 0) | ||
Break | Break | ||
SendMessage, %LB_GETTEXT%, %LB_CursorPosition%, &LB_String, %Panel_id% | |||
LB_CursorPosition -= 1 | LB_CursorPosition -= 1 | ||
} | } | ||
; LB_SubDir := LB_String ; moved down | ; LB_SubDir := LB_String ; moved down | ||
Line 68: | Line 68: | ||
LB_SubDir := LB_String | LB_SubDir := LB_String | ||
; | ; | ||
sLDirName := "" ; get left path name | ; *** TC 8.51a: | ||
; *** LB_CursorLine = "2 EQ FILE.EXT 123.456 01.02.12 11:22:33 | 01.02.12 11:22:33 123.456 FILE.EXT" | |||
; *** LB_CursorLine = "R R to L | 01.02.12 11:22:33 123.456 FILE.EXT" | |||
; *** LB_CursorLine = "L L to R FILE.EXT 123.456 01.02.12 11:22:33 |" | |||
sLDirName := "" ; *** get left path name | |||
if (not boCdToFolderOnly) | if (not boCdToFolderOnly) | ||
and (SubStr(LB_CursorLine, StrLen(LB_CursorLine), 1) != "\") | and (SubStr(LB_CursorLine, 1, 1) != "R") ; and (SubStr(LB_CursorLine, StrLen(LB_CursorLine), 1) != "\") | ||
{ | { | ||
Send, {F3} | Send, {F3} | ||
Line 78: | Line 82: | ||
sLDirName := sLPath . LB_SubDir | sLDirName := sLPath . LB_SubDir | ||
; --- | ; --- | ||
sRDirName := "" | sRDirName := "" ; *** get right path name | ||
if (not boCdToFolderOnly) | if (not boCdToFolderOnly) | ||
and (SubStr(LB_CursorLine, StrLen(LB_CursorLine), 1) != "\") | and (SubStr(LB_CursorLine, 1, 1) != "L") ; and (SubStr(LB_CursorLine, StrLen(LB_CursorLine), 1) != "\") | ||
{ | { | ||
Send, +{F3} | Send, +{F3} | ||
Line 99: | Line 103: | ||
sRunStr := sTCExe | sRunStr := sTCExe | ||
if (sLDirName != "") | if (sLDirName != "") | ||
sRunStr = %sRunStr% /L="%sLDirName%" | sRunStr = %sRunStr% /A /L="%sLDirName%" | ||
if (sRDirName != "") | if (sRDirName != "") | ||
sRunStr = %sRunStr% /R="%sRDirName%" | sRunStr = %sRunStr% /A /R="%sRDirName%" | ||
if (sRunStr = sTCExe) | if (sRunStr = sTCExe) | ||
Return | Return | ||
Line 128: | Line 132: | ||
} | } | ||
else | else | ||
{ | |||
Run, %sRunStr% | Run, %sRunStr% | ||
} | |||
; | ; | ||
Return | Return | ||
Line 134: | Line 140: | ||
#IfWinActive | #IfWinActive | ||
; ============= | |||
; === TC Lister: grab path/file names of file in active lister window | |||
GetActiveTCListerPath() | GetActiveTCListerPath() | ||
{ | { | ||
global boCdToFolderOnly, iListerTimeOutSecs | global boCdToFolderOnly, iListerTimeOutSecs | ||
WinWaitNotActive, ahk_class TCmpForm,, %iListerTimeOutSecs% ; wait for starting lister, timeout in seconds | WinWaitNotActive, ahk_class TCmpForm,, %iListerTimeOutSecs% ; wait for starting lister, timeout in seconds, set in hotkey (^#t) | ||
IfWinActive, ahk_class TCmpForm ; Lister hasn't started - no file on this panel side? | IfWinActive, ahk_class TCmpForm ; Lister hasn't started - no file on this panel side? | ||
Return | Return | ||
Line 145: | Line 153: | ||
WinGetActiveTitle, sWinTitle | WinGetActiveTitle, sWinTitle | ||
WinClose, %sWinTitle% | WinClose, %sWinTitle% | ||
Loop, 10 ; *** for big files: wait until load+close is done | |||
{ | |||
If !WinExist( sWinTitle ) | |||
Break | |||
Sleep, 300 | |||
} | |||
} | } | ||
iNamePos := (InStr(sWinTitle, "[", false, 0) + 1) | ; iNamePos := (InStr(sWinTitle, "[", false, 0) + 1) ; old (fails using [] in FN) | ||
iNamePos := (InStr(sWinTitle, "[", false, 1) + 1) | |||
iNameEnd := (InStr(sWinTitle, "]", false, 0) - 1) ; *** InStr start=0: search in reverse | |||
If (boCdToFolderOnly) ; folder only | If (boCdToFolderOnly) ; folder only | ||
{ | |||
else ; folder + file name | sReturn := SubStr(sWinTitle, iNamePos, (InStr(sWinTitle, "\", false, 0) + 1) - iNamePos) ; *** InStr start=0: search in reverse | ||
} else { ; folder + file name | |||
;sReturn := SubStr(sWinTitle, iNamePos, StrLen(sWinTitle) - iNamePos) ; *** 2do: fails on MP3 (Lister opened w/ option Multimedia) | |||
sReturn := SubStr(sWinTitle, iNamePos, iNameEnd - iNamePos + 1) ; *** _[123abc] 8 - 3 ; ; *** fixed multimedia viewer mode (universal: terminate at last "]") | |||
} | |||
Return, %sReturn% | |||
} | } | ||
/* | |||
;</pre></code>Back to [[AutoHotkey]] | ;</pre></code>Back to [[AutoHotkey]] | ||
[[Category:AutoHotkey scripts|From FileSync open another TC instance with selected files]] | [[Category:AutoHotkey scripts|From FileSync open another TC instance with selected files]] |
Revision as of 18:44, 6 August 2017
; ////////////////////////////////////////////////////////////////////////////
; // TC_Sync_OpenFolderInSecondTC.ahk V0.21 (W) StatusQuo 2008 - 2009
; // http://ghisler.ch/board/viewtopic.php?t=19713
; //
; // open another TC instance
; // with the folders of the currently selected file in cm_FileSync
; // via hotkey: Ctrl+Win+T
; ////////////////////////////////////////////////////////////////////////////
#SingleInstance, Force
Return
#IfWinActive, ahk_class TCmpForm
; F4::
^#t:: ; hotkey = Ctrl+Win+T
; please adjust path here; %COMMANDER_PATH% is not available outside of TC
sTCExe := "C:\totalcmd\TOTALCMD.EXE"
boAlwaysOpenNewTask := 0 ; set to 1 to not re-use TC target window (always open a new one)
boCdToFolderOnly := 0 ; set to 0 to have cursor placed on selected files; uses Lister (experimental?)
iListerTimeOutSecs := 1 ; if using Lister: timeout after n seconds of not appearing Lister
TCSync2nd_RunAsAdmin := 0 ; set to 1 to start 2nd TC as other user, e.g. administrator
; static pidTC2
;
LB_GETCARETINDEX := 0x019F
LB_GETTEXT := 0x0189
ControlGetFocus, Panel_id
SendMessage, %LB_GETCARETINDEX%, 0, 0, %Panel_id%
LB_CursorPosition := ErrorLevel
VarSetCapacity(LB_String, 1024, 0)
SendMessage, %LB_GETTEXT%, %LB_CursorPosition%, &LB_String, %Panel_id%
LB_CursorLine := LB_String
Loop ; *** find subdirectory *** only working for VISIBLE lines - after scrolling dir line out of view, LB_GETTEXT fails! (Win2k, TC8.51a)
{
If (SubStr(LB_String, StrLen(LB_String)) = "\")
or (LB_CursorPosition < 0)
Break
SendMessage, %LB_GETTEXT%, %LB_CursorPosition%, &LB_String, %Panel_id%
LB_CursorPosition -= 1
}
; LB_SubDir := LB_String ; moved down
ControlGetText, sLPath, TEdit2, ahk_class TCmpForm ; TC <= 7.04a
ControlGetText, sRPath, TEdit1, ahk_class TCmpForm
boTC75 := 0 ; TC <= 7.04a
if (sLPath . sRPath = "")
{
ControlGetText, sLPath, TAltEdit2, ahk_class TCmpForm ; TC >= 7.50 rc1
ControlGetText, sRPath, TAltEdit1, ahk_class TCmpForm
if (sLPath . sRPath != "")
boTC75 := 1 ; TC >= TC 7.50 rc1
}
if (boTC75) ; TC >= TC 7.50 rc1
{
if (SubStr(LB_String, 1, 7) = "DIR EQ ")
LB_String := SubStr(LB_String, 8)
if (SubStr(LB_String, 1, 8) = "DIR DEL ")
LB_String := SubStr(LB_String, 9)
if (SubStr(LB_String, 1, 11) = "DIR L to R ")
LB_String := SubStr(LB_String, 12)
if (SubStr(LB_String, 1, 11) = "DIR R to L ")
LB_String := SubStr(LB_String, 12)
}
;
LB_SubDir := LB_String
;
; *** TC 8.51a:
; *** LB_CursorLine = "2 EQ FILE.EXT 123.456 01.02.12 11:22:33 | 01.02.12 11:22:33 123.456 FILE.EXT"
; *** LB_CursorLine = "R R to L | 01.02.12 11:22:33 123.456 FILE.EXT"
; *** LB_CursorLine = "L L to R FILE.EXT 123.456 01.02.12 11:22:33 |"
sLDirName := "" ; *** get left path name
if (not boCdToFolderOnly)
and (SubStr(LB_CursorLine, 1, 1) != "R") ; and (SubStr(LB_CursorLine, StrLen(LB_CursorLine), 1) != "\")
{
Send, {F3}
sLDirName := GetActiveTCListerPath()
}
If (sLDirName = "")
sLDirName := sLPath . LB_SubDir
; ---
sRDirName := "" ; *** get right path name
if (not boCdToFolderOnly)
and (SubStr(LB_CursorLine, 1, 1) != "L") ; and (SubStr(LB_CursorLine, StrLen(LB_CursorLine), 1) != "\")
{
Send, +{F3}
sRDirName := GetActiveTCListerPath()
}
If (sRDirName = "")
sRDirName := sRPath . LB_SubDir
; ---
If boAlwaysOpenNewTask
or (not WinExist("ahk_pid " . pidTC2))
pidTC2 := ""
if not (pidTC2 = "")
{
WinActivate, ahk_pid %pidTC2%
sTCExe = %sTCExe% /O
}
;
sRunStr := sTCExe
if (sLDirName != "")
sRunStr = %sRunStr% /A /L="%sLDirName%"
if (sRDirName != "")
sRunStr = %sRunStr% /A /R="%sRDirName%"
if (sRunStr = sTCExe)
Return
if (pidTC2 = "")
{
if (TCSync2nd_RunAsAdmin > "0")
{
; -- run as admin: also workaround for TC "As Administrator" bug up to TC 7.50 pubbeta 2
sRunUser := ""
sRunPw := ""
InputBox, sRunUser, TC RunAs: Enter Administrator user name, Logon user name (Administrator):,,, 120,,,,, Administrator
if ErrorLevel
sRunUser := ""
if (sRunUser != "")
InputBox, sRunPw , TC RunAs: Enter Administrator password, Logon password for "%sRunUser%":,,, 120
if ErrorLevel
sRunUser := ""
if (sRunUser != "")
RunAs, %sRunUser%, %sRunPw%
if ErrorLevel
sRunUser := ""
}
;
Run, %sRunStr%,,, pidTC2
RunAs
}
else
{
Run, %sRunStr%
}
;
Return
#IfWinActive
; =============
; === TC Lister: grab path/file names of file in active lister window
GetActiveTCListerPath()
{
global boCdToFolderOnly, iListerTimeOutSecs
WinWaitNotActive, ahk_class TCmpForm,, %iListerTimeOutSecs% ; wait for starting lister, timeout in seconds, set in hotkey (^#t)
IfWinActive, ahk_class TCmpForm ; Lister hasn't started - no file on this panel side?
Return
SetTitleMatchMode, 1
IfWinActive, Lister
{
WinGetActiveTitle, sWinTitle
WinClose, %sWinTitle%
Loop, 10 ; *** for big files: wait until load+close is done
{
If !WinExist( sWinTitle )
Break
Sleep, 300
}
}
; iNamePos := (InStr(sWinTitle, "[", false, 0) + 1) ; old (fails using [] in FN)
iNamePos := (InStr(sWinTitle, "[", false, 1) + 1)
iNameEnd := (InStr(sWinTitle, "]", false, 0) - 1) ; *** InStr start=0: search in reverse
If (boCdToFolderOnly) ; folder only
{
sReturn := SubStr(sWinTitle, iNamePos, (InStr(sWinTitle, "\", false, 0) + 1) - iNamePos) ; *** InStr start=0: search in reverse
} else { ; folder + file name
;sReturn := SubStr(sWinTitle, iNamePos, StrLen(sWinTitle) - iNamePos) ; *** 2do: fails on MP3 (Lister opened w/ option Multimedia)
sReturn := SubStr(sWinTitle, iNamePos, iNameEnd - iNamePos + 1) ; *** _[123abc] 8 - 3 ; ; *** fixed multimedia viewer mode (universal: terminate at last "]")
}
Return, %sReturn%
}
/*
;
Back to AutoHotkey