Переход в папку следом за текущей в родительском каталоге
Select messages from
# through # FAQ
[/[Print]\]
Goto page 1, 2  Next  :| |:
Total Commander -> Автоматизация Total Commander

#1: Переход в папку следом за текущей в родительском каталоге Author: vik313 PostPosted: Sun Apr 07, 2019 13:36
    —
Здравствуйте!

Можно ли реализовать переход по папкам при помощи кнопки в Тотал коммандере?

У меня есть папки называются они по-другому. 1,2,3,n
Как находясь в папке 1, нажатием на кнопку перейти в папку ниже уровнем - 2, потом нажатием в папку 3 и так далее??

Название папок разное, файлов разное.

Спасибо!

#2:  Author: LonerDLocation: Донецк PostPosted: Sun Apr 07, 2019 14:15
    —
AutoHotkey cкрипт.
Навигация круговая. Если каталог последний - то происходит переход в первый каталог в той же панели (и в обратную сторону - из первого в последний)

Code:
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
; 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
}
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;


Last edited by LonerD on Sun Apr 07, 2019 19:40; edited 1 time in total

#3:  Author: FlasherLocation: Москва PostPosted: Sun Apr 07, 2019 14:21
    —
LonerD
Серьёзно? o_0

#4:  Author: vik313 PostPosted: Sun Apr 07, 2019 14:36
    —
Можно по-подробнее как настроить, что бы процесс запустить с кнопки?

#5:  Author: FlasherLocation: Москва PostPosted: Sun Apr 07, 2019 14:57
    —
Любой вариант из первых 1) и 2) вставляете в поле Команда:. В случае вторых дописываете путь к TCFS2 (последняя), размещённой в подкаталоге ТС. Примеры кодов:
Code:
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
Перейти к предыдущей папке в родительском каталоге
Code:
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
Перейти к следующей папке в родительском каталоге
Иконки сами подберёте.

#6:  Author: vik313 PostPosted: Sun Apr 07, 2019 15:30
    —
Супер! То, что нужно!

#7:  Author: AvadaLocation: Россия, Саратов PostPosted: Sun Apr 07, 2019 17:52
    —
По очевидным причинам тема переносится из "Общих вопросов" в "Автоматизацию".

#8:  Author: ВахмуркаLocation: Большая деревня Москва PostPosted: Sun Apr 07, 2019 19:06
    —
А чт делает (и что должен делать) скрипт, если при попытке перехода в предыдущую директорию текущей является первая? Или, то же - следующую из последней?
В свое время я много сил потратил на скрипты, предусматривающие эти случаи. И время многократно окупилось!

#9:  Author: LonerDLocation: Донецк PostPosted: Sun Apr 07, 2019 19:39
    —
Flasher wrote:
Серьёзно? o_0

У меня круговая навигация предусмотрена Very Happy
(а ещё был скрипт на vbs с использованием TCFS2, датированный маем 2013, но он сейчас у меня не работает на Win10)


Last edited by LonerD on Mon Apr 08, 2019 02:20; edited 1 time in total

#10:  Author: FlasherLocation: Москва PostPosted: Sun Apr 07, 2019 20:18
    —
Вахмурка
Мы это где-то уже обсуждали. И там я объяснял, что — ничего. Должно быть именно текущее поведение, когда ты понимаешь, где конец, а где начало.

LonerD
Аналогично. Я давно пытался себе представить ситуацию, в которой мне понадобился бы реверс, так и не смог (при своей-то фантазии)...
P.S.: Ты когда прекратишь в 100500 раз цитировать свой ник?

#11:  Author: ВахмуркаLocation: Большая деревня Москва PostPosted: Sun Apr 07, 2019 20:24
    —
Flasher wrote:
Должно быть именно текущее поведение, когда ты понимаешь, где конец, а где начало
Правильно. Зачем заставлять машину делать то, что можно сделать самому?

#12:  Author: FlasherLocation: Москва PostPosted: Sun Apr 07, 2019 20:28
    —
Вахмурка
Раз правильно, то какие проблемы? Cool
Или ты всплывающих окон захотел? Мне они точно ни к чему.

LonerD wrote:
а ещё был скрипт на vbs с использованием TCFS2
Сейчас можно и без скрипта это проделывать:
Code:
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
Циклический переход к предыдущей папке в родительском каталоге
Code:
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
Циклический переход к следующей папке в родительском каталоге

#13:  Author: sa PostPosted: Fri Apr 12, 2019 23:19
    —
Однокнопочный вариант:
Code:
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.

#14:  Author: FlasherLocation: Москва PostPosted: Fri Apr 12, 2019 23:41
    —
Вот это дичьизврат. Shocked
sa wrote:
можно сделать отдельные кнопки (или назначить отдельные клавиши)
Уж лучше взять мои примеры и при желании назначить юзеркомандам по хоткею, чем делать два/четыре о-хо-хо-дубликата с правкой пары цифр.
Я ещё понимаю макрос в ini или скрипт, где нужно пару цифровых параметров прописать, но дублировать...
Интересно, как такое число varget-ов и if-ов на скорости сказывается.

#15:  Author: sa PostPosted: Mon Apr 15, 2019 10:12
    —
Если одной кнопки с командой, имеющей кучу модификаторов (Shift, Ctrl, Alt) окажется недостаточно, а создание двух команд-дублей покажется нерациональным, то, разумеется, желающие могут оформить команду в секции [Items] файла TCFS2.ini, например, так:
Code:
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&&#2), 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)
и вызывать её кнопками/клавишами с параметрами вида:
Code:
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
и т.п.



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


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

Goto page 1, 2  Next  :| |:
Page 1 of 2

Powered by phpBB © 2001, 2005 phpBB Group