1

Тема: 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
}
Post's attachments

БуферNumpad (1).png 51.36 kb, 16 downloads since 2015-11-02 

You don't have the permssions to download the attachments of this post.
AHK v1.1.22.07 (Unicode)

2

Re: AHK: Дополнительный буферы обмена

Загляните в эту тему, может будет интересно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Дополнительный буферы обмена

За оформление кода - Отл.
За описание работы скрипта - Хор, потому что оно размещено на стороннем ресурсе. А здесь место не экономьте - благо есть тег "spoiler".
За оригинальность идеи... Нужно было воспользоваться поиском.

4

Re: AHK: Дополнительный буферы обмена

Большое спасибо! Скрипт работает, но только при выключенном Num Lock на клаве.