<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Скрипт для CLCL, менеджера буфера обмена]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=11082&amp;type=atom" />
	<updated>2015-11-17T06:55:16Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=11082</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Скрипт для CLCL, менеджера буфера обмена]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=99116#p99116" />
			<content type="html"><![CDATA[<p>Вообще-то это один из первых и наиболее известных менеджеров буфера обмена: <a href="http://www.nakka.com/soft/clcl/index_rus.html">http://www.nakka.com/soft/clcl/index_rus.html</a></p>]]></content>
			<author>
				<name><![CDATA[Krot66]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=30687</uri>
			</author>
			<updated>2015-11-17T06:55:16Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=99116#p99116</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Скрипт для CLCL, менеджера буфера обмена]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=99114#p99114" />
			<content type="html"><![CDATA[<p>CLCL - это что?</p>]]></content>
			<author>
				<name><![CDATA[ypppu]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5974</uri>
			</author>
			<updated>2015-11-17T05:44:08Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=99114#p99114</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Скрипт для CLCL, менеджера буфера обмена]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=99074#p99074" />
			<content type="html"><![CDATA[<p>1. Скрипт использует вставку текста средствами Autohotkey, а не самой CLCL. Это позволяет работать с окнами программ, не поддерживающих простую вставку, а так же с некоторыми (необязательно старыми) программами, использование CLCL c которыми вызывает их падение (Ctrl+V Autohotkey отрабатывает гораздо нежнее, чем это делает CLCL). Можно прописать исполняемые файлы программ, в окна которых посылается &quot;медленное, но верное&quot; Send или SendInput (вставка растров и файлов всегда осуществляется обычным путем). <br />Для настройки необходимо зайти в Options - Keys и назначить на вставку сочетание Ctrl+Alt+0 вместо стандартного Ctrl+V (задержку можно за ненадобностью обнулить). Делать это следует до запуска скрипта! </p><p>2. Эта подмена резко расширяет возможности программы: вместо неизменяемых фрагментов в шаблоны программы становится возможным вписать сложные &quot;думающие&quot; заготовки и навороченную обработку выделенного текста (горячие клавиши шаблонам назначаются из контекстного меню вьювера).<br />Так<br />%clipboard% будет заменено текущим текстовым буфером обмена,<br />%sel_text% - выделенным текстом (возможно использование только одной из этих переменных),<br />%date% и %time% - настраиваемыми значениями текущих даты и времени.</p><p>3. Помимо этого, любой (в том числе и многострочный) фрагмент шаблона, заключенный в скобки вида вида &quot;&lt;@ ... @&gt;&quot; будет рассматриваться как скрипт Autohotkey, и будет заменен значением переменной out, в нем явно определяемой (например, &lt;@ StringUpper, out, sel_text @&gt; будет преобразовывать выделенный текст в верхний регистр и т.д.). <br /> Возможно использование вышеперечисленных переменных и любых функций, находящихся в локальной, пользовательской или стандартной библиотеках. <br /> Работает это через генерацию &quot;виртуальных&quot; скриптов вида temp_n.ahk (где n - номер вычисляемого фрагмента) в каталоге основного скрипта, и возникающие ошибки будут относиться к ним же. Можно отключить их автоматическое удаление в настройках и посмотреть что к чему.</p><p>4. Нажатие средней кнопки мыши, Ctrl или Alt в открытом меню программы изменяет текущий буфер обмена без его вставки. Это позволяет применять шаблоны к скопированному ранее тексту. Ниже в скрипте описано как настроить автоматический вызов меню шаблонов после этого.</p><p>5. Если после такого копирования текста в течении 10 секунд, до изменения буфера или вставки, будет использован шаблон, переменные sel_text в нем будут заменены на clipboard, так что писать отдельные шаблоны для обработки выделенного текста и старых значений буфера нет необходимости. В течении этого времени индикация буфера обмена (смотри ниже) не будет убираться автоматически.</p><p>6. Скрипт отображает первые непустые строки изменившегося текстового буфера обмена во всплывающем окне над панелью задач (как в CopyQ). Вид и время показа настраиваются, в полноэкранном режиме и настраиваемых приложениях показ выключается автоматически.</p><p>7. Имеет смысл отметить в настройках программы (Options - History) пункт Except from Template - это уменьшит появление лишних пунктов в истории.</p><div class="codebox"><pre><code>#NoEnv
SetWorkingDir %A_ScriptDir%
#SingleInstance, force
Menu Tray, Icon, shell32.dll, 20

/*
1. Скрипт использует вставку текста средствами Autohotkey, а не самой CLCL. Это позволяет работать с окнами программ, не поддерживающих простую вставку, а так же с некоторыми (необязательно старыми) программами, использование CLCL c которыми вызывает их падение (Ctrl+V Autohotkey отрабатывает гораздо нежнее, чем это делает CLCL). Можно прописать исполняемые файлы программ, в окна которых посылается &quot;медленное, но верное&quot; Send или SendInput (вставка растров и файлов всегда осуществляется обычным путем). 
Для настройки необходимо зайти в Options - Keys и назначить на вставку сочетание Ctrl+Alt+0 вместо стандартного Ctrl+V (задержку можно за ненадобностью обнулить). Делать это следует до запуска скрипта! 

2. Эта подмена резко расширяет возможности программы: вместо неизменяемых фрагментов в шаблоны программы становится возможным вписать сложные &quot;думающие&quot; заготовки и навороченную обработку выделенного текста (горячие клавиши шаблонам назначаются из контекстного меню вьювера).
Так
%clipboard% будет заменено текущим текстовым буфером обмена,
%sel_text% - выделенным текстом (возможно использование только одной из этих переменных),
%date% и %time% - настраиваемыми значениями текущих даты и времени.

3. Помимо этого, любой (в том числе и многострочный) фрагмент шаблона, заключенный в скобки вида вида &quot;&lt;@ ... @&gt;&quot; будет рассматриваться как скрипт Autohotkey, и будет заменен значением переменной out, в нем явно определяемой (например, &lt;@ StringUpper, out, sel_text @&gt; будет преобразовывать выделенный текст в верхний регистр и т.д.). 
 Возможно использование вышеперечисленных переменных и любых функций, находящихся в локальной, пользовательской или стандартной библиотеках. 
 Работает это через генерацию &quot;виртуальных&quot; скриптов вида temp_n.ahk (где n - номер вычисляемого фрагмента) в каталоге основного скрипта, и возникающие ошибки будут относиться к ним же. Можно отключить их автоматическое удаление в настройках и посмотреть что к чему.
 
4. Нажатие средней кнопки мыши, Ctrl или Alt в открытом меню программы изменяет текущий буфер обмена без его вставки. Это позволяет применять шаблоны к скопированному ранее тексту. Ниже в скрипте описано как настроить автоматический вызов меню шаблонов после этого.

5. Если после такого копирования текста в течении 10 секунд, до изменения буфера или вставки, будет использован шаблон, переменные sel_text в нем будут заменены на clipboard, так что писать отдельные шаблоны для обработки выделенного текста и старых значений буфера нет необходимости. В течении этого времени индикация буфера обмена (смотри ниже) не будет убираться автоматически.

6. Скрипт отображает первые непустые строки изменившегося текстового буфера обмена во всплывающем окне над панелью задач (как в CopyQ). Вид и время показа настраиваются, в полноэкранном режиме и настраиваемых приложениях показ выключается автоматически.

7. Имеет смысл отметить в настройках программы (Options - History) пункт Except from Template - это уменьшит появление лишних пунктов в истории.
*/

del:=1 ; удалять &quot;виртуальные&quot; скрипты после вставки
send:=&quot;XBMC.exe,Kodi.exe&quot; ; исполняемые файлы приложений, в окна которых посылается Send, через запятую
sendinput:=&quot;&quot; ; то же для SendInput

date_format:=&quot;dd.MM.yyyy&quot; ; формат даты, используемый в переменной date
time_format:=&quot;HH:mm&quot; ; формат времени, используемый в переменной time

win:=1 ; отображать изменившийся буфер в виде всплывющего окна
bitmap:=1 ; отображать и изменения нетекстового буфера
empty:=0 ; отображать очистку буфера
exclude:=&quot;JPEGView.exe,AutoHotkey.exe&quot; ; исполняемые файлы приложений, в которых не показывается текстовый буфер, через запятую
font:=12 ; размер шрифта
color:=&quot;DCDCDC&quot; ; цвет фона
lines:=2 ; число показываемых первых непустых строк
shift:=0 ; вертикальное смещение
show:=1500 ; время показа, мс

^!0::
Sleep 100
If A_PriorHotkey~=&quot;^(MButton|Ctrl|LAlt|RAlt)$&quot;
{
	;~ SendInput !{vk57} ;  если вписать сюда горячую клавишу папки шаблонов, назначенную в программе (Option - Action), ее меню будет автоматически открываться после копирования буфера по нажатию Ctrl, Alt или средней кнопке мыши
	m:=1
	return
}
If (!Clipboard || Clipboard~=&quot;^([a-zA-Z]:\\.+\R?){1,}&quot;)
{
	Send ^{vk56}
	return
}
clip:=RegExReplace(Clipboard,&quot;\s+$&quot;), clip_old:=old
If m
	clip:=StrReplace(clip,&quot;sel_text&quot;,&quot;clipboard&quot;), m:=0
WinGet exe, ProcessName, A
FormatTime date, , % date_format
FormatTime time, , % time_format
If clip~=&quot;s)(%clipboard%|&lt;@.*clipboard.*@&gt;)&quot;
{
	If (clip_old=&quot;&quot;)
	{
		MsgBox, 262160, , Буфер обмена пуст или в буфере не текст!, 1.5
		return
	}
	Clipboard:=clip_old
}
else If clip~=&quot;s)(%sel_text%|&lt;@.*sel_text.*@&gt;)&quot;
{
	Clipboard:=&quot;&quot;
	Send ^{Ins}
	ClipWait 1
	If ErrorLevel
	{
		MsgBox, 262160, , Ничего не выделено!, 1.5
		return
	}
	sel_text:=Clipboard
	Send {Del}
}
start:=Clipboard
If clip~=&quot;s)&lt;@.+@&gt;&quot;
{			
	FileDelete temp_*.ahk
	n:=1 		
	Loop
	{
		Clipboard:=start
		p:=RegExMatch(clip,&quot;s)&lt;@.+?@&gt;&quot;,a,n)
		If (!a || A_Index&gt;10)
			break
		RegExMatch(a,&quot;s)&lt;@\K.+(?=@&gt;)&quot;,f)
		FileAppend % &quot;sel_text:=Clipboard`r`ndate=&quot; date &quot;`r`ntime=&quot; time &quot;`r`n&quot; Trim(f) &quot;`r`nClipboard:=out`r`nExitApp&quot;, % &quot;temp_&quot; A_Index &quot;.ahk&quot;, utf-8
		RunWait % &quot;temp_&quot; A_Index &quot;.ahk&quot;
		ClipWait 2
		clip:=StrReplace(clip,a,Clipboard)
		n:=p+1
	}
}
clip:=StrReplace(clip,&quot;%date%&quot;,date)
clip:=StrReplace(clip,&quot;%time%&quot;,time)
clip:=StrReplace(clip,&quot;%clipboard%&quot;,clip_old)
clip:=StrReplace(clip,&quot;%sel_text%&quot;,sel_text)	
If exe in % send
{
	Send % clip
	return
}
If exe in % sendinput
{
	SendInput % clip
	return
}
Clipboard:=clip
Sleep 100
Send ^{vk56}
If del
	FileDelete temp_*.ahk
return

#IfWinExist ahk_class #32768 ahk_exe CLCL.exe
MButton::
KeyWait MButton, T1
Ctrl::
LAlt::
RAlt::
SendInput {Enter}
return
#IfWinActive

OnClipboardChange:
e:=A_EventInfo, old:=new, new:=Clipboard, text:=&quot;&quot;
Gui Destroy
WinGet exe2, ProcessName, A
If exe2 in % exclude
	return
SysGet, D, Monitor
WinGetPos, , , w, h, A
If new~=&quot;s)&lt;@.+@&gt;&quot; || (w&gt;=DRight &amp;&amp; h&gt;=DBottom)
	return
If (e=0 &amp;&amp; empty)
	text:=&quot;### Empty! ###&quot;
If (e=2 &amp;&amp; bitmap)
	text:=&quot;### Bitmap? ###&quot;
If (e=1)
{
	n:=0, text:=&quot;&quot;
	Loop Parse, new, `r`n
	{
		If A_LoopField~=&quot;^\s*$&quot;
			continue
		n+=1, string:=Trim(A_LoopField)
		If (StrLen(string)&gt;80)
			string:=SubStr(string,1,80) &quot; (...)&quot; 
		text.=string &quot;`r`n&quot;
		If (n=lines)
			break
	}
}
If (win &amp;&amp; text)
{
	Sleep 100
	SysGet, M, MonitorWorkArea
	Gui Destroy
	Gui font, s%font% Arial
	Gui Margin , 6, 2
	Gui Color, % color
	Gui, -Caption  +AlwaysOnTop +ToolWindow -DPIScale +LastFound 
	Gui, Add, Text, ,% RegExReplace(text,&quot;`r`n$&quot;)
	Gui Show, NA y%MBottom% xCenter		
	WinGetPos , , , , height
	WinMove , , , , % MBottom-height-shift	
	SetTimer ClipbShow, Off
	t:=show
	If A_PriorHotkey~=&quot;^(MButton|Ctrl|LAlt|RAlt)$&quot;
		t:=10000
	SetTimer ClipbShow, % t
}
return

~^vk56::
ClipbShow:
SetTimer ClipbShow, Off
Gui Destroy
m:=0
return

</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Krot66]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=30687</uri>
			</author>
			<updated>2015-11-16T07:20:13Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=99074#p99074</id>
		</entry>
</feed>
