Автор: Krot66
Дата сообщения: 19.05.2014 10:03
Скрипт Autohotkey, расширяющий функциональность CintaNotes
(Прошу рассматривать данную примочку в качестве пожеланий автору ))))
Возможности:
1. Создание заметки в заданной секции с заданным тэгом по горячей клавише. Можно повесить на одну клавишу и несколько тэгов, каждый из которых может быть и дочерним
2. Возможность определения пути файла из командной строки активной программы (если она запускается при его открытии), подстановка его в поле адреса для открытия по F7
3. Открытие заданной секции или секции с тэгом по горячей клавише (все клавиши задаются один раз - меняются только модификаторы)
4. Для файлов распознанных из командной строки возможна автоматическая генерация тэгов по имени файла в заданной в настройках секции. После при открытии файла по одному и тому же сочетанию клавиш будут открываться и связанные с ним заметки. Можно параллельно работать со множеством материалов, не путая их содержимое и сортируя заметки по мере необходимости
5. Возможность автоматической генерации тэгов по имени процесса активного окна в определенной в настройках секции, что позволяет делать заметки в изучаемых программах и быстро открывать их, когда программа запущена, опять же, по одному сочетанию клавиш
6. Создание заметки с суффиксом или в дочернем тэге ToDo при секундном зажатии правого Ctrl. То же зажатие правого Ctrl при открытии будет открывать соответствующий тэг
7. Если активно окно Far, по горячей клавише в соответствующей секии и назначенным тэгом создается пустая заметка с заголовком из пути файла и ссылкой на него, что удобно при работе сбольшими скоплениями файлов, библиотках и др.
8. Возможность смены секции и тэга на заданные в окне редактирования по горячей клавише (при сортировке, ошибках и пр.)
9. Щелчок средней кнопки - открытие адреса выделенной заметки или локального файла
10. Ctrl+ПКМ - копирование выделенной заметки
11. Shift+ПКМ - редактирование тэгов выделенной заметки
12. LCtrl+Space в окне редактирования - дочерний тэг /!!!
13. Возможность ограничения числа последовательных пустых строк в скопированном в заметку тексте и отбрасывания первых пустых строк
14. Возможность сохранения в буфере обмена скопированного текста или первой непустой строки в виде, пригодном для переименования файлов (делаешь заметку о ставящемся на закачку файле и сразу же меняешь название на взятое из заголовка)
Остальное - смотри скрипт
[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,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)
}