<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Совсем другой заменитель Punto Switcher'a]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=12654&amp;type=atom" />
	<updated>2017-05-03T17:18:14Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=12654</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Совсем другой заменитель Punto Switcher'a]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115645#p115645" />
			<content type="html"><![CDATA[<p>Какие еще комбинации? Одна единственная кнопка, по крайней мере для основной функции.</p>]]></content>
			<author>
				<name><![CDATA[Krot66]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=30687</uri>
			</author>
			<updated>2017-05-03T17:18:14Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115645#p115645</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Совсем другой заменитель Punto Switcher'a]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115630#p115630" />
			<content type="html"><![CDATA[<p>ИМХО чем держать все эти комбинации в голове и потом вспоминать их, быстрее будет выделить и просто нажать кнопку, оставив динамическую память мозга для других нужд.</p>]]></content>
			<author>
				<name><![CDATA[Alectric]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26027</uri>
			</author>
			<updated>2017-05-03T15:19:42Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115630#p115630</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Совсем другой заменитель Punto Switcher'a]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115628#p115628" />
			<content type="html"><![CDATA[<p><strong>becaesium</strong><br />Странно это. Надо подумать.</p>]]></content>
			<author>
				<name><![CDATA[Krot66]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=30687</uri>
			</author>
			<updated>2017-05-03T14:31:03Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115628#p115628</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Совсем другой заменитель Punto Switcher'a]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115620#p115620" />
			<content type="html"><![CDATA[<p>У вас большая сила воли, раз вы исправляете текст таким образом.<br />Я останусь пока на <a href="http://forum.script-coding.com/viewtopic.php?id=8737&amp;p=2">своем варианте</a>. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2017-05-03T10:56:02Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115620#p115620</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Совсем другой заменитель Punto Switcher'a]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115619#p115619" />
			<content type="html"><![CDATA[<p>Последнее набранное слово не конвертируется, при выделении слова, конвертируется через раз (иногда просто удаляет выделенное слово, иногда удаляет пробел между выделенным и предшествующим ему словом).</p>]]></content>
			<author>
				<name><![CDATA[becauseim]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=33149</uri>
			</author>
			<updated>2017-05-03T10:33:20Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115619#p115619</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Совсем другой заменитель Punto Switcher'a]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115616#p115616" />
			<content type="html"><![CDATA[<p>Сочинения на эту тему писались уже не однажды. Три с половиной года назад один из таких скриптов был написан <a href="http://forum.script-coding.com/viewtopic.php?id=8737">мной</a>. Он был сделан на основе команды Input и был лишен некоторых недостатков своих предшественников, позволяя исправлять текст в середине строки.<br />Все это время во мне подспудно зрело понимание того, что коренным недостатком наших изделий является сам выбор обрабатываемого текста. Например, Punto и большинство скриптов работают только с последним словом. Делались модификации моего скрипта, позволяющие обрабатывать и предыдущие. Некоторым это нравилось, но, очевидно, иногда это хорошо, а иногда плохо, и здесь нужна возможность выбора. Пробелами этот вопрос не ограничивается: если человек часто набирает узкие колонки текста, пусть он сам решает, преобразовывать хвост предыдущей строки или нет.<br />С программированием вообще все совсем неважно: когда идет набор латинских и кирилических символов без интервалов, плох и Punto Switcher, и все его заменители, т.к. конвертация без ручного выделения делается невозможной.</p><p>Поскольку мы стремимся к некоторой интерактивности, скрипт не забивает автоматом символы, а сначала выделяет требуемый участок текста, и уже затем осуществляет его преобразование.<br />1. Если нажать вслед за набранным текстом &quot;Pause&quot;, после небольшой задержки (об этом позже), будет выделено последнее слово и при отпускании клавиши исправлена его раскладка. Но если удержать клавишу нажатой, будет выделено предыдущее слово, а затем и предшествующее ему, пока не будет исчерпана строка, определяемая длиной введенного текста или нажатием &quot;прерывающих&quot; клавиш, прописанных в переменной endkeys (тултип над строкой показывает число оставшихся символов). Соответственно, при отпускании будет конвертирован весь выделенный текст. Конечные пробелы не препятствуют преобразованию текста.<br />2. Для программирования можно прописать в регулярном выражении комбинации символов, на которых выделение &quot;по словам&quot; будет автоматически останавливаться помимо пробелов. Таким образом можно предотвратить типовые ошибки, когда выделение наезжает на функцию с кирилическим аргументом или html-тэг (в скрипте прописан самый минимум для аргументов функций, присвоения строковых переменных и условных выражений ahk).<br />3. Помимо выделения &quot;по словам&quot;, скрипт позволяет работать и с посимвольным выделением. Если отпустить и повторно нажать &quot;Pause&quot; (после выделения &quot;по словам&quot; или в самом начале - для этого и нужна задержка), дальше выделение будет производиться в посимвольном режиме, причем как при фиксации клавиши, с заданной скоростью выделяющем текст, так и при коротких, дающих лучшую точность нажатиях. <br />4. Помимо исправления раскладки, скрипт может инвертировать регистр набранного текста (случайное нажатие Caps Lock), переводить его в верхний или нижний регистр или делать первую букву строчной. Выделение работает так же, как было описано выше. Держать нажатой дополнительную клавишу не нужно, в том числе и при посимвольном выделении - достаточно нажатия в самом начале.<br />5. При вставке по Ctrl+V возможно выделение и изменение регистра текста, как если бы он был только что набран.<br />6. Повторное нажатие горячей клавиши восстанавливает только что конвертированную строку в ее изначальном виде, причем за этим можно предпринять более удачную попытку выделения текста и его преобразование. При желании можно исправить раскладку, а потом регистр текста - все это возможно пока не произведен непосредственный ввод символов.<br />7. Скрипт работает с консолью, правда без преобразования ручного выделения. Различие еще в том, что вместо выделения производится затирание символов. Работает и отмена изменений.<br />8. Скрипт может работать в многострочном режиме. Как это сделать и существующие ограничения описано в настройках.<br />9. Все клавиши переназначаемые - подробности там же.</p><p>В скрипте спользован код определения текущей раскладки от <strong>teadrinker</strong> и <strong>creature.ws</strong>, а также ее переключения от <strong>YMP</strong>.</p><div class="codebox"><pre><code>
#NoEnv 
SetWorkingDir %A_ScriptDir%
#SingleInstance, force
#MaxHotkeysPerInterval 500
Menu, Tray, Icon, shell32.dll, 39
SendMode Input

/*
Скрипт для быстрого исправления раскладки и регистра набранного текста
http://forum.script-coding.com/viewtopic.php?pid=115616#p115616

Pause - исправление раскладки набранного текста
RShift+Backspace - инверсия регистра текста (случайное нажатие Caps Lock)
RShift+_ - текст в нижнем регистре
RShift+= - текст в верхнем регистре
RShift+0 - первая буква заглавная
При наличии выделенного текста, для преобразования используется он.
При вставке по Ctrl+V возможно выделение и изменение регистра текста, как если бы он был только что набран.
Повторное нажатие клавиш после конвертации восстанавливает исходную строку, после чего возможно выделение и преобразование текста.
*/

key_pass:=300 ; время зажатия клавиши, необходимое для начала выделения &quot;по словам&quot;; короткое нажатие - начало посимвольного выделения (0 - без начальной задержки, посимволное выделение возможно только после первого слова) 
select_pause:=650 ; пауза перед выделением следующего &quot;слова&quot; при сохранении нажатия клавиши (0 - работа только с последним словом, как в Punto Switcher или старых весиях скрипта)
key_wait:=400 ; время ожидания повторного нажатия клавиши при посимвольном выделении до преобразования текста (0 - полное выключение посимвольного выделения; key_pass не учитывается)
symbolsel_speed:=3.5 ; скорость посимвольного выделения при постоянном нажатии клавиши, символов в секунду
stop_comb:=&quot;(\(&quot;&quot;|, ?&quot;&quot;|= ?&quot;&quot;)&quot; ; фрагмент регулярного выражения с вертикальными чертами в качестве разделителя, определяющего дополнительные точки остановки выделения
ttip_dy:=24 ; вертикальный сдвиг тултипа относительно каретки (0 - выключение тултипа)
endkeys:=&quot;{Enter}{NumpadEnter}{Tab}{LControl}{RControl}{LAlt}{RAlt}{LWin}{RWin}{Left}{Right}{Up}{Down}{Home}{End}{PgUp}{PgDn}{Del}{NumpadDel}{Ins}{NumpadIns}&quot; ; завершающие клавиши команды Input, прерывающие запись символов и делающие невозможной отмену без выделения текста. Если убрать {Enter}{NumpadEnter}{Tab}, станет возможно преобразовывать текст, захватывающий несколько строк. В программистских редакторах, где начальный пробел или табуляция определяют отступ абзаца, многострочное преобразование будет давать ошибки в таких смещенных абзацах. При переназначении клавиш следует убрать используемую дополнительную клавишу из списка, если она там есть (например, {RControl})

; ================================================

Loop
{
	Input input_text, I V L500, % endkeys
	err:=ErrorLevel, text:=input_text, count+=StrLen(text)	
	If (err=&quot;NewInput&quot;) &amp;&amp; mod
	{
		If (A_ThisHotkey=A_PriorHotkey) &amp;&amp; !count &amp;&amp; !restor &amp;&amp; sel_text
		{
			Send % &quot;{Bs &quot; StrLen(sel_text) &quot;}{Raw}&quot; sel_text
			ControlGetFocus, CtrlFocus, A
			SendMessage, 0x50,, % lang_convert=1049 ? 0x4190419 : 0x4090409, % CtrlFocus, A
			restor:=1
		}
		else
		{
			If restor &amp;&amp; !count &amp;&amp; text_old
				text:=text_old
			If !restor &amp;&amp; !count &amp;&amp; text_new
				text:=text_new
			If (A_PriorHotkey=&quot;~^vk56&quot;) &amp;&amp; Clipboard &amp;&amp; !count
				text:=Clipboard
			lang_convert:=GetInputLangID(&quot;A&quot;)
			If mod=1
				conv_text:=Translate(Select(text))
			If mod=2
			{
				conv_text:=ChangeCase(Select(text),3)
				SetCapsLockState Off
			}
			If mod=3
				conv_text:=ChangeCase(Select(text),1)
			If mod=4
				conv_text:=ChangeCase(Select(text))
			If mod=5
				conv_text:=ChangeCase(Select(text),2)
			Send % &quot;{Raw}&quot; conv_text 
			text_new:=SubStr(text,1,StrLen(text)-StrLen(conv_text)) . conv_text
			text_old:=text, restor:=0 
		}
		Sleep 300
		KeyWait % masterkey, T2
		Hotkey % &quot;*&quot; masterkey, Block, Off
		count:=mod:=0
	}
}

&gt;+0::
mod+=1
&gt;+-::
mod+=1
&gt;+=::
mod+=1
&gt;+Bs::
mod+=1
Pause::
mod+=1
Input
return

~^vk56::count:=0

~+Left::
~*LButton::
~*RButton::
~*MButton::
Input
conv_text:=mod:=text:=text_old:=text_new:=&quot;&quot;
Block:
return

Select(text)
{
	global
	masterkey:=RegExReplace(A_ThisHotkey,&quot;.*(\^|\+|!|#)&quot;)
	Hotkey % &quot;*&quot; masterkey, Block, On
	If text~=&quot;^\s*$&quot;
	{
		clip_old:=Clipboard, Clipboard:=&quot;&quot;
		Send ^{Ins}
		ClipWait 0.5
		If text:=Clipboard
		{
			Send {Del}			
			Clipboard:=clip_old
			return sel_text:=text
		}
		else
		{
			Tooltip Для преобразования`n выделите текст!!!, % A_CaretX-30, % A_CaretY-40
			Sleep 800
			ToolTip
			return
		}
	}
	ToolTip
	txt:=text, key_pass:=key_wait ? key_pass : 0
	key:=WinActive(&quot;ahk_class ConsoleWindowClass&quot;) ? &quot;Bs&quot; : &quot;Left&quot;
	KeyWait % masterkey, % &quot;T&quot; key_pass/1000
	If ErrorLevel
	{		
		While GetKeyState(masterkey,&quot;P&quot;) &amp;&amp; txt
		{
			txt_old:=txt			
			txt1:=RegExReplace(txt,&quot;(^|\s+)\S+? {0,3}$&quot;)
			txt2:=RegExReplace(txt,stop_comb &quot;\K\S+? {0,3}$&quot;, ,rep)
			txt:=(StrLen(txt2)&gt;StrLen(txt1) &amp;&amp; rep ? txt2 : txt1)
			Send % &quot;{Shift down}{&quot; key &quot; &quot; StrLen(txt_old)-StrLen(txt) &quot;}{Shift up}&quot;
			If txt
			{
				Sleep 50
				If ttip_dy
					ToolTip % &quot;&lt;&lt; &quot; StrLen(txt), % A_CaretX, % A_CaretY-ttip_dy
				KeyWait % masterkey, % &quot;T&quot; select_pause/1000-0.05
			}
		}
	}
	t_unpress:=A_TickCount	
	While A_TickCount-t_unpress&lt;key_wait &amp;&amp; txt
	{		
		Sleep 10
		If GetKeyState(masterkey,&quot;P&quot;)
		{
			StringTrimRight txt, txt, 1
			Send {Shift down}{%key%}{Shift up}
			Sleep 50
			If ttip_dy
				ToolTip % &quot;&lt;&lt; &quot; StrLen(txt), % A_CaretX, % A_CaretY-ttip_dy
			KeyWait % masterkey, % &quot;T&quot; 1/symbolsel_speed-0.06
			t_unpress:=A_TickCount
		}
	}
	Sleep 50
	If !txt &amp;&amp; ttip_dy
		ToolTip &lt;&lt; 0 &gt;&gt;, % A_CaretX, % A_CaretY-ttip_dy
	KeyWait % masterkey, T2
	Sleep 100
	ToolTip
	Send {RShift up}{Del}	
	return sel_text:=SubStr(text,StrLen(txt)+1)
}	

Translate(text)
{
	Eng:=&quot;~QWERTYUIOP{}ASDFGHJKL:&quot;&quot;ZXCVBNM&lt;&gt;?|``qwertyuiop[]asdfghjkl;&#039;zxcvbnm,./@#$^&amp;&quot;
	Rus:=&quot;ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,/ёйцукенгшщзхъфывапролджэячсмитьбю.&quot;&quot;№;:?&quot;
	Loop, parse, text, ,`r
	{ 		
		If p:=InStr(GetInputLangID(&quot;A&quot;)=1033 ? Eng : Rus, A_LoopField, true) 
			r:=r . SubStr(GetInputLangID(&quot;A&quot;)=1033 ? Rus : Eng, p, 1)
		else
			r.=A_LoopField 
	}
	ControlGetFocus CtrlFocus, A
	SendMessage, 0x50, 2,, % CtrlFocus, A
	return r
}

ChangeCase(t,n=&quot;&quot;)
{	
	If !n
		StringLower t, t
	If n=1
		StringUpper t, t
	If n=2
		StringLower t, t, T
	If n&lt;3
		return t
	StringCaseSense, Locale
	Loop % StrLen(t)
	{
		r:=SubStr(t,A_Index,1)
		If r is upper
			StringLower r, r
		else
			StringUpper r, r
		out.=r
	}
	return out
}

GetInputLangID(window)
{
    If !(hWnd := WinExist(window))
        return
    WinGetClass, Class 
    if (Class == &quot;ConsoleWindowClass&quot;)
    {
        WinGet, consolePID, PID
        DllCall(&quot;AttachConsole&quot;, Ptr, consolePID)
        VarSetCapacity(buff, 16)
        DllCall(&quot;GetConsoleKeyboardLayoutName&quot;, Str, buff)
        DllCall(&quot;FreeConsole&quot;)
        langID := &quot;0x&quot; . SubStr(buff, -3)
    }
    Else
        langID := DllCall(&quot;GetKeyboardLayout&quot;, Ptr, DllCall(&quot;GetWindowThreadProcessId&quot;, Ptr, hWnd, UInt, 0, Ptr), Ptr) &amp; 0xFFFF 
    return langID
}
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Krot66]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=30687</uri>
			</author>
			<updated>2017-05-03T07:56:35Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115616#p115616</id>
		</entry>
</feed>
