- Код: выделить все
; В этом скрипте создается меню - переход на диски и FS плагины, как в FARe.
; Большого смысла не имеет, так как можно обойтись CTRL D .
; Но интересно с точки зрения возможностей скриптов PP.
;Меню создается, но не уничтожается, имеется ввиду, что скрипт привязан к стартапу TC,
;меню потом вызывается из другого скрипта, и происходит это почти мгновенно.
;меню, таким образом, обновляется при каждом перезапуске TC.
;За то, что меню не уничтожается никогда, пуристы меня убьют,
;поскольку если вы запустите этот скрипт два миллиона раз, неиспользуемые меню
;забьют вам всю оперативную память.
; Написано сие Reuben-ом, копирайта не имеет, каждый да ломает свою машину сам.
;Используются MiscPlagin, menu и registry. Те, кто их написали, молодцы.
; Если вам есть что сказать по поводу скрипта, скажите.
global hhh, handlemenu letterordering wincmdinipath
wincmdinipath="c:\wincmd\wincmd.ini"
local letters regpath regvalname lett UU i linenum inihandle
letters="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
registry.returns_status()
registry.error_dialog_off()
regpath="HKLM\SYSTEM\MountedDevices\"
regvalname="\DosDevices\"
hhh=win.handle("c=TTOTAL_CMD")
handlemenu=menu.create()
; Что делает эта часть скрипта, военная тайна.
MiscPlugin.Wait_Window("c=TNASTYNAGSCREEN")
tcnas=win.handle("c=TNASTYNAGSCREEN")
if (tcnas ne "") Do
hh=MiscPlugin.Get_WindowText(tcnas ,"4")
keys {to &(tcnas)}&(hh)
Endif
;Конец военной тайны
;Далее формируется та часть меню, которая про диски
; Я очень долго искал, где же в системе хранится информация о том на каких буквах есть диски,
; а на каких нет, поскольку просто перечислить их вручную -- неспортивно. Вроде что-то похожее
; нашлось в реестре по адресу &(regpath). Записи про диски там имеют вид "\DosDevices\С:".
for (i=1; i le length(letters) ; i=i+1)
lett=select(letters,i,i)
rv=regvalname ++ lett ++ ":"
UU=registry.get_binary(regpath,rv)
; поскольку плагин registry у нас возвращает статус, а не значение
;то в переменной UU у нас записано, насколько результативно было обращение к реестру
; если lett -- буква для раздела жесткого диска, ответ будет "OK", если для сменного диска
; ответ будет "ERROR: get_binary: BINARY TRUNCATED"
; если вообще нет такого диска, ответ будет
;"ERROR: get_binary: VALUE NOT FOUND (sys code 2 says: "The system cannot find the file specified. ")"
;
if (UU eq "OK" ) Do
menu.insert(handlemenu,1000,"[-" ++ lett ++ "-]","",lett)
elseif ( select(UU, -3) eq "TED")
menu.insert(handlemenu,1000,"[-" ++ lett ++ " -removable-]","",lett)
Endif
endfor
menu.insert(handlemenu,1000, "", "-")
;читаем wincmd.ini в поисках FS плагинов
inihandle = File.Open(wincmdinipath, "r")
if (inihandle > 0) Do
for (lineNum=1;1;LineNum=LineNum+1)
str = File.ReadLine(inihandle)
if( (File.Eof(inihandle)) or ( &(str) eq "[FileSystemPlugins]" ++ "'n"))
break
endfor
if ( &(str) eq "[FileSystemPlugins]"++ "'n") Do
for (lineNum=1;1;LineNum=LineNum+1)
str = File.ReadLine(inihandle)
if( (File.Eof(inihandle)) or ( select(str,1,1) eq "["))
break
if (select(str,1,1) eq " ") Do
Else
menu.insert(handlemenu,1000,select(str,1,index(str,"=")-1),"","\\\" ++ select(str,1,index(str,"=")-1))
Endif
endfor
Endif
file.close(inihandle)
else
MessageBox ("ok", "Error opening file "++ wincmdinipath )
endif
;таким образом, меню возвращает букву для диска и путь для FS плагина
menu.reset
и второй скрипт, который меню вызывает:
- Код: выделить все
hhh=win.handle("c=TTOTAL_CMD")
charord= " !'"#$%'&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abacdefghijklmnopqrstuvwxyz{|}~¦"
ind=menu.show(handlemenu)
if (length(ind) eq 1) do
ind=index(charord,ind)+31
Win.postMessage(&(hhh),0x400+51,331 )
; открываем бокс дисков
keys {to &(hhh)} {&(ind)}
Elseif(select(ind,3) eq "\\\") do
ind="cd " ++ ind
; команда cd path не работает из FS плагинов
Win.postMessage(&(hhh),0x400+51,2029 )
; копируем текущий путь
if (select(clip.get,3) eq "\\\") Do
Win.postMessage(&(hhh),0x400+51,2125 )
endif
; если мы были в FS плагине, переходим в Networks
win.show(hhh)
; теперь перед нами задача, напечатать команду перехода в нужный FS плагин в командной строке
;пороблема в том, что keys не обращает внимание на раскладку, а clip время от времени глючит
;поможет нам в этом случае keys {number}, где
;number -- ANSI (или ASCII , я все время путаю, но кажется здесь это не важно) код символа
for (i=1; i le length(ind); i=i+1)
char=select(ind,i,i)
ord=index(charord,char)+31
;ord, по идее должен быть кодом char, только вот index не чувствителен к регистру,
;и все прописные у нас превращаются в заглавные. Тут нам поможет replacechars,
;которая чувствительна к регистру
if ((char le "z") and (char ge "a") and (replacechars(char, "abcdefghijklmnopqrstuvwxyz$") eq "$")) Do
ord=ord+32
Endif
keys {to &(hhh)}{&(ord)}
endfor
keys {to &(hhh)}{enter}
; И вот мы напечатали строчку ind не зависимо от текущей раскладки
Endif
quit