Difference between revisions of "AutoHotkey: From FileSync open another TC instance with selected files"

From TotalcmdWiki
Jump to: navigation, search
(added: use the same helper instance of TC for every call)
(added: support for single files (in other panel cd to dir) + optional settings)
Line 20: Line 20:
 
; please adjust path here; %COMMANDER_PATH% is not available outside of TC
 
; please adjust path here; %COMMANDER_PATH% is not available outside of TC
 
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)
 +
boCdToFolderOnly    := 0 ; set to 1 to just cd to dirs (does not use Lister to select file)
 +
iListerTimeOutSecs  := 1 ; if using Lister: timeout after n seconds of not appearing Lister
 
; static pidTC2
 
; static pidTC2
Send, {F3}
+
;
sLDirName := GetActiveTCListerPath()
+
LB_GETCARETINDEX := 0x019F
Send, +{F3}
+
LB_GETTEXT := 0x0189
sRDirName := GetActiveTCListerPath()
+
ControlGetFocus, Panel_id, A
+
SendMessage, %LB_GETCARETINDEX%, 0, 0, %Panel_id%, A
IfWinNotExist, ahk_pid %pidTC2%
+
LB_CursorPosition := ErrorLevel
 +
VarSetCapacity(LB_String, 1024, 0)
 +
SendMessage, %LB_GETTEXT%, %LB_CursorPosition%, &LB_String, %Panel_id%, A
 +
LB_CursorLine := LB_String
 +
Loop ; find subdirectory
 +
{
 +
If (SubStr(LB_String, StrLen(LB_String)) = "\")
 +
or (LB_CursorPosition < 1)
 +
Break
 +
LB_CursorPosition -= 1
 +
SendMessage, %LB_GETTEXT%, %LB_CursorPosition%, &LB_String, %Panel_id%, A
 +
}
 +
LB_SubDir := LB_String
 +
ControlGetText, sLPath, TEdit2, ahk_class TCmpForm
 +
ControlGetText, sRPath, TEdit1, ahk_class TCmpForm
 +
;
 +
sLDirName := "" ; get left path name
 +
if (not boCdToFolderOnly)
 +
and (SubStr(LB_CursorLine, StrLen(LB_CursorLine), 1) != "\")
 +
{
 +
Send, {F3}
 +
sLDirName := GetActiveTCListerPath()
 +
}
 +
If (sLDirName = "")
 +
sLDirName := sLPath . LB_SubDir
 +
;
 +
sRDirName := ""
 +
if (not boCdToFolderOnly)
 +
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 := ""
 
pidTC2 := ""
 
if not (pidTC2 = "")
 
if not (pidTC2 = "")
Line 33: Line 73:
 
sTCExe = %sTCExe% /O
 
sTCExe = %sTCExe% /O
 
}
 
}
 
+
;
 
sRunStr := sTCExe
 
sRunStr := sTCExe
 
if (sLDirName != "")
 
if (sLDirName != "")
Line 45: Line 85:
 
else
 
else
 
Run, %sRunStr%
 
Run, %sRunStr%
+
;
 
Return
 
Return
 +
 
#IfWinActive
 
#IfWinActive
  
 
GetActiveTCListerPath()
 
GetActiveTCListerPath()
 
{
 
{
WinWaitNotActive, ahk_class TCmpForm,, 2 ; wait for starting lister, timeout 2 seconds
+
global boCdToFolderOnly, iListerTimeOutSecs
 +
WinWaitNotActive, ahk_class TCmpForm,, %iListerTimeOutSecs% ; wait for starting lister, timeout in seconds
 
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
WinGetActiveTitle, sWinTitle
+
SetTitleMatchMode, 1
WinClose, %sWinTitle%
+
IfWinActive, Lister
 +
{
 +
WinGetActiveTitle, sWinTitle
 +
WinClose, %sWinTitle%
 +
}
 
iNamePos := (InStr(sWinTitle, "[", false, 0) + 1)
 
iNamePos := (InStr(sWinTitle, "[", false, 0) + 1)
; folder only
+
If (boCdToFolderOnly) ; folder only
; Return, % SubStr(sWinTitle, iNamePos, (InStr(sWinTitle, "\", false, 0) + 1) - iNamePos)
+
Return, % SubStr(sWinTitle, iNamePos, (InStr(sWinTitle, "\", false, 0) + 1) - iNamePos)
; folder + file name
+
else ; folder + file name
Return, % SubStr(sWinTitle, iNamePos, StrLen(sWinTitle) - iNamePos)
+
Return, % SubStr(sWinTitle, iNamePos, StrLen(sWinTitle) - iNamePos)
 
}
 
}
  

Revision as of 17:40, 24 July 2008

		; ////////////////////////////////////////////////////////////////////////////
		; // TC_Sync_OpenFolderInSecondTC.ahk  V0.12  (W) StatusQuo 2008
		; // 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
^#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 1 to just cd to dirs (does not use Lister to select file)
	iListerTimeOutSecs  := 1	; if using Lister: timeout after n seconds of not appearing Lister
	; static pidTC2
	;
	LB_GETCARETINDEX := 0x019F
	LB_GETTEXT := 0x0189
	ControlGetFocus, Panel_id, A
	SendMessage, %LB_GETCARETINDEX%, 0, 0, %Panel_id%, A
	LB_CursorPosition := ErrorLevel
	VarSetCapacity(LB_String, 1024, 0)
	SendMessage, %LB_GETTEXT%, %LB_CursorPosition%, &LB_String, %Panel_id%, A
	LB_CursorLine := LB_String
	Loop	; find subdirectory
	{
		If (SubStr(LB_String, StrLen(LB_String)) = "\")
		or (LB_CursorPosition < 1)
			Break
		LB_CursorPosition -= 1
		SendMessage, %LB_GETTEXT%, %LB_CursorPosition%, &LB_String, %Panel_id%, A
	}
	LB_SubDir := LB_String
	ControlGetText, sLPath, TEdit2, ahk_class TCmpForm
	ControlGetText, sRPath, TEdit1, ahk_class TCmpForm
	;
	sLDirName := ""	; get left path name
	if (not boCdToFolderOnly)
	and (SubStr(LB_CursorLine, StrLen(LB_CursorLine), 1) != "\")
	{
		Send, {F3}
		sLDirName := GetActiveTCListerPath()
	}
	If (sLDirName = "")
		sLDirName := sLPath . LB_SubDir
	;
	sRDirName := ""
	if (not boCdToFolderOnly)
	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% /L="%sLDirName%"
	if (sRDirName != "")
		sRunStr = %sRunStr% /R="%sRDirName%"
	if (sRunStr = sTCExe)
		Return
	if (pidTC2 = "")
		Run, %sRunStr%,,, pidTC2
	else
		Run, %sRunStr%
	;
	Return

#IfWinActive

GetActiveTCListerPath()
{
	global boCdToFolderOnly, iListerTimeOutSecs
	WinWaitNotActive, ahk_class TCmpForm,, %iListerTimeOutSecs%	; wait for starting lister, timeout in seconds
	IfWinActive, ahk_class TCmpForm	; Lister hasn't started - no file on this panel side?
		Return
	SetTitleMatchMode, 1
	IfWinActive, Lister
	{
		WinGetActiveTitle, sWinTitle
		WinClose, %sWinTitle%
	}
	iNamePos := (InStr(sWinTitle, "[", false, 0) + 1)
	If (boCdToFolderOnly)	; folder only
		Return, % SubStr(sWinTitle, iNamePos, (InStr(sWinTitle, "\", false, 0) + 1) - iNamePos)
	else	; folder + file name
		Return, % SubStr(sWinTitle, iNamePos, StrLen(sWinTitle) - iNamePos)
}

;

Back to AutoHotkey