Тема: AHK: Дополнительный буферы обмена
Здравствуйте! (не могу публиковать в "коллекции скриптов и идей", поэтому публикую здесь)
Задача скрипта - создать дополнительные слоты текстового буфера, операбельные по Shift+Numpad[1-9] / Numpad[1-9]
Файлы проекта (исходники + инструкция)
;~ #Leleko #2015 - дополнительный буфер в Numpad клавишах
; Время зависания подсказок
global GNumpadBufferToolTipEventTimeout := 1000
; Хранилище текста
global GNumpadBuffer := {}
; Shift + Numpad[1-9] - копируем в псевдобуфер
+Numpad1::
+NumpadEnd::
+Numpad2::
+NumpadDown::
+Numpad3::
+NumpadPgDn::
+Numpad4::
+NumpadLeft::
+Numpad5::
+NumpadClear::
+Numpad6::
+NumpadRight::
+Numpad7::
+NumpadHome::
+Numpad8::
+NumpadUp::
+Numpad9::
+NumpadPgUp::
{
ParseNumpadHotKey(A_ThisHotkey, numpadKey, numpadNumber)
SaveCurrentText(numpadNumber)
return
}
; Numpad[1-9] - вставляем из псевдобуфера
$Numpad1::
$NumpadEnd::
$Numpad2::
$NumpadDown::
$Numpad3::
$NumpadPgDn::
$Numpad4::
$NumpadLeft::
$Numpad5::
$NumpadClear::
$Numpad6::
$NumpadRight::
$Numpad7::
$NumpadHome::
$Numpad8::
$NumpadUp::
$Numpad9::
$NumpadPgUp::
{
ParseNumpadHotKey(A_ThisHotkey, numpadKey, numpadNumber)
If (!RestoreSavedText(numpadNumber)){
Send, {Crtl}{%numpadKey%}
}
return
}
; Получить выделенный фрагмент
GetSelectedText()
{
clipboardAll_old := ClipboardAll
Clipboard =
Send, ^{Ins}
ClipWait 0.05
current := Clipboard
Clipboard := clipboardAll_old
return current
}
; Сохранить текущий текст
; - numNumber - номер клавиши Numpad
; ! - при сохранении тескста с '.' на конце - она будет эмулироваться при вставке из буфера
SaveCurrentText(numNumber)
{
selectedText := GetSelectedText()
if (SubStr(selectedText, 0) = "."){
GNumpadBuffer[numNumber] := { endPoint: 1, text: SubStr(selectedText, 1, -1) }
} else {
GNumpadBuffer[numNumber] := { endPoint: 0, text: selectedText }
}
ToolTip % "NumPad" numNumber " : " selectedText
SetTimer, RemoveToolTip, %GNumpadBufferToolTipEventTimeout%
return
}
; Восстановить текст по номеру (восстановление проходит посредством буфера обмена)
; - numNumber - номер клавиши Numpad
RestoreSavedText(numNumber)
{
restoredItem := GNumpadBuffer[numNumber]
if (restoredItem) {
clipboardTmp := ClipboardAll
Clipboard := restoredItem.text
Send, +{Ins} ; Отправляем вставку
If (restoredItem.endPoint = 1) {
Send, .
}
Sleep 200 ; Замораживаем возврат клавиатуры
Clipboard := clipboardTmp
return 1
}
return 0
}
; Метка деактивации всплывшей подсказки
RemoveToolTip:
{
SetTimer, RemoveToolTip, Off
ToolTip
return
}
; Разбор комбинации клавиши на составляющие
; numpadHotKey - A_ThisHotkey - переданная комбинация
; numpadKey - полная клавиша (Пример: Numpad7)
; numpadNumber - номер клавиши на Numpad
ParseNumpadHotKey(numpadHotKey, ByRef numpadKey, ByRef numpadNumber)
{
numpadKey := numpadHotKey
position := InStr(numpadKey, "Numpad")
numpadKey := SubStr(numpadKey, position)
numpadNumber := SubStr(numpadKey, 7)
if (StrLen(numpadNumber) <> 1) {
if (numpadNumber = "End") {
numpadNumber := 1
} else if (numpadNumber = "Down") {
numpadNumber := 2
} else if (numpadNumber = "PgDn") {
numpadNumber := 3
} else if (numpadNumber = "Left") {
numpadNumber := 4
} else if (numpadNumber = "Clear") {
numpadNumber := 5
} else if (numpadNumber = "Right") {
numpadNumber := 6
} else if (numpadNumber = "Home") {
numpadNumber := 7
} else if (numpadNumber = "Up") {
numpadNumber := 8
} else if (numpadNumber = "PgUp") {
numpadNumber := 9
}
}
}
; Ctrl + Numpad* = Вывод общего списка всех буфера
^NumpadMult::
{
;
Gui, Lst:New
Gui, Lst:font, s9, Arial
Gui, Lst:Add, ListView, r20 w700 count9 gMyListView -Multi R9 Sort, Key|Value
LV_Delete() ; Удаляем все данные
for key, value in GNumpadBuffer
{
if (IsObject(value)) {
if (value.endPoint = 1) {
value := value.text . "."
} else {
value := value.text
}
}
LV_Add("", key, value)
}
LV_ModifyCol(1, "AutoHdr Integer") ; Номер клавиши
LV_ModifyCol(2, "AutoHdr Text") ; Текст псевдо-буффера
Gui, Lst:Show,, Numpad buffer
return
MyListView: ; События класса списка
{
if A_GuiEvent = DoubleClick
{
LV_GetText(value, A_EventInfo, 2) ; Получаем текст псевдо-буффера
ToolTip % value
timeOut := GNumpadBufferToolTipEventTimeout * 2
SetTimer, RemoveToolTip, %timeOut%
return
}
return
}
LstGuiClose: ; События окна класса
LstGuiEscape:
{
Gui, Destroy
return
}
}
; Alt + Numpad*
!NumpadMult::
{
GNumpadBuffer.Remove(1, 9)
ToolTip, Numpad буфер очищен
timeOut := GNumpadBufferToolTipEventTimeout * 2
SetTimer, RemoveToolTip, %timeOut%
return
}
