#NoEnv SendMode Input SetWorkingDir %A_ScriptDir% #SingleInstance, force Menu, Tray, Icon, shell32.dll, 21 SetTitleMatchMode, 2 SetTitleMatchMode, Slow ;~ SetKeyDelay 50, 50 goto start ; Настройки горячих клавиш программы должны быть Ctrl+F12 - создание, CTRL+ALT+F12 - показать главное окно. ; В Настройках - Захват текста - После захвата должно стоять "Открыть на редактирование" ; При запуске в каталоге скрипта создается одноименный пустой конфигурационный cfg-файл. В него вписываются строки вида: ; номер секции,тэг,имя клавиши или ее код (виртуальный или скан),пояснение (необязательно) ; На основании этих записей происходит создание и открытие заметок по горячим клавишам. ; Например: ; 1,Comp,vk43,c - тэг Comp в первой секции по клавише c ; 1,Soft Comp,vk53,S - два тэга там же по s ; 1,Books/читать,sc30,b - дочерний тэг "читать" в Books по b ; 1,Книги Books/читать,F6 - комбинация двух предыдущих возможностей по F6 ; 5,,5 - пятая секция без тэга по 5 и т.д. ; Допускаются пустые строки, лишние пробелы - только в пояснениях. Временно ненужное можно закоментировать ";". Удобно отмечать постоянные тэги латиницей, тогда они всегда будут вверху. Для применения изменений требуется перезапуск скрипта ; --------- Горячие клавиши ---------- >^>+F12::Run % cfg ; RCtrl+RShift+F12 - окрытие конфигурационного файла ; RCtrl+RShift+клавиша - создание заметки с заданной (и уже существующей!) секцией и тэгом (если определен) ; RCtrl+RAlt+клавиша - открытие заметок с заданными секцией и тэгом ; RCtrl+RShift+RAlt+клавиша - замена секции и тэга в открытом окне редактирования данными, связанными с клавишей ; Создание заметки в заданной секции без тэга >^>+1::Note(1) ; RCtrl+RShift+1 - в 1-й секции >^>+2::Note(2) ; RCtrl+RShift+2 - во 2-й >^>+3::Note(3) ; RCtrl+RShift+3 - в 3-й ; Открытие окна программы >^>!1::Open(1) ; RCtrl+RAlt+1 - 1-й секции >^>!2::Open(2) ; RCtrl+RAlt+2 - 2-я секции >^>!3::Open(3) ; RCtrl+RAlt+3 - 3-я секции >^>+vkBF::Note(name_tag,"$name") ; RCtrl+RShift+/ - создание записи с автоматически сгенерированным из названия открытого файла, определенного из командной строки (секция задается в настройках ниже; работает, если программа запускается вместе с открытием файла) >^>!vkBF::Open(name_tag,"$name") ; RCtrl+RAlt+/ - открытие секции/тэга, соответствующих данному запущенному файлу (если нет - открывается настроенная секция) >^>+Space::Note(proc_tag,"$proc") ; RCtrl+RShift+Space - все то же, но название берется из имени процесса, соответствующего открытому окну >^>!Space::Open(proc_tag,"$proc") ; RCtrl+RAlt+Space - открытие секции/тэга, соответствующих активному приложению приложению ; Мышь (действует в окне программы) #IfWinActive ahk_class CintaNotes.MainFrame MButton::Send {F7} ; Cредняя кнопка - открытие адреса выделенной заметки ^RButton::Send ^{vk43} ; Ctrl+ПКМ - копирование выделенной заметки +RButton::Send {F4} ; Shift+ПКМ - редактирование тэгов заметки #IfWinActive ahk_class Cinta.ModelessDialog <^Space:: ; LCrl+Space в окне редактирования - тэг меняется на дочерний /!!! ControlGetText tag, Cinta.Edit2 StringTrimRight tag, tag, 1 ControlSetText Cinta.Edit2, % tag "/!!!" return #IfWinActive start: ;------------ Настройки скрипта ------------- add_chtag:=1 ; Создание заметки с суффиксом или в дочернем тэге ToDo при секундном зажатии правого Ctrl. То же зажатие правого Ctrl при открытии или переименовании будет задействовать соответствующий тэг chtag:="_ToDo" ; Сам этот суффикс. Если вписать "/ToDo", будет создаваться дочерний тэг local_path:=2 ; Определения пути локального файла из командной строки (работает, если программа запускается вместе с открытием файла). 1 - записывать в поле адреса, для запуска по F7/СКМ, 2 - записывать и в примечание, 3 - то же, но записывать в поле адреса содержащую файл папку, 0 - не использовать. ; Если активно окно FAR, при local_path > 0 будет создаваться пустая заметка с заголовком из пути выделенного файла или папки и ссылкой на него excl:="LibreOffice,OpenOffice" ; Фрагменты заголовков окон программ, в которых это определение работает неверно и поле адреса остается пустым, через запятую name_tag:=3 ; Номер секции, в которой будет автоматически создаваться запись с тэгом из названия открытого файла proc_tag:=1 ; Номер секции, в которой будет автоматически создаваться запись с тэгом из процесса активного окна estr:=2 ; Максимальное число последовательных пустых строк в скопированном тексте; первые пустые строки отбрасываются автоматически. 0 - без ограничения clip:=2 ; Сохранять в буфере обмена: 1 - текст заметки, 2 - первую непустую строку в виде, пригодном для переименования файлов; 0 - без изменения ;---------------------------------- SplitPath A_ScriptName, , , , cfg cfg:=cfg ".cfg" IfNotExist % cfg FileAppend , , % cfg, utf-8 Loop Read, % cfg { If A_LoopReadLine contains `; continue If A_LoopReadLine=`r`n continue Loop Parse, A_LoopReadLine, CSV { If (A_Index=1) tab:=A_LoopField If (A_Index=2) tag:=A_LoopField If (A_Index=3) key:=A_LoopField } tab_%key%:=tab tag_%key%:=tag Hotkey % ">^>+" key, Note Hotkey IfWinActive, ahk_class Cinta.ModelessDialog Hotkey % ">^>+>!" key, Note Hotkey IfWinActive Hotkey % ">^>!" key, Open } return Note: getp() Note(tab,tag) return Open: getp() Open(tab,tag) return getp() { global StringGetPos kf, A_ThisHotkey, ^ StringTrimLeft key, A_ThisHotkey, kf+1 StringGetPos kf, key, + StringTrimLeft key, key, kf+1 StringGetPos kf, key, ! StringTrimLeft key, key, kf+1 tab:=tab_%key% tag:=tag_%key% return } Note(tab,tag="") { global clip_old:=Clipboard far:=0 KeyWait Shift, T1 KeyWait Ctrl, T0.6 e:=ErrorLevel WinGetActiveTitle t WinGetClass cl, A f_path:="" If local_path { If t not contains % excl f_path:=GetPath(t,1) If t contains Far 3,Far 2,Far 1 { Clipboard:="" Send ^!{Ins} ClipWait 2 If Clipboard { f_path:=ClipBoard far:=1 } } If (tag="$name") { SplitPath f_path, , , , tag StringReplace tag, tag, % " ", % "_", All } If (tag="$proc") { WinGet pr, ProcessName, % t SplitPath pr, , , , pr StringReplace tag, pr, % " ", % "_", All } } If A_Thishotkey not contains % ">^>+>!" { KeyWait RCtrl Send ^{F12} If (cl="Cinta.ModelessDialog") WinWaitNotActive % t, , 10 WinWaitActive ahk_class Cinta.ModelessDialog, , 10 Sleep 200 } If far { ControlSetText Cinta.Edit1, % "Far: " f_path ControlSetText Cinta.RichEdit1,% "" } ControlGetText add, Cinta.Edit3, ahk_class Cinta.ModelessDialog If (add="") && (local_path>0) && (f_path<>"") { If (local_path>1) ControlSetText Cinta.RichEdit2, % f_path If (local_path=3) SplitPath f_path, , f_path ControlSetText Cinta.Edit3, % f_path } If estr { ControlGetText txt, Cinta.RichEdit1 txt:=MaxEmptyString(txt,estr) ControlSetText Cinta.RichEdit1, % txt } If clip { ControlGetText ntxt, Cinta.RichEdit1, ahk_class Cinta.ModelessDialog If (clip=2) { Loop parse, ntxt, `n, `r { If (A_LoopField="") continue ntxt:=A_LoopField break } ntxt:=ValidName(ntxt) ntxt:=FirstUppercase(ntxt) } Clipboard:=ntxt } else Clipboard:=clip_old Control Choose, % tab, Cinta.Combobox1, ahk_class Cinta.ModelessDialog ControlFocus Cinta.Edit2 If tag { If (add_chtag>0) && (e>0) tag:=tag . chtag ControlSetText Cinta.Edit2, % tag Send {End} } return } Open(tab,tag="") { global KeyWait RAlt, T1 KeyWait RCtrl, T0.6 e:=ErrorLevel If (tag="$name") { WinGetActiveTitle t tag:=GetPath(t,1) SplitPath tag, , , , tag StringReplace tag, tag, % " ", % "_", All } If (tag="$proc") { WinGet pr, ProcessName, % t SplitPath pr, , , , pr StringReplace tag, pr, % " ", % "_", All } IfWinActive ahk_class CintaNotes.MainFrame goto end KeyWait RCtrl Send ^!{F12} WinWait ahk_class CintaNotes.MainFrame, , 2 If ErrorLevel return end: Send ^{%tab%} Sleep 300 If tag { If (add_chtag>0) && (e>0) tag:=tag . chtag ControlSetText Cinta.Edit1, % tag ControlSend Cinta.Edit1, {Enter} } return } FirstUppercase(t) { StringLeft n, t, 1 StringTrimLeft k, t, 1 StringUpper n, n return n . k } MaxEmptyString(text,max) { t:="" n:=max Loop Parse, text, `n, `r { If A_LoopField { t:=t . A_LoopField "`r`n" n:=0 continue } else { n:=n+1 If (n<=max) t:=t "`r`n" } } return t } GetPath(title,del_quotes=0) { WinGet pr, ProcessName, % title Process, Exist, % pr pid := ErrorLevel for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process") If (process.ProcessId = pid) cmdline := process.CommandLine If cmdline contains Explorer.exe cmdline:="" StringGetPos pos, cmdline, .exe" StringTrimLeft f_path, cmdline, % pos+6 If del_quotes StringReplace f_path, f_path, ", , All return f_path } ValidName(n) { StringReplace n, n, `r`n,% " ", All StringReplace n, n, `n,% " ", All StringReplace n, n, \,% " ", All StringReplace n, n, /,% " ", All StringReplace n, n, :, ,All StringReplace n, n, *, ,All StringReplace n, n, ?, ,All StringReplace n, n, ", ,All StringReplace n, n, >,% " ", All StringReplace n, n, <,% " ", All StringReplace n, n, |, -, All StringReplace n, n,% " ", % " ", All return Trim(n) } |