CN Organizer - скрипт Autohotkey, расширяющий функции CintaNotes
Скрипт позволяет автоматизировать создание записей по горячим клавишам без необходимости ручного ввода тэгов и номеров секций. Кроме того, он позволяет извлекать различную информацию из активного окна и подставлять ее в тэги. Делает возможным использование программы в качестве планировщика заданий.
Скрипт настраивается с помощью записей в простейшем конфигурационном файле, связывающем клавишу с номером секции и тэгом (RCtrl+RSift+клавиша - создание записии, RCtrl+RAlt+клавиша - открытие). Помимо одиночных тэгов возможно задание набора, например, вида "Books Книги/читать".
Кроме постоянных значений, для записи в тэг, возможно использование следующих переменных:
$time - при создании заметки выводится окно ввода даты и времени с календарем, которые подставляются в тэг вместо переменной. RCtrl+RAlt+клавиша показывает заметки, относящиеся к сегодняшнему дню. Можно создавать различные списки от дел до телепрограмм и быстро просматривать текущие. Вид дерева дат в боковой панели настраиваем.
$site - подставляет в тэг корневой адрес сайта, открытого в браузере. Это позволяет отмечать конкретные страницы сайтов, интересующие ветки форумов, покупки в интернет-магазинах, фильмы, слова в онлайн словарях и пр., а потом мгновенно к ним возвращаться при открытии сайта, без создания закладок и привязки к конкретному браузеру.
$cmd - имя файла без расширения, извлеченное из командной строки открытой вместе с файлом программы. Путь файла подставляется в ссылку для открытия по F7, RCtrl+RAlt+клавиша открывает заметки, привязанные к открытому файлу. Удобно для собирания цитат из книг - можно параллельно работать со множеством материалов, не путая их содержимое и сортируя заметки по мере необходимости.
$title - название или имя файла без расширения, взятое из заголовка окна. Если в заголовке найден полный путь, он подставляется в ссылку для открытия. Назначение то же.
$cmt - совмещающает возможности двух предыдущих: сначала ищется имя файла в командной строке, а если он отсутствует, используется заголовок окна.
$file - файл под курсором в проводнике или файловом менеджере (FAR, Total, etc.). Путь подставляется в ссылку и заголовок заметки. Можно отмечать файлы для последующего просмотра, а потом быстро возвращаться к ним из CN. RCtrl+RAlt+клавиша открывает заметки к выделенному в проводнике файлу, если они есть
$proc - имя процесса активного окна без расширения. Позволяет быстро писать заметки к изучаемым программам и возвращаться к ним по горячей клавише, когда окно программы активно
Дополнительные возможности:
RCtrl+RShift+Space - создание заметки в той же секции и с тем же набором тэгов, что и в последний раз, RCtrl+RAlt+Space - открытие последних созданных заметок
В окне редактирования заметки RCtrl+клавиша заменяет секцию и тэг с ней связанными (быстрая сортировка), RShift+клавиша дополняет тэг заданным
В главном окне программы щелчок средней кнопки - открытие ссылки выделенной заметки
Секундное зажатие правого Ctrl при создании заметки добавляет к тэгу настраиваемый суффикс, дополнительный или дочерний тэг (например, "_ToDo" или "/!!!")
Так же есть возможность назначать суффиксы и дочерние тэги, добавляющееся к существующим по горячей клавише в окне редактирования по L/RCtrl+Space и L/RShift+Space
Возможность ограничения числа последовательных пустых строк в скопированном в заметку тексте (актуально для многих документов и веб-страниц)
Возможность автоматической обрезки хвостов вида "Читать дальше: [ссылка]", добавляемых скриптами на вебстраницах. Можно прописать начало любого повторяющегося паразитного текста и не видеть его в заметках.
Возможность сохранения в буфере обмена текста заметки или первой непустой строки в виде, пригодном для переименования файлов (делаешь заметку о ставящемся на закачку файле и сразу же меняешь название на взятое из заголовка)
При использовании $cmdline, $file, $title, $cmt можно создавать ссылку на каталог вместо ссылки на файл
Для удобочитаемости можно копировать адреса и пути из раздела ссылки в примечания
[more=Скрипт]
#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 - показать главное окно.
; В Настройках - Захват текста - После захвата должно стоять "Открыть на редактирование"
; Скрипт связывает клавишу с номером (существующей!) вкладки и набором тэгов. Комбинация RCtrl+RShift+клавиша создает заметку, RCtrl+RAlt+клавиша - открывает соответствующую вкладку и тэг.
; При запуске в каталоге скрипта создается одноименный cfg-файл, задающий эти соответствия.
; Синтаксис строк предельно прост:
; номер секции,тэг или набор тэгов,имя клавиши или ее код (виртуальный или скан),пояснение (необязательно).
; Например:
; 1,,1 - первая секция без тэга по 1 (строки такого вида добавляются автоматически)
; 1,Comp,vk43,c - тэг Comp в первой секции по клавише c
; 1,Soft Comp,vk53,s - два тэга там же по s
; 1,Books/читать,sc30,b - дочерний тэг "читать" в Books по b
; 1,Книги Books/читать,F6 - комбинация двух предыдущих возможностей по F6 (использование "," и ";" как разделителя не допускается - только пробел)
; Для применения изменений следует перезапустить скрипт!
;~ Кроме постоянных значений, для записи в тэг возможно использование следующих переменных:
;~ $time - при создании заметки выводится окно ввода даты и времени с календарем, которые подставляются в тэг (8,Дела/$time,vkC0,~)
;~ $site - подставляет в тэг корневой адрес сайта, открытого в браузере
;~ $cmd - имя файла без расширения, извлеченное из командной строки открытой вместе с файлом программы.
;~ $title - название или имя файла без расширения, взятое из заголовка окна; ищет там и полный путь.
;~ $cmt - переменная, совмещающая возможности двух предыдущих: сначала ищется путь файла в командной строке, а если он отсутствует, используется заголовок окна.
;~ $file - файл под курсором в проводнике или файловом менеджере
;~ $proc - имя процесса активного окна без расширения
; В файле конфигурации допускаются пустые строки, лишние пробелы - только в пояснениях. Временно ненужное можно закоментировать ";".
; --------- Горячие клавиши ----------
; В открытом окне заметки:
; RCtrl+клавиша - замена секции и тэга данными, связанными с клавишей
; RShift+клавиша - дополнение текущего тэга связанным с клавишей (производится проверка, связан ли он с текущей секцией)
; По L/RCtrl+Space и L/RShift+Space - добавляются настраиваемые тэги, суффиксы или дочерние тэги (см. ниже)
>^>+F12::Run % "Notepad.exe " cfg ; RCtrl+RShift+F12 - окрытие конфигурационного файла
>^>+Space::goto Last_add ; RCtrl+RShift+Space - создание заметки в той же секции и с теми же тэгами, что и в последний раз
>^>!Space::goto Last_open ; RCtrl+RAlt+Space - открытие последних созданных заметок
; -------- Мышь (в главном окне программы) --------
#IfWinActive ahk_class CintaNotes.MainFrame
MButton::F7 ; Cредняя кнопка - открытие ссылки выделенной заметки
#IfWinActive
start:
;------------ Настройки скрипта -------------
ctrl_tag:="_ToDo" ; Суффикс, прописывающийся при секундном зажатии правого Ctrl в тэг при создании заметки. Если вписать " ToDo", будет добавляться дополнительный тэг, если "/ToDo" - дочерний
lctrl_space:="_rem" ; Суффикс, дополнительный или дочерний тэг дописывающийся к текущему тэгу по LCtrl+Space в окне редактирования
rctrl_space:="_ToDo" ; То же для RCtrl+Space
lshift_space:=" !Смотреть" ; То же для LShift+Space
rshift_space:="_Old" ; То же для RShift+Space
t_tree:="yyyy_MM/dd_dddd" ; Комбинация, подставляющаяся в тэг вместо даты при использовании $time. Определяет вид дерева дат в боковой панели
dir_path:=0 ; При использовании $cmd, $title, $cmt и $file создавать ссылку на каталог вместо ссылки на файл
max_empty_str:=2 ; Максимальное число последовательных пустых строк в скопированном в заметку тексте. 0 - без ограничения
endnote:="Больше информации на http,Читайте далее: http,Читать далее: http,Подробности: http" ; Начала обрезаемых хвостов, добавляемых при копировании текста скриптами на веб-страницах
clip:=2 ; Сохранять в буфере обмена после создания заметки: 1 - текст заметки, 2 - первую непустую строку в виде, пригодном для переименования файлов; 0 - прежнее содержимое
link2rem:=1 ; Копировать адреса и пути из раздела ссылки в примечания
;----------------------------------
SplitPath A_ScriptName, , , , cfg
cfg:=cfg ".cfg"
IfNotExist % cfg
FileAppend , % "1,,1`r`n2,,2`r`n3,,3`r`n4,,4`r`n5,,5`r`n6,,6`r`n7,,7`r`n8,,8`r`n9,,9`r`n0,,0", % 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 % ">+" key, Note
Hotkey IfWinActive
Hotkey % ">^>!" key, Open
}
return
#IfWinActive ahk_class Cinta.ModelessDialog
<^Space::Addtag(lctrl_space)
>^Space::Addtag(rctrl_space)
<+Space::Addtag(lshift_space)
>+Space::Addtag(rshift_space)
#IfWinActive
Addtag(tt)
{
KeyWait Ctrl, T1
KeyWait Shift, T1
ControlGetText tag, Cinta.Edit2
s:=SubStr(tag,0)
If (s=" ")
StringTrimRight tag, tag, 1
ControlSetText Cinta.Edit2, % tag . tt " "
Send {End}
return
}
Note:
KeyWait RShift, T1
KeyWait RCtrl, T0.6
e:=ErrorLevel
clip_old:=Clipboard
old_tag:=""
site_add:=""
site_text:=""
gosub GetTag
Last_add:
If tag contains $time
{
Gui Destroy
Gui, +AlwaysOnTop
Gui Margin , 5, 5
Gui font, s12
Gui Add, Text, , используя курсорные клавиши и календарь (Alt+Down)
Gui Add, DateTime ,wp+0 vDateTime, yyyy MMMM dd, dddd HH:mm
Gui Add, Button, y5 r2 w60 Default, OK
Gui Show, Center, Введите дату и время
return
}
If A_Thishotkey contains >^>+
{
KeyWait RCtrl
Send ^{F12}
If (cl="Cinta.ModelessDialog")
WinWaitNotActive % t, , 10
WinWaitActive ahk_class Cinta.ModelessDialog, , 10
Sleep 200
}
If A_Thishotkey contains >^
{
Control Choose, % tab, Cinta.Combobox1, ahk_class Cinta.ModelessDialog
end:=""
If e
end:=ctrl_tag
ControlSetText Cinta.Edit2, % tag . end " "
If A_Thishotkey not contains +
return
}
else
{
SendMessage, 0x147, 0, 0, Cinta.Combobox1
stab:=ErrorLevel+1
If (stab<>tab)
{
MsgBox, 262160, Ошибка, Тэг относится к другой секции!, 1.5
return
}
ControlGetText old_tag, Cinta.Edit2
s:=SubStr(old_tag,0)
If (s=" ")
StringTrimRight old_tag, old_tag, 1
ControlSetText Cinta.Edit2, % old_tag " " tag " "
Send {End}
return
}
If tt contains $file
{
ControlSetText Cinta.Edit1, % "File: " f_path
ControlSetText Cinta.RichEdit1
}
If tt contains $site
{
ControlSetText Cinta.Edit3, % site_add
ControlSetText Cinta.RichEdit1, % site_text
}
ControlGetText add, Cinta.Edit3, ahk_class Cinta.ModelessDialog
If add && link2rem
ControlSetText Cinta.RichEdit2, % add
If ! add && f_path
{
If link2rem
ControlSetText Cinta.RichEdit2, % f_path
If dir_path
SplitPath f_path, , f_path
ControlSetText Cinta.Edit3, % f_path
}
ControlGetText n_txt, Cinta.RichEdit1
If endnote
n_txt:=DelTrail(n_txt,endnote)
If max_empty_str
n_txt:=MaxEmptyString(n_txt,max_empty_str)
ControlSetText Cinta.RichEdit1, % n_txt
If (clip>0) && (n_txt<>"")
{
If (clip=2)
{
Loop parse, n_txt, `n, `r
{
If (A_LoopField="")
continue
n_txt:=A_LoopField
break
}
n_txt:=ValidName(n_txt)
n_txt:=FirstUppercase(n_txt)
}
Clipboard:=n_txt
}
else
Clipboard:=clip_old
Last_tag:
Loop
{
SendMessage, 0x147, 0, 0, Cinta.Combobox1, ahk_class Cinta.ModelessDialog
tab:=ErrorLevel+1
ControlGetText tag, Cinta.Edit2
sl:=SubStr(tag,0)
If (sl=" ")
StringTrimRight tag, tag, 1
Sleep 100
IfWinNotActive ahk_class Cinta.ModelessDialog
break
}
return
ButtonOK:
Gui, Submit
FormatTime DateTime, % DateTime, % t_tree . "/HH:mm"
StringReplace tag, tag, $time, % DateTime
WinActivate % t
goto Last_add
GuiClose:
GuiEscape:
Gui Cancel
return
~^F12::
WinWaitActive ahk_class Cinta.ModelessDialog, , 3
goto Last_tag
Open:
KeyWait Alt, T1
KeyWait RCtrl, T0.6
e:=ErrorLevel
If tag contains $time
{
FormatTime DateTime, , % t_tree
StringReplace tag, tag, $time, % DateTime
}
gosub GetTag
Last_open:
KeyWait RCtrl, T2
IfWinNotActive ahk_class CintaNotes.MainFrame
{
Send ^!{F12}
WinWait ahk_class CintaNotes.MainFrame, , 2
If ErrorLevel
return
}
Send ^{%tab%}
Sleep 600
If tag
{
end:=""
If e
end:=ctrl_tag
ControlSetText Cinta.Edit1, % tag . end
ControlSend Cinta.Edit1, {Enter}
Sleep 200
Send {Home}
}
KeyWait RAlt, T1
If Errorlevel
Send {Alt Up}
return
;----------------------
GetTag:
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%
f_path:=""
tt:=tag
WinGetActiveTitle t
WinGetClass cl, A
If tag contains $cmd,$cmt
{
f_path:=GetPath(t)
If ! f_path
{
If tag contains $cmt
goto Title
else
{
MsgBox, 262160, Ошибка, Путь файла недоступен!, 1.5
Exit
}
}
SplitPath f_path, , , , ntag
ntag:=ValidName(ntag)
StringReplace ntag, ntag, % " ", _, All
StringReplace ntag, ntag, `,, _, All
StringReplace tag, tag, $cmd, % ntag
StringReplace tag, tag, $cmt, % ntag
}
Title:
If tag contains $title,$cmt
{
RegExMatch(t,"[A-Z]:\\.+\.[a-zA-Z0-9]{2,4}",f_path)
ttag:=f_path
If ! ttag
RegExMatch(t,"(?<=\[).+\.[a-zA-Z0-9]{2,4}(?=])",ttag)
If ! ttag
RegExMatch(t,".+\.[a-zA-Z0-9]{2,4}(?= - )",ttag)
If ! ttag
RegExMatch(t,"(?<= - ).+\.[a-zA-Z0-9]{2,4}(?=$)",ttag)
SplitPath ttag, , , ,ttag
If ! ttag
RegExMatch(t,".+(?= - )",ttag)
If ! ttag
ttag:=t
StringReplace ttag, ttag, % " ", _, All
StringReplace ttag, ttag, `,, _, All
StringReplace tag, tag, $title, % ttag
StringReplace tag, tag, $cmt, % ttag
}
If tag contains $file
{
Clipboard:=""
Send, ^{vk43}
ClipWait 2
f_path:=Clipboard
If f_path not contains :\
{
MsgBox, 262160, Ошибка, Путь недоступен!, 1.5
Exit
}
SplitPath f_path, ftag
StringReplace ftag, ftag, % " ", _, All
StringReplace ftag, ftag, `,, _, All
StringReplace tag, tag, $file, % ftag
}
If tag contains $proc
{
WinGetActiveTitle t
WinGet prtag, ProcessName, % t
SplitPath prtag, , , , prtag
prtag:=FirstUppercase(prtag)
StringReplace tag, tag, % " ", _, All
StringReplace tag, tag, $proc, % prtag
}
If tag contains $site
{
If A_Thishotkey contains >^
{
Clipboard:=""
Send ^{Ins}
ClipWait 2
site_text:=Clipboard
Sleep 300
}
Clipboard:=""
Send ^{vk4C}
Sleep 300
Send ^{Ins}
ClipWait 2
site_add:=Clipboard
RegExMatch(Clipboard,"(?<=//).+?(?=/)",stag)
If ! stag
{
MsgBox, 262160, Ошибка, Адрес недоступен!, 1.5
Exit
}
StringReplace tag, tag, $site, % stag
}
return
;-------------------------
DelTrail(text,end)
{
global
Loop Parse, end, CSV
{
If text contains % A_LoopField
{
StringGetPos p, text, % A_LoopField
StringLeft text, text, p
break
}
}
return text
}
FirstUppercase(t)
{
StringLeft n, t, 1
StringTrimLeft k, t, 1
StringUpper n, n
return n . k
}
GetPath(title)
{
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:=""
fp:=RegExMatch(cmdline,"[A-Z]:\\.*\.[a-zA-Z0-9]{2,5}",f_path,6)
return f_path
}
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
}
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)
}
[/more]