PP Scripts -- Menues For TC

Те, кто ей начинают пользоваться, уже не в силах остановиться! Она может все. Или почти все!

Сообщение Reuben » Чт май 22, 2003 10:09 am

Ввиду того, что в процессе написания выяснились некоторые полезные вещи, я все-таки решил их выложить
Код: выделить все
; В этом скрипте создается меню - переход на диски и 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

<span style='color:purple'>
Ugly girl is better than nothing
Nothing is better than pretty girl
</span>
Reuben
Подполковник
 
Сообщений: 532
Зарегистрирован: Ср дек 04, 2002 8:59 am
Откуда: Jerusalem
Пункты репутации: 0

Сообщение Reuben » Пн июн 16, 2003 11:26 am

Первый из нижеприведенных скриптов возник в результате дискуссии в разделе про возможности Farа и TC.
Он архивирует файл под курсором и отправляет его через Sentd To->Mail


Код: выделить все
tchandle=win.handle("c=TTOTAL_CMD")
Win.postMessage(tchandle,1075, 2029)
;Путь к папке, открытой в активном окне
zippath= clip.get
Win.postMessage(tchandle,1075, 2017)
;Путь к выделенному файлу
tr=clip.get
str=replacechars(tr,"'r'n ")
Проверка на то, что у нас выделен ровно один файл
if (tr eq str) Do
 
   zipname = tr ++ ".zip"
  ozn=zipname
  if(index(zipname," ") do
     
  zipname = "'"" ++ zipname ++ "'""
     tr = "'"" ++ tr ++ "'""
  endif
  commarg = "a -tzip  " ++ zipname ++ "  " ++ tr
  Do("D:\Program Files\7-ZIP\7zn.exe", commarg, zippath )
Else
 listfilename = zppath ++ "\selection
Endif
zippathname=zippath ++ "\" ++ ozn
for (n = 1; n le 4; )
;Очень опасный цикл, выход только когда архивирование
; оканчивается успешно!!

if (validpath(zippathname))
break
endfor
win.sendkeys("{co}{alt}z{alt}{co}{ba}")
;Поиск файла в данной директории - предполагается,
;что быстрый поиск осуществляется через
;Ctrl+Alt+Letter

win.sendkeys(ozn)
;А это работает только при включенной английской раскладке!!

win.sendkeys("{es}")
Win.postMessage(tchandle,1075, 2500)
;Вызов контекстного меню
  keys n
;Переход на Se&nd To
  keys {ad 5}{en}
;5 раз стрелка вниз -- переход на Mail to --ничего
;лучше я не смог придумать...
quit


А этот скрипт копирует выделенные в TC файлы в активное окно -- в одну строчку.
Очевидное использование -- хоткей для Type and Run


Код: выделить все
 tchandle=win.handle("c=TTOTAL_CMD")
Win.postMessage(tchandle,1075, 2018)
tr=clip.get
tr=replacechars(tr,"'r'n ")
clip.set(tr)
clip.paste
<span style='color:purple'>
Ugly girl is better than nothing
Nothing is better than pretty girl
</span>
Reuben
Подполковник
 
Сообщений: 532
Зарегистрирован: Ср дек 04, 2002 8:59 am
Откуда: Jerusalem
Пункты репутации: 0

Пред.

Вернуться в Windows PowerPro

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12