Коли робиш хоткеї у джаваскриптових аппках, є вибір з трьох варіантів, як можна зрозуміти, яка натиснута кнопка. Перший, як робили традиційно більшість бібліотек — написаних американцями, авжеж — це дивитися на 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
, який видаляє до кінця рядка, перестає працювати в українській розкладці. Не певен, що це питання до мене, правда. :-)