Pull to refresh

Comments 13

Да уж, монументальная работа. Даже не подозревал, что чисто на AutoHotkey можно написать настолько сложную штуку. У меня скрипт, который переключает раскладку по CapsLock и показывает на экране всплывающую надпись "RUS" или "ENG", на полсотни строк, из них половина скопирована из чужих наработок, так я и то утомился его писать, настолько противоестественный язык :)

SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

CapsLock::SetInputLang(0x0409) ; English (USA)
+CapsLock::SetInputLang(0x0419) ; Russian

SetInputLang(Lang)
{
    WinExist("A")
    ControlGetFocus, CtrlInFocus
    PostMessage, 0x50, 0, % Lang, %CtrlInFocus%
}

isFullScreen()
{
    WinGetPos ,,, wp, hp, A
    return (wp hp = A_ScreenWidth A_ScreenHeight)
}

#If isFullScreen()
LWin::Return
#If

Капслок на английский, шифт+капслок на русский, ну и заодно блокирует кнопку "Вынь" в полноэкранных приложениях.

Ну мне два разных хоткея неудобно, удобно переключаться одним, но показывать, на что переключились. Так что вот так:

CapsLock::
{
	CloseOSD()

	DetectHiddenWindows, on
	SetFormat, Integer, H
	WinGetClass, AWinClass, A
	If (AWinClass = "ApplicationFrameWindow") {
		ControlGetFocus, Focused, A
		ControlGet, WinID, Hwnd, , % Focused, A
	} Else {
		WinGet, WinID, ID, A
	}
	ThreadID := DllCall("GetWindowThreadProcessId", "UInt", WinID, "UInt", 0)
	InputLocaleID := DllCall("GetKeyboardLayout", "UInt", ThreadID)

	If (InputLocaleID = 0x4090409) {
		LayoutID := DllCall("LoadKeyboardLayout", "Str", "00000419", "Int", 1)
		KBLang = RUS
	}
	If (InputLocaleID = 0x4190419) {
		LayoutID := DllCall("LoadKeyboardLayout", "Str", "00000409", "Int", 1)
		KBLang = ENG
	}
 	ControlGetFocus, control, A
	PostMessage 0x50, 2, %language%, %control%, A ; WM_INPUTLANGCHANGEREQUEST

	MonX := A_ScreenWidth / 2 - 50
	MonY := A_ScreenHeight / 2 - 20
	Gui, +AlwaysOnTop +LastFound +Owner
	Gui, Color, EEAA99
	Gui, Font, s32, Calibri
	Gui, Add, Text, cWhite x0 y0, %kblang%
	WinSet, TransColor, EEAA99
	Gui, -Caption
	Gui, Show, X%MonX% Y%MonY% NA, AHK_OSD
	SetTimer, CloseOSD, 500
	return
}
CloseOSD()
{
	Gui, Destroy
	SetTimer, , Delete
	return
}

Но вообще, конечно, вот такой синтаксис выносит мозг совершенно. Если бы я замахивался на проект такого масштаба, как у автора статьи - всё же выбрал бы написание с нуля на нормальном языке, проще ту часть, которую нам даёт AutoHotkey (установка хука и обёртки над несколькими API) реализовать самому, чем так... IMHO, конечно.

Скриптовый язык легко справляется с такими задачами - это же не анализ быстрых данных, где можно легко захлебнуться. Олимпийская скорость пять символов в секунду. Частота обновления позиции флажка 25 раз в секунду за глаза. Синтаксис же кто к чему привык и где родился

В скорости не сомневаюсь, я именно про возможности языка и синтаксис. От вызова внешних функций с указанием типов данных аргументов как строк в виде ещё одних аргументов уже трясёт :) Ну и многострочные конструкции с Gui, скажем, это ж какая боль писать отлаживать, наверное... Я, помнится, давно-давно начинал с VBA, и до сих пор очень много чего у меня написано на bash (гораздо длиннее, чем стóило писать на bash) - но добровольно к этим языкам уже не вернусь. А тут всё настолько хуже... Что заставляет ещё больше восхищаться результатом Вашей работы, впрочем :)

Автопереключение в программе скорее всего будет, но нужно выработать какой-то бескровный метод осуществления этого ("Образование вводить осторожно, избегая кровопролития..." - М.Е. Салтыков-Щедрин, "История одного города"). Разностный метод Сергея Москалева (такого слова не может быть в этом языке никогда, поэтому мы переключим раскладку!) слишком трудоемок, требует длительной доводки на всяких несуразностях и вызывает ужас у человека, морально не готового убить на это время. Скорее всего, надо перейти к чему-то более простому, связанному с использованием словарей, что позволяет развитие компьютеров за последние 20 лет

Поддавшись веяниям времени :), решил и для этой задачи проверить ChatGPT. Не справилась:

Т.е. то, что это был русский, угадала, но почему вместо введённого "На каком языке это написано" появилось какое-то "На первый взгляд всё просто" - загадка.
Но в принципе, наверное, натренировать нейросеть специально на такую задачу должно быть не очень сложно. А OpenAI API в любом случае из-за скорости ответа не подошёл бы. Другой вопрос, что если писать не только человекочитаемые тексты, а, скажем, код - думаю, с любым подходом false positives будут зашкаливающие.

Никакой искусственный интеллект не решит задачу из новомодных аббревиатур, метафор и просто выразительного мычания. Со времен создания Пунто этот вопрос только усугубился.

Как раз в этих случаях у него, по крайней мере, будет больше шансов, чем у чисто словарного подхода.

Хотя по мне так игра не стóит свеч, решение, которое работает в 99% случаев, но глючит в оставшихся 1%, заставляя исправлять вручную, хуже, чем вообще никакого решения.

Но тут субъективно, конечно. Мне и ручное исправление неверной раскладки не нужно (ну введу я по ошибке максимум 3-5 символов, прежде чем замечу неладное, быстрее вручную удалить и перенабрать), но успех Punto и последователей намекает, что я в меньшинстве.

Я с восхищением отношусь к способности/готовности людей прилагать практические усилия для улучшения повседневных задач, особенно связанных с набором текста (сам претендую туда же), Однако...

... придерживаюсь мнения несколько "перпендикулярного" положенному в основу данной статьи, а именно - функция "исправления раскладки в набранном тексте" является методологически вредной. Поясню: сам факт наличия этой функции продлевает/поощряет практику "зрячего" (противоположного "слепому") набора текста, которая и является корнем решаемой проблемы (на самом деле сразу нескольких проблем, наиболее важной из которых я бы назвал неправильную эргономику* при типовом способе ввода информации).

Лично я после ~20лет "зрячего" набора (с костылем в виде Punto Switcher) в возрасте 40+ в итоге "преодолел себя" и освоил "слепой набор" (к сожалению пока только на русском языке).
... и теперь считаю что если бы не было Punto Switcher-а, то мой период "зрячего" ввода продлился бы меньше и соответственно меньше моих сил ушло бы на освоение "слепого" (со всех точек зрения более правильного) набора.

Однако это не означает, что меня полностью устраивает стандартный подход к набору текста.
Как и автора статьи меня не устраивает способ индикации активной раскладки (точнее даже информирования о моменте ее переключения). Более того меня и стандартный способ смены раскладки не особо устраивает...

Я долго думал как можно улучшить ситуацию и с учетом того, что я использую только две раскладки (русскую и английскую) пришел к следующим выводам:

  1. Циклический переключатель раскладок это зло. За активацию каждой из двух раскладок должна отвечать отдельная кнопка.

  2. В момент переключения раскладки в середине моего поля зрения должен кратковременно отображаться соответствующий индикатор.

В итоге я создал свой AutoHotKey скрипт-помощник**, который:
А. Активирует русскую раскладку при двойном нажатии Shift-левый.
Б. Активирует английскую раскладку при двойном нажатии Shift-правый.
В. Кратковременно (~0,5сек) отображает текстовый индикатор с названием активного языка в центральной верхней части экрана.
Г. Воспроизводит приглушенный короткий звук при смене раскладки.

Да к новому способу переключения раскладки пришлось некоторое время привыкать, но он не подменяет а дополняет штатный, а значит другие пользователи без проблем смогут пользоваться моим ПК. На чужом ПК при отсутствии моего скрипта я буду испытывать некоторое неудобство, но не такое как если бы я не владел слепым набором и на нем не было бы Punto Switcher.

Тут и постоянный отрыв взгляда от области внимания (монитора) и перенос правой руки с клавиатуры на мышь и обратно.
Дополнительной инвестицией в улучшению персональной эргономики стала покупка клавиатуры без цифрового блока и с трекпойнтом (модель Lenovo SK-8855).

**
; ==========================
; Double-press inspired with https://autohotkey.com/board/topic/34078-using-double-shift-as-backspace-resolved/
;===========================

#NoEnv
#SingleInstance force
Process Priority,, High ;!!!
CoordMode, ToolTip, Screen

; ==========================
; If the script is not elevated, relaunch as administrator and kill current instance:

full_command_line := DllCall("GetCommandLine", "str")

; if not (A_IsAdmin or RegExMatch(full_command_line, " /restart(?!\S)"))
; {
; try ; leads to having the script re-launching itself as administrator
; {
; if A_IsCompiled
; Run *RunAs "%A_ScriptFullPath%" /restart
; else
; Run *RunAs "%A_AhkPath%" /restart "%A_ScriptFullPath%"
; }
; ExitApp
; }
; ==========================

STO=0.1 ; Short Time-Out duration
LTO=0.5 ; Long Time-Out duration

SC056::LShift ; L-BackSlash As L-Shift

;; ==========================
;; Double-press L-BackSlash As Double-press of L-Shift
;; ==========================
; ::SC056::
; {
; MsgBox "Left-Shift double press."
; SwtichLang(0x04190419) ; RU
; }
; Return
;; ==========================

~LShift::
KeyWait, LShift, T %STO% ; short timeout to prevent accidents
If Errorlevel
Return
KeyWait, LShift, D T %LTO% ; long timeout to prevent accidents
If Errorlevel
Return
{
; MsgBox "Left-Shift double press."
SwtichLang(0x04190419) ; RU
}
Return

~RShift::
KeyWait, RShift, T %STO% ; short timeout to prevent accidents
If Errorlevel
Return
KeyWait, RShift, D T %LTO% ; long timeout to prevent accidents
If Errorlevel
Return
{
; MsgBox "Right-Shift double press."
SwtichLang(0x04090409) ; EN
}
Return

; ==========================
SwtichLang(newLocale)
{
Thread Priority, 1 ; No re-entrance
If ( InputLocaleID := DllCall("GetKeyboardLayout", "UInt", ThreadID := DllCall("GetWindowThreadProcessId", "UInt", WinExist("A"), "UInt", 0), "UInt") )
{
If (InputLocaleID != newLocale)
{
ControlGetFocus,ctl
PostMessage 0x50,3,%newLocale%,%ctl%,A
SoundBeep 800, 100
SoundBeep 500, 500.
If (newLocale=0x04190419)
{
MsgBody=############# r##-РУССКИЙ-## r#############
} else If (newLocale=0x04090409) {
MsgBody=############ r##-ENGLISH-## r############
}
DisplayWidth = 2560 ; QHD=2560 ; FHD=1920
; DisplayHeight = 1440 ; QHD=1440 ; FHD=1080
Loop 100
ToolTip,%MsgBody%,(DisplayWidth-270)/2,0 ;DisplayHeight-57
ToolTip
return
}
}
}

сам факт наличия этой функции продлевает/поощряет практику «зрячего» (противоположного «слепому») набора текста, которая и является корнем решаемой проблемы
Это некорректное противопоставление. Набор в неправильной раскладке может происходить незамеченным не только когда пользователь смотрит на клавиатуру, но и когда он смотрит куда-то ещё. У меня, например, достаточно регулярно возникает ситуация, когда я установил курсор, начал набивать текст, а сам в это время шарю глазами по экрану, отмечая для себя какие-то детали, которые пригодятся для набираемого сообщения. Возвращаюсь глазами к тексту — а там уже целое предложение не в той раскладке набито.

с 1987 года за клавиатурой, регулярно до 2005 пользовался разными тренажерами чтобы научиться печатать вслепую, а потом бросил, так как в принципе такой вид набора мой организм отторгает. Дело в том что я печатаю явно думая о том что я печатаю и диктуя самому себе, скорость надиктовки весьма небыстрая, так как я обдумываю сам текст который мне нужно набрать. То есть у меня набор текста не уходит в подсознательное, как один из способов выражения мысли, как, по идее, и должно быть. Если я смотрю на экран, то я 100% времени посвящаю зрительной части и не занимаюсь более ничем.

В свое время меня пугало то, что я участь вождению (а решился я на это только в 26 лет) думал как я справлюсь. Успокаивало меня только то, что я ребенком очень хорошо ездил на велосипеде. В итоге в дороге я весьма хорошо управлялся с вождением, но например если рядом собеседник и он со мной говорит, то я отвечаю долго и медленно, мой ответ может выглядеть вот так (точками расставил паузы в 1 секунду):

- Как вчера съездил на рыбалку? (спрашивают у меня)

- Я.....хм.....поехали на озеро Х.........прикорм забыли.....

И так далее, точки это моменты когда я на дороге на что-то реагировал, то есть я переключался с одной задачи на другую, дорога конечно в приоритете.

Когда смотрю на экран я легко могу остановиться печатать и начать думать о чем-то что увидел на экране.

Думаю из-за этого я в принципе не умею играть в быстрые игры вроде Мортал Комбат или Starcraft или что-то онлайн с быстрой реакцией.

Речь, кажется, идет о Хэмингуэевском способе написания произведений. Отсечь все пути отступления и держаться за импульс и наитие, никогда не глядя назад и ничего не исправляя. Реальная жизнь далека от этого. Обратный путь нужен, вопрос только какого вида.

Sign up to leave a comment.

Articles