amel27
Цитата Creat0R:
нужно по RegExp подобрать условия замены (на основе нашего текста), чтобы получить в результате нужное количество сдвигов влево »
|
Вот оно!

Сделал (после 3-ёх часов экспериментирования

):
Код:

Func GetLeftJumps($Text)
StringRegExpReplace($Text, '\n', '')
Local $Extended = @extended
$Text = StringStripWS($Text, 3)
$Text = StringRegExpReplace($Text, '\s+|\t+', ' ')
$Text = StringRegExpReplace($Text, '~|`|!|#|%|\^|&|\*|\(|\)|-|\+|=|\{|\}|''|"|;|:|/|\\|<|>|\?|,|\[|\]|ч|Ч|ё|Ё', '|')
$Text = StringRegExpReplace($Text, '\|+', '|')
If StringIsASCII($Text) Then $Text = StringRegExpReplace($Text, '\.', '|')
Local $WordsCountArr = StringRegExp($Text, "[\s\.:;,]*([а-яА-Яa-zA-Z0-9-_]+)[\s\.:;,]*", 3)
StringRegExpReplace($Text, '\|', '')
Return $Extended + @extended + UBound($WordsCountArr)
EndFunc
Возможно это сделать и более короче, но я умею только так, а глвавное - оно работает!
Есть конечно пару(?) недостатков - к примеру, если выделить текст посредине общего текста, то выделяться будут и все предыдущие символы, идущие подряд до первого символа в выделенном тексте.
Вот полное применение + использование твоего примера:
Код:

#NoTrayIcon
Global $objASC = ObjCreate('Scripting.Dictionary')
Global $objANS = ObjCreate('Scripting.Dictionary')
InitMatrix($objASC, $objANS)
HotKeySet('`', 'ConvertProc')
HotKeySet('^q', 'Quit')
While 1
Sleep(100)
WEnd
Func ConvertProc()
Local $OldClip = ClipGet()
ClipPut('')
Send('^{Insert}')
Local $SelectedText = ClipGet()
If $SelectedText = '' Then Return
Local $InvertedText = InvertText($SelectedText, $objASC, $objANS)
ClipPut($InvertedText)
Sleep(100)
Send('+{Insert}')
Local $LeftJumps = GetLeftJumps($InvertedText)
Send('^+{LEFT ' & $LeftJumps & '}')
Send('{CTRLDOWN}')
Send('{CTRLUP}')
ClipPut($OldClip)
EndFunc
Func InvertText($sText, ByRef $objASC, ByRef $objANS)
If StringIsASCII($sText) Then
Return ConvertText($sText, $objASC)
Else
Return ConvertText($sText, $objANS)
EndIf
EndFunc
Func GetLeftJumps($Text)
StringRegExpReplace($Text, '\n', '')
Local $Extended = @extended
$Text = StringStripWS($Text, 3)
$Text = StringRegExpReplace($Text, '\s+|\t+', ' ')
$Text = StringRegExpReplace($Text, '~|`|!|#|%|\^|&|\*|\(|\)|-|\+|=|\{|\}|''|"|;|:|/|\\|<|>|\?|,|\[|\]|ч|Ч|ё|Ё', '|')
$Text = StringRegExpReplace($Text, '\|+', '|')
If StringIsASCII($Text) Then $Text = StringRegExpReplace($Text, '\.', '|')
Local $WordsCountArr = StringRegExp($Text, "[\s\.:;,]*([а-яА-Яa-zA-Z0-9-_]+)[\s\.:;,]*", 3)
StringRegExpReplace($Text, '\|', '')
Return $Extended + @extended + UBound($WordsCountArr)
EndFunc
Func ConvertText($sText, ByRef $objMatrix)
Local $i, $s, $n, $sRes = ''
For $i = 1 To StringLen($sText)
$s = StringMid($sText, $i, 1)
$n = $objMatrix.Item ($s)
If $n Then
$sRes &= $n
Else
$sRes &= $s
EndIf
Next
Return $sRes
EndFunc
Func InitMatrix(ByRef $objASC, ByRef $objANS)
Local $aASC = "`qwertyuiop[]asdfghjkl;'zxcvbnm,./" & '~@#$^&QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?'
Local $aANS = "ёйцукенгшщзхъфывапролджэячсмитьбю." & 'Ё"№;:?ЙЦУКЕНГШЩЗХЪ/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,', $i
For $i = 1 To StringLen($aASC)
$objASC.Add (StringMid($aASC, $i, 1), StringMid($aANS, $i, 1))
$objANS.Add (StringMid($aANS, $i, 1), StringMid($aASC, $i, 1))
Next
EndFunc
Func Quit()
Exit
EndFunc
Главную клавишу конвертирования пришлось изменить,
Ctrl ` вызывало проблемы - пока оставил только
`.