Страница 1 из 2
Переход в папку следом за текущей в родительском каталоге
Добавлено: Вс апр 07, 2019 12:36
vik313
Здравствуйте!
Можно ли реализовать переход по папкам при помощи кнопки в Тотал коммандере?
У меня есть папки называются они по-другому. 1,2,3,n
Как находясь в папке 1, нажатием на кнопку перейти в папку ниже уровнем - 2, потом нажатием в папку 3 и так далее??
Название папок разное, файлов разное.
Спасибо!
Добавлено: Вс апр 07, 2019 13:15
LonerD
AutoHotkey cкрипт.
Навигация круговая. Если каталог последний - то происходит переход в первый каталог в той же панели (и в обратную сторону - из первого в последний)
Код: Выделить всё
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
; Total Commander DreamLair ;
; Script: Go to parallel directory ;
; Скрипт: Переход в параллельный каталог ;
; Script version: 1.0 (2018.09.30) ;
; Required: Total Commander 9.0+ ;
; Script author: LonerD ;
; Site: https://dreamlair.net ;
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
; Parameter: ;
; 1 - backward navigation ;
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
#NoEnv
#NoTrayIcon
#SingleInstance force
SetBatchLines, -1
SendMode Input
If not ( WinExist("ahk_class TTOTAL_CMD") || WinActive("ahk_class TTOTAL_CMD") )
ExitApp
WinGet, hw_TTOTAL_CMD, ID, A
global hw_TTOTAL_CMD
NavMode = %1%
if ( NavMode != 1 )
NavMode = 0
DllCall("LockWindowUpdate", "uint", hw_TTOTAL_CMD)
TCPanelA := SendMessageTC(1074, 1000, 0, A)
hw_TCPathA := SendMessageTC(1074, 8+TCPanelA, 0, A)
ControlGetText, PathA,, % "ahk_id " hw_TCPathA
SendMessage, 1075, 2002,,, % "ahk_id " hw_TTOTAL_CMD
TCPanelA := SendMessageTC(1074, 1000, 0, A)
TCItemsA := SendMessageTC(1074, 1002+TCPanelA, 0, A)
TCCaretA := SendMessageTC(1074, 1006+TCPanelA, 0, A)
TCUpDirA := SendMessageTC(1074, 1008+TCPanelA, 0, A)
TCFileA := SendMessageTC(1074, 1010+TCPanelA, 0, A)
if ( TCFileA = 4294967295 )
TCFileA := TCItemsA
ControlGetText, PathA2,, % "ahk_id " hw_TCPathA
if ( PathA = PathA2 )
Goto, Exit
if ( NavMode = 1 )
NextDir := TCCaretA = TCUpDirA ? TCFileA - TCUpDirA - 1 : TCCaretA - TCUpDirA - 1
else
NextDir := TCFileA - TCCaretA > 1 ? TCCaretA + 1 - TCUpDirA : 0
SendMessage, 1075, 2049, % NextDir,, % "ahk_id " hw_TTOTAL_CMD
SendMessage, 1075, 1001,,, % "ahk_id " hw_TTOTAL_CMD
Exit:
DllCall("LockWindowUpdate", "uint", 0)
ExitApp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
; Total Commander Send Message function ;
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
SendMessageTC(TCMsg, wParam, lParam, aControl)
{
SendMessage, % TCMsg, % wParam, % lParam, % aControl, % "ahk_id " hw_TTOTAL_CMD
return ErrorLevel
}
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
Добавлено: Вс апр 07, 2019 13:21
Flasher
Добавлено: Вс апр 07, 2019 13:36
vik313
Можно по-подробнее как настроить, что бы процесс запустить с кнопки?
Добавлено: Вс апр 07, 2019 13:57
Flasher
Любой вариант из первых 1) и 2) вставляете в поле
Команда:. В случае вторых дописываете путь к TCFS2 (
последняя), размещённой в подкаталоге ТС. Примеры кодов:
Код: Выделить всё
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe
/ef msg($0B,0) tcm(2002) tcm(3303) tcm(2054) tcm(2003) tcm(2918) msg($0B,1) redraw()
wciconex.dll,334
Перейти к предыдущей папке в родительском каталоге
Код: Выделить всё
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe
/ef msg($0B,0) tcm(2002) tcm(3303) tcm(2053) tcm(2003) tcm(2918) msg($0B,1) redraw()
wciconex.dll,333
Перейти к следующей папке в родительском каталоге
Иконки сами подберёте.
Добавлено: Вс апр 07, 2019 14:30
vik313
Супер! То, что нужно!
Добавлено: Вс апр 07, 2019 16:52
Avada
По очевидным причинам тема переносится из "Общих вопросов" в "Автоматизацию".
Добавлено: Вс апр 07, 2019 18:06
Вахмурка
А чт делает (и что должен делать) скрипт, если при попытке перехода в предыдущую директорию текущей является первая? Или, то же - следующую из последней?
В свое время я много сил потратил на
скрипты, предусматривающие эти случаи. И время многократно окупилось!
Добавлено: Вс апр 07, 2019 18:39
LonerD
У меня круговая навигация предусмотрена
(а ещё был скрипт на vbs с использованием TCFS2, датированный маем 2013, но он сейчас у меня не работает на Win10)
Добавлено: Вс апр 07, 2019 19:18
Flasher
Вахмурка
Мы это где-то уже обсуждали. И там я объяснял, что — ничего. Должно быть именно текущее поведение, когда ты понимаешь, где конец, а где начало.
LonerD
Аналогично. Я давно пытался себе представить ситуацию, в которой мне понадобился бы реверс, так и не смог (при своей-то фантазии)...
P.S.: Ты когда прекратишь в 100500 раз цитировать свой ник?
Добавлено: Вс апр 07, 2019 19:24
Вахмурка
Flasher писал(а):Должно быть именно текущее поведение, когда ты понимаешь, где конец, а где начало
Правильно. Зачем заставлять машину делать то, что можно сделать самому?
Добавлено: Вс апр 07, 2019 19:28
Flasher
Вахмурка
Раз правильно, то какие проблемы?

Или ты всплывающих окон захотел? Мне они точно ни к чему.
LonerD писал(а):а ещё был скрипт на vbs с использованием TCFS2
Сейчас можно и без скрипта это проделывать:
Код: Выделить всё
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe /ef msg($0B,0) tcm(2002) tcm(3303)
if(msg(1074,1006+msg(1074,1000))-msg(1074,1008+msg(1074,1000)),tcm(2054),tcm(2023)+send({END})) tcm(2003) tcm(2918) msg($0B,1) redraw()
wciconex.dll,334
Циклический переход к предыдущей папке в родительском каталоге
Код: Выделить всё
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe /ef msg($0B,0) tcm(2002) tcm(3303)
if(msg(1074,1004+msg(1074,1000))==msg(1074,1006+msg(1074,1000))+1-msg(1074,1008+msg(1074,1000)),tcm(2049),tcm(2053)) tcm(2003) tcm(2918) msg($0B,1) redraw()
wciconex.dll,333
Циклический переход к следующей папке в родительском каталоге
Добавлено: Пт апр 12, 2019 22:19
sa
Однокнопочный вариант:
Код: Выделить всё
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe /ef "if(pressedShift, varset(4,1), varset(4,0)) if(pressedCtrl, varset(3,1), varset(3,0))
run_item(locktc,1) tcm(2002) tcm(524) tcm(3303) varset(2,msg($432,1004+msg($432,1000))) tcm(524) if(varget(2)>0, varset(1,msg($432,1006+msg($432,1000))-msg($432,1008+msg($432,1000)))+if(varget(4), varset(1,varget(1)-1)+if(varget(1)>=varget(2)||(varget(1)<0&&varget(3)), varset(1,varget(2)-1)), varset(1,varget(1)+1)+if(varget(3), if(varget(1)>=varget(2), varset(1,0)), if(varget(1)>varget(2), varset(1,0), if(varget(1)==varget(2), varset(1,varget(2)-1)))))+msg($433,2049,varget(1))) tcm(2003) run_item(locktc,0) redraw"
WCMICONS.DLL,80
Перейти к следующей или предыдущей (Shift+) папке в родительском каталоге |Ctrl+ разрешает переход от последней к первой и наоборот
Для отслеживания нажатия клавиш Shift и Ctrl кроме утилиты TCFS2 потребуется модуль TCFS2Tools.
Если TCFS2Tools не установлен в TC (или просто нет желания использовать совместно мышь и клавиатуру), то на основе предложенного варианта можно сделать отдельные кнопки (или назначить отдельные клавиши), в которых, для задания направления перехода к следующей/предыдущей папке,
pressedShift заменить на 0/1, а для задания запрета/разрешения перехода от последней к первой и наоборот,
pressedCtrl заменить на 0/1.
Добавлено: Пт апр 12, 2019 22:41
Flasher
Вот это [s]дичь[/s]изврат.
sa писал(а):можно сделать отдельные кнопки (или назначить отдельные клавиши)
Уж лучше взять мои примеры и при желании назначить юзеркомандам по хоткею, чем делать два/четыре о-хо-хо-дубликата с правкой пары цифр.

Я ещё понимаю макрос в ini или скрипт, где нужно пару цифровых параметров прописать, но дублировать...
Интересно, как такое число varget-ов и if-ов на скорости сказывается.
Добавлено: Пн апр 15, 2019 09:12
sa
Если одной кнопки с командой, имеющей кучу модификаторов (Shift, Ctrl, Alt) окажется недостаточно, а создание двух команд-дублей покажется нерациональным, то, разумеется, желающие могут оформить команду в секции [Items] файла TCFS2.ini, например, так:
Код: Выделить всё
NextPrevParentDir = if(1, run_item(locktc,1)+tcm(2002)+tcm(524)+tcm(3303)+varset(2,msg($432,1004+msg($432,1000)))+tcm(524)+ if(varget(2)>0, varset(1,msg($432,1006+msg($432,1000))-msg($432,1008+msg($432,1000)))+if(#1, varset(1,varget(1)-1)+if(varget(1)>=varget(2)||(varget(1)<0&), varset(1,varget(2)-1)), varset(1,varget(1)+1)+if(#2, if(varget(1)>=varget(2), varset(1,0)), if(varget(1)>varget(2), varset(1,0), if(varget(1)==varget(2), varset(1,varget(2)-1)))))+msg($433,2049,varget(1)))+tcm(2003)+run_item(locktc,0)+redraw)
и вызывать её кнопками/клавишами с параметрами вида:
Код: Выделить всё
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe
/ei "NextPrevParentDir ( pressedAlt ,1 )"
WCMICONS.DLL,80
Перейти к следующей или предыдущей (Alt+) папке в родительском каталоге,|с закольцовыванием
Примеры параметров:
0 , 0 перейти к следующей, без закольцовывания;
1 , 1 перейти к предыдущей, с закольцовыванием;
pressedShift|pressedAlt , pressedCtrl перейти к следующей, а при дополнительном нажатии Shift или Alt - к предыдущей, закольцовывать при дополнительном нажатии Ctrl
и т.п.