solovyov.net

Коли робиш хоткеї у джаваскриптових аппках, є вибір з трьох варіантів, як можна зрозуміти, яка натиснута кнопка. Перший, як робили традиційно більшість бібліотек — написаних американцями, авжеж — це дивитися на event.key. Дуже все легко і зрозуміло, робиш if (event.key == ‘s’ and event.ctrlKey) і знаєш, що натиснули ctrl-s. Ну дуже легко.

З мінусів — перемикання на іншу розкладку, скажімо, українську, — і прилітає і. Ну і все, всі хоткеї не працюють. Але є вихід! Коли я писав keymage — я використав event.keyCode. MDN каже numerical code identifying the unmodified value of the pressed key. Ну тобто тиснеш ту кнопку, де s чи i, і прилітає 83 — ASCII-код літери S. Зроби собі один раз мапінг всіх кнопок — і шорткати починають працювати нормально в різних розкладках. Так працює система шорткатів у ProseMirror, він всередині використовує пакет w3c-keyname, який власне мапить keyCode на ім’я (приблизно те саме, що й по посиланню).

АЄОА! Кнопочка біля правого шифта, яка слеш, в англійській розкладці генерує 191, а в українській 190 — точку! Я це якось взагалі не пам’ятав з тих днів, коли писав keymage — можливо не помітив — але в Nounry команд-бар висить саме на cmd-/, і в українській розкладці не працює! 😠

Гарна новина, що з тих часів пройшло вже 10 років (чи гарна це новина, правда?..) і всі браузери поробили собі event.code, який represents a physical key on the keyboard. Йуху! Там прилітає щось на кшталт KeyS чи AltRight чи Slash — і тому можна без проблем робити шорткати, які реагують на натискання однієї і тієї самої фізичної кнопки на клаві!

Тож я взяв до рук patch-package і переробив prosemirror-keymap так, щоби в мене був кльовий модерновий спосіб хендлити шорткати. 😁 Єдине, що цікаво — чи люди, які використовують Dvorak чи там Colemak, що очікують, коли написано cmd-/? Але вони звикші до страждань, тож якось розберуться. :-)

Єдине, з чим залишилося якось розібратися — макосний хоткей на ctrl-k, який видаляє до кінця рядка, перестає працювати в українській розкладці. Не певен, що це питання до мене, правда. :-)

(@ tg)