Скрипт Autohotkey, расширяющий функциональность CintaNotes Новое отмечено «(+)». Исправлены ошибки.
Возможности:
Создание заметки в заданной секции с заданным тэгом по горячей клавише. Можно повесить на одну клавишу несколько тэгов, каждый из которых может быть и дочерним
Смена секции и тэга на заданные в окне редактирования по RCtrl+клавише (при сортировке, ошибках и пр.)
(+) Дополнения тэга связанным с клавишей в окне редактирования по RShift+клавише (есть возможность проверки, относится ли тэг к текущей секции)
(+) Возможность по RCtrl+RShift+Space создавать заметку с введенными в последний раз секцией и набором тэгов, а по RCtrl+RAlt+Space открывать соответствующие заметки
Открытие заданной секции или секции с тэгом по горячей клавише (все клавиши задаются один раз - меняются только модификаторы)
Создание заметки с настраиваемым суффиксом, дополнительным или дочернем тэгом при секундном зажатии правого Ctrl. То же зажатие правого Ctrl при открытии будет открывать соответствующий тэг
(+) Возможность добавлять по L/RCtrl+Space и L/RShift+Space в окне редактирования настраиваемые тэги, суффиксы или дочерние тэги
Возможность определения пути файла из командной строки активной программы (если она запускается при его открытии), подстановка его в поле адреса для открытия по F7 (сейчас работает с программами, имеющими сложный алгоритм запуска и множество параметров в командной строке)
Для файлов распознанных из командной строки возможна автоматическая генерация тэгов по имени файла в заданной в настройках секции. После при открытии файла по одному и тому же сочетанию клавиш будут открываться и связанные с ним заметки. Можно параллельно работать со множеством материалов, не путая их содержимое и сортируя заметки по мере необходимости
(+) Возможность создавать автоматически генерируемые по адресу открытого сайта тэги. После, когда сайт открыт в браузере, скрипт считывает адрес и по комбинации клавиш открывает соответствующие заметки. Это дает возможность отмечать конкретные страницы сайтов, книги в библиотеках и слова в онлайн-словарях, интересующие ветки форумов, покупки в интернет-магазинах, фильмы, файлы на ftp и пр., а потом мгновенно к ним возвращаться, без создания закладок и привязки к конкретному браузеру
Возможность автоматической генерации тэгов по имени процесса активного окна в определенной в настройках секции, что позволяет делать заметки в изучаемых программах и быстро открывать их, когда программа запущена, опять же, по одному сочетанию клавиш
(+) Для всех автоматически генерируемых тэгов (по открытому сайту, файлу или активной программе)теперь возможно задавать не только секцию, но и материнский тэг
Если активно окно Far, по горячим клавишам создается пустая заметка с заголовком из имени файла и ссылкой на него, что удобно при работе с большими скоплениями файлов, библиотках и др.
Щелчок средней кнопки - открытие адреса выделенной заметки или локального файла
Ctrl+ПКМ - копирование выделенной заметки
Shift+ПКМ - редактирование тэгов выделенной заметки
Возможность ограничения числа последовательных пустых строк в скопированном в заметку тексте и отбрасывания первых пустых строк
Возможность сохранения в буфере обмена скопированного текста или первой непустой строки в виде, пригодном для переименования файлов (делаешь заметку о ставящемся на закачку файле и сразу же меняешь название на взятое из заголовка)
Остальное - смотри скрипт
[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 - показать главное окно.
; В Настройках - Захват текста - После захвата должно стоять "Открыть на редактирование"
; При запуске в каталоге скрипта создается одноименный конфигурационный cfg-файл, задающий создание/открытие заметок в заданной секции и соответствующим тэгом по горячей клавише (в нем уже есть три строки, задающие соответствия 1 - 1-й секции, 2 - 2-й, 3 - 3-й.).
; Синтаксис строк предельно прост:
; номер секции,тэг,имя клавиши или ее код (виртуальный или скан),пояснение (необязательно)
; Например:
; 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+клавиша - дополнение текущего тэга связанным с клавишей
; По L/RCtrl+Space и L/RShift+Space - добавляются настраиваемые тэги, суффиксы или дочерние тэги
; Во всех случаях (в т.ч. и при автоматической генерации тэгов) секундное зажатие правого Ctrl добавляет/открывает суффикс, дополнительный или дочерний тэг, прописанный в настройках
>^>+Space::Note(last_tab,last_tag) ; RCtrl+RShift+Space - создание заметки с введенными прежде секцией и набором тэгов
>^>!Space::Open(last_tab,last_tag) ; RCtrl+RAlt+Space - открытие соответствующих заметок
>^>+vkBF::Note(name_tag,"$name") ; RCtrl+RShift+/ - создание записи с автоматически сгенерированным из названия открытого файла, определенного из командной строки (секция/материнский тэг задаются в настройках ниже; работает, если программа запускается вместе с открытием файла)
>^>!vkBF::Open(name_tag,"$name") ; RCtrl+RAlt+/ - открытие секции/тэга, соответствующих данному запущенному файлу
>^>+vkBE::Note(site_tag,"$site") ; RCtrl+RShift+. - создание записи с автоматически сгенерированным из адреса открытого сайта тэге (секция и материнский тэг задаются ниже)
>^>!vkBE::Open(site_tag,"$site") ; RCtrl+RAlt+. - открытие записей, соответствующих открытому в настоящий момент сайту
>^>+vkDC::Note(proc_tag,"$proc") ; RCtrl+RShift+\ - все то же, но название берется из имени процесса, соответствующего активному окну
>^>!vkDC::Open(proc_tag,"$proc") ; RCtrl+RAlt+\ - открытие секции/тэга, соответствующих активному приложению
; Мышь (действует в окне программы)
#IfWinActive ahk_class CintaNotes.MainFrame
MButton::Send {F7} ; Cредняя кнопка - открытие адреса выделенной заметки
^RButton::Send ^{vk43} ; Ctrl+ПКМ - копирование выделенной заметки
+RButton::Send {F4} ; Shift+ПКМ - редактирование тэгов заметки
#IfWinActive
start:
;------------ Настройки скрипта -------------
ctrl_tag:="_ToDo" ; Суффикс, прописывающийся при секундном зажатии правого Ctrl. Если вписать " ToDo", будет добавляться дополнительный тэг, если "/ToDo" - дочерний
lctrl_space:=" !Читать" ; Суффикс, дополнительный или дочерний тэг дописывающийся к текущему тэгу по LCtrl+Space в окне редактирования
rctrl_space:="_ToDo" ; То же для RCtrl+Space
lshift_space:=" !Смотреть" ; То же для LShift+Space
rshift_space:="_Old" ; То же для RShift+Space
stab:=1 ; При дополнении тэга по RShift+клавиша проверять, связан ли этот тэг с выбранной секцией
local_path:=2 ; Определения пути локального файла из командной строки (работает, если программа запускается вместе с открытием файла). 1 - записывать в поле адреса, для запуска по F7/СКМ, 2 - записывать и в примечание, 3 - то же, но записывать в поле адреса содержащую файл папку, 0 - не использовать.
; Если активно окно FAR, при local_path > 0 будет создаваться пустая заметка с заголовком из имени выделенного файла или папки и ссылкой на него
name_tag:="3,Files" ; Номер секции и материнский тэг (можно опустить), через запятую, в которых будет автоматически создаваться запись с тэгом из названия открытого файла
proc_tag:="1,Programs" ; То же для автоматического создания записи с тэгом из процесса активного окна
site_tag:="2,Sites" ; То же для автоматического создания записи с тэгом из адреса открытого сайта
max_empty_str:=2 ; Максимальное число последовательных пустых строк в скопированном тексте; первые пустые строки отбрасываются автоматически. 0 - без ограничения
clip:=2 ; Сохранять в буфере обмена после создания заметки: 1 - текст заметки, 2 - первую непустую строку в виде, пригодном для переименования файлов; 0 - без изменения
;----------------------------------
SplitPath A_ScriptName, , , , cfg
cfg:=cfg ".cfg"
IfNotExist % cfg
FileAppend , % "1,,1`r`n2,,2`r`n3,,3", % 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:
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
mtg:=""
old_tag:=""
end:=""
tt:=tag
If tab contains `,
{
Loop parse, tab, CSV
{
If (A_Index=1)
tab:=A_LoopField
If (A_Index=2)
mtg:=A_LoopField
}
}
KeyWait Shift, T1
KeyWait Ctrl, T0.6
e:=ErrorLevel
WinGetActiveTitle t
WinGetClass cl, A
f_path:=""
If local_path
{
f_path:=GetPath(t)
If t contains Far 3,Far 2,Far 1
{
Clipboard:=""
Send ^!{Ins}
ClipWait 2
If Clipboard
{
f_path:=ClipBoard
far:=1
}
}
}
If (tag="$name")
{
If ! f_path
{
MsgBox, 262160, , Путь файла недоступен!, 1.5
return
}
SplitPath f_path, , , , tag
tag:=ValidName(tag)
StringReplace tag, tag, % " ", % "_", All
StringReplace tag, tag, `,, % "_", All
}
If (tag="$proc")
{
WinGet pr, ProcessName, % t
SplitPath pr, , , , pr
StringReplace tag, pr, % " ", % "_", All
}
If A_Thishotkey contains >^>+
{
KeyWait RCtrl
Send ^{F12}
If (cl="Cinta.ModelessDialog")
WinWaitNotActive % t, , 10
WinWaitActive ahk_class Cinta.ModelessDialog, , 10
Sleep 200
}
If far
{
SplitPath f_path, fn
ControlSetText Cinta.Edit1, % "Far: " fn
ControlSetText Cinta.RichEdit1,% ""
}
ControlGetText add, Cinta.Edit3, ahk_class Cinta.ModelessDialog
If (tag="$site")
{
If ! add
{
MsgBox, 262160, , Адрес недоступен!, 1.5
return
}
SplitPath add, tag
StringReplace tag, tag,% "https://"
StringReplace tag, tag,% "http://"
StringReplace tag, tag,% "ftp://"
StringReplace tag, tag,% "file://"
StringReplace tag, tag,
www. }
If ((add="") && (local_path>0) && (f_path<>"")) || (tt="$name")
{
If (local_path>1)
ControlSetText Cinta.RichEdit2, % f_path
If (local_path=3)
SplitPath f_path, , f_path
ControlSetText Cinta.Edit3
ControlSetText Cinta.Edit3, % f_path
}
If max_empty_str
{
ControlGetText txt, Cinta.RichEdit1
txt:=MaxEmptyString(txt,max_empty_str)
ControlSetText Cinta.RichEdit1, % txt
}
ControlGetText ntxt, Cinta.RichEdit1, ahk_class Cinta.ModelessDialog
If (clip>0) && (ntxt<>"")
{
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
If A_Thishotkey contains >^
Control Choose, % tab, Cinta.Combobox1, ahk_class Cinta.ModelessDialog
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 mtg || tag
{
If e
end:=ctrl_tag
If mtg && tag
tag:="/" tag
ControlSetText Cinta.Edit2, % mtg . tag . end " "
Send {End}
}
Loop
{
IfWinNotActive ahk_class Cinta.ModelessDialog
break
SendMessage, 0x147, 0, 0, Cinta.Combobox1, ahk_class Cinta.ModelessDialog
last_tab:=ErrorLevel+1
ControlGetText last_tag, Cinta.Edit2, ahk_class Cinta.ModelessDialog
sl:=SubStr(last_tag,0)
If (sl=" ")
StringTrimRight last_tag, last_tag, 1
Sleep 100
}
return
}
Open(tab,tag="")
{
global
mtg:=""
end:=""
If tab contains `,
{
Loop parse, tab, CSV
{
If (A_Index=1)
tab:=A_LoopField
If (A_Index=2)
mtg:=A_LoopField
}
}
KeyWait RAlt, T1
KeyWait RCtrl, T0.6
e:=ErrorLevel
If (tag="$name")
{
WinGetActiveTitle t
f_path:=GetPath(t)
If ! f_path
MsgBox, 262160, , Путь файла недоступен!, 1
SplitPath f_path, , , , tag
tag:=ValidName(tag)
StringReplace tag, tag, % " ", % "_", All
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
If (tag="$site")
{
Send !{vk44}
Sleep 200
Send ^{Ins}
ClipWait 1
If Errorlevel
{
MsgBox, 262160, , Адрес недоступен!, 1
return
}
SplitPath Clipboard, , , , ,tag
StringReplace tag, tag,% "https://"
StringReplace tag, tag,% "http://"
StringReplace tag, tag,% "ftp://"
StringReplace tag, tag,% "file://"
StringReplace tag, tag,
www. }
KeyWait RCtrl, T3
Send ^!{F12}
WinWait ahk_class CintaNotes.MainFrame, , 2
If ErrorLevel
return
end:
Send ^{%tab%}
Sleep 300
If mtg || tag
{
If e
end:=ctrl_tag
If mtg && tag
tag:="/" tag
ControlSetText Cinta.Edit1, % mtg . tag . end
ControlSend Cinta.Edit1, {Enter}
Sleep 200
Send {Home}
}
return
}
FirstUppercase(t)
{
StringLeft n, t, 1
StringTrimLeft k, t, 1
StringUpper n, n
return n . k
}
GetPath(title,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:=""
AutoTrim On
StringReplace cmdline, cmdline, ", , All
StringGetPos p1, cmdline, .exe
StringGetPos p2, cmdline, ., R
If (p1=p2)
cmdline:=""
n:=0
Loop parse, cmdline
{
n:=n+1
If (A_Loopfield<>A_Space)
continue
If (A_Index>p2)
break
}
StringMid f_path, cmdline, p1+6, n-p1-5
StringGetPos dp, f_path, :\, R
StringTrimLeft f_path, f_path, dp-1
If quotes
f_path:="" f_path ""
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)
}