LINUX.ORG.RU

Можно ли поменять местами Esc и Ё в Vim?

 , ,


2

1

Здравия всем.

Имеется удобная клавиатурка с одним существенным недостатком: на месте Ё у неё Esc, а чтобы напечатать Ё, нужно нажать Fn+Esc.

За годы слепой печати руки привыкли на автомате клацать на Ё, и поэтому при печати русского текста всё время «вылетаю» из режима вставки. И затем ещё успеваю несколько команд набрать, пока не осознаю, что случилось.

Возможно ли через конфиг Vim’а сделать, чтобы при нажатии на Esc в режиме вставки набиралось ё или ` в зависимости от раскладки, а при нажатии на Fn+Esc набиралось Esc?

Благодарю за внимание. Хорошего настроения вам!


Надёжнее глобально на самом низком уровне поменять через udev.

буква ё это на самом деле клавиша grave accent - обратная кавычка, акцент, х.з. как оно называется по-русски.

Понадобятся кейкоды input из /linux/include/uapi/linux/input-event-codes.h где нужные коды определены как KEY_ESC и KEY_GRAVE. Для udev будет прописными без KEY_, т.е. «esc» и «grave». Х.з. почему в udev нельзя было просто KEY_XXXX использовать как в хедере написано, но фиг с ним.

Нужны ещё самые низкоуровневые железячные скан-коды нажатий Fn+Esc и Esc которые можно посмотреть при помощи утилиты evtest например

... нажали Fn+Esc для "ё" или "`"
Event: time 1708344434.050540, type 4 (EV_MSC), code 4 (MSC_SCAN), value 29 <--- сканкод
Event: time 1708344434.050540, type 1 (EV_KEY), code 41 (KEY_GRAVE), value 1
... нажали Esc
Event: time 1708344436.011629, type 4 (EV_MSC), code 4 (MSC_SCAN), value 01 <--- сканкод
Event: time 1708344436.011629, type 1 (EV_KEY), code 1 (KEY_ESC), value 1
...

Соответственно сейчас KEYBOARD_KEY_29 - «ё» или KEY_GRAVE (grave в udev) и KEYBOARD_KEY_01 - Esc или KEY_ESC (esc в udev)

Надо наоборот, значит в /etc/udev/hwdb.d создаём файлик например yo2esc.hwdb где меняем местами привязку сканкодов и кейкодов input

evdev:input:b0011v0001p0001*
 KEYBOARD_KEY_29=esc
 KEYBOARD_KEY_01=grave

Селектор evdev:input:b0011v0001p0001* делается так

$ grep -E '(^I|^N)' /proc/bus/input/devices
...
I: Bus=0011 Vendor=0001 Product=0001 Version=ab54
N: Name="AT Translated Set 2 keyboard"
...

Соответственно Bus=0011 -> b0011, Vendor=0001 -> v0001, Product=0001 -> p0001, а дальше пофиг -> * слепляем, получаем искомое b0011v0001p0001*

Потом заставить udev перезагрузить hwdb udevadm hwdb --update и всё. Везде и всегда эта клавиатура будет выдавать нужные эвенты.

Stanson ★★★★★
()
Ответ на: комментарий от firkax

А то про иксы я про перебиндивание кнопок слышал какой-то простой командой

Вероятно, ты слышал про простую команду xmodmap. Это трэш и угар с кучей неочевидных сюрпризов, если используешь setxkbmap, особенно не только для настройки раскладок.

anonymous
()
Ответ на: комментарий от shTigrits

esc в vim, внезапно, был настроен на caps

Caps слишком удобная кнопка чтоб ее тратить на esc. ИМХО, удобнее всего переключать раскладку клавиатуры клавишей caps, а esc в vim забиндить на tab. Если же нужно напечатать символ табуляции то нажимать shift-tab.

Единственное исключение этого подхода – если нужно кодить на языках, где часто приходится печатать символ табуляции.

iron ★★★★★
()
Ответ на: комментарий от Stanson

Предлагаемый метод работает в виртуалке только для её виртуальной клавиатуры, которая определяется как AT Translated Set 2 Keyboard со следующими параметрами: b0011v0001p0001. Однако если в виртуалку пробросить нужную мне клаву, то для неё это не работает. Естественно, все параметры в файле при этом я изменяю на соответствующие этой клавиатуре.

На реальном компьютере этот метод почему-то не работает ни для одной моей клавиатуры.

1-я клавиатура Logitech полноразмерная, подключена через переходник 2шт.PS/2(для клавы и мыши)-to-USB

Определяется так:

I: Bus=0003 Vendor=13ba Product=0018 Version=0110 N: Name="Barcode Reader " I: Bus=0003 Vendor=13ba Product=0018 Version=0110 N: Name=«Barcode Reader Mouse» I: Bus=0003 Vendor=13ba Product=0018 Version=0110 N: Name=«Barcode Reader System Control» I: Bus=0003 Vendor=13ba Product=0018 Version=0110 N: Name=«Barcode Reader Consumer Control»

evtest для неё выдаёт следующие коды:

^[Event: time 1708362713.459470, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70029 Event: time 1708362713.459470, type 1 (EV_KEY), code 1 (KEY_ESC), value 0

`Event: time 1708362757.851481, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70035 Event: time 1708362757.851481, type 1 (EV_KEY), code 41 (KEY_GRAVE), value 0

И я для неё формирую следующий файл /etc/udev/hwdb.d/yo2esc.hwdb

evdev:input:b0003v13bap0018* KEYBOARD_KEY_70035=esc KEYBOARD_KEY_70029=grave

Далее запускаю udevadm hwdb –update и перезагружаюсь. В виртуалке этого достаточно чтобы начал работать ремап для виртуальной клавиатуры. А на хосте не работает.

2-я клавиатура Redragon 61-клавишная, из-за которой всё и затевается, подключена через USB.

Определяется так:

I: Bus=0003 Vendor=0c45 Product=5004 Version=0111 N: Name=«SONiX Draconic» I: Bus=0003 Vendor=0c45 Product=5004 Version=0111 N: Name=«SONiX Draconic Keyboard» I: Bus=0003 Vendor=0c45 Product=5004 Version=0111 N: Name=«SONiX Draconic» I: Bus=0003 Vendor=0c45 Product=5004 Version=0111 N: Name=«SONiX Draconic Mouse»

evtest для неё выдаёт те же самые коды коды:

^[Event: time 1708362713.459470, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70029 Event: time 1708362713.459470, type 1 (EV_KEY), code 1 (KEY_ESC), value 0

`Event: time 1708362757.851481, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70035 Event: time 1708362757.851481, type 1 (EV_KEY), code 41 (KEY_GRAVE), value 0

И я для неё формирую следующий файл /etc/udev/hwdb.d/yo2esc.hwdb

evdev:input:b0003v0c45p5004* KEYBOARD_KEY_70035=esc KEYBOARD_KEY_70029=grave

Далее запускаю udevadm hwdb –update и перезагружаюсь. И тоже безрезультатно. Странно, что в виртуалке работает для виртуальной клавиатуры, а для реальной не работает.

Подскажите, что я делаю не так?

SomeV
() автор топика
Ответ на: комментарий от SomeV

Можно попробовать выкинуть 700 из сканкодов. Т.е. KEYBOARD_KEY_35 и KEYBOARD_KEY_29 Вдруг сработает?

Документации к системдешному udev на эту тему я вообще никакой не нашёл сходу, так что по-уму надо лезть в сырцы udev и смотреть, может там тонкости какие-то есть для многобайтовых сканкодов больше 255 (ff).

Для эмулируемой клавиатуры виртуалки работает потому что там сканкоды однобайтные скорее всего.

Ещё можно вот что попробовать - селектор девайса широкий, для любых девайсов - evdev:input:* и evdev:atkbd:*.

Посмотреть на селектор девайса можно втыкая-вытыкая клаву при запущенном udevadm monitor --property | grep MODALIAS

ЗЫ: тут есть разметка, рекомундую почитать описание, чтобы камменты читаемые были.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от SomeV

Отрыл USB клаву, она правда старая и греческая, но сканкоды такие же как у тебя.

монитор показывает

...
MODALIAS=input:b0003v062Ap0201 ....
...

в /etc/udev/hwdb/test.hwdb запихал

evdev:input:b0003v062Ap0201*
 KEYBOARD_KEY_70035=esc
 KEYBOARD_KEY_70029=grave

Переназначение работает без проблем.

Event: time 1708373353.916156, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70029
Event: time 1708373353.916156, type 1 (EV_KEY), code 41 (KEY_GRAVE), value 1
Event: time 1708373353.916156, -------------- SYN_REPORT ------------
`Event: time 1708373354.052083, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70029
Event: time 1708373354.052083, type 1 (EV_KEY), code 41 (KEY_GRAVE), value 0
Event: time 1708373354.052083, -------------- SYN_REPORT ------------
Event: time 1708373355.236122, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70035
Event: time 1708373355.236122, type 1 (EV_KEY), code 1 (KEY_ESC), value 1
Event: time 1708373355.236122, -------------- SYN_REPORT ------------
^[Event: time 1708373355.356182, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70035
Event: time 1708373355.356182, type 1 (EV_KEY), code 1 (KEY_ESC), value 0
Event: time 1708373355.356182, -------------- SYN_REPORT ------------

Единственное что - у меня eudev 243.

А, ещё проверь чтобы шестнадцатиричные значения в селекторе evdev:input:… были с заглавными буквами, как udevadm monitor -p выдаёт. У нынешних авторов udev вообще очень странное отношение к этим селекторам и пр. вещам. Как и к документации.

Далее запускаю udevadm hwdb –update и перезагружаюсь. В виртуалке этого достаточно чтобы начал работать ремап для виртуальной клавиатуры. А на хосте не работает.

Ещё, чтобы применилось после udevadm hwdb –update, надо чтобы udev словил ADD, в случае USB клавы достаточно её переподключить.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 2)
Ответ на: комментарий от Stanson

Теперь всё работает! :)

А, ещё проверь чтобы шестнадцатиричные значения в селекторе evdev:input:… были с заглавными буквами, как udevadm monitor -p выдаёт. У нынешних авторов udev вообще очень странное отношение к этим селекторам и пр. вещам. Как и к документации.

Дело было именно в этом. В поле b0003v0c45p5004* заменил «си» на заглавную, и всё заработало. А ведь можно было догадаться по тому, что в самом начале udev ругнулся следующей фразой: Property expected, ignoring record with no properties, и пришлось отступы табуляцией заменить на отступы пробелами. Это говорит о том, что udev очень «чувствителен» к символам, и ему нужно подавать только пробелы, и только заглавные буквы в данном случае.

udevadm monitor -p действительно выдаёт строку MODALIAS=usb:v0C45p5004... где v0C45 видим с заглавной «С». Хотя в других местах тоже самое приводится со строчной буквой: ID_VENDOR_ID=0c45, - двойные стандарты в буквальном смысле.

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

@Stanson, благодарю! Вы мне очень помогли.

И спасибо всем ответившим.

ЗЫ: тут есть разметка, рекомундую почитать описание, чтобы камменты читаемые были.

Да, я сразу попытался скрыть эти большие выводы в спойлеры, но потом увидел, что на форуме спойлеры не работают. А как изменить уже готовый свой ответ не нашёл. Кнопки нет.

SomeV
() автор топика

Если речь идет про X11, то глобальный ремаппинг без учета раскладки можно сделать через xkbcomp.

cat ~/.xkb/symbols/60percent

partial alphanumeric_keys
xkb_symbols "swap_tilde_escape" {
  replace key <ESC> {
    [ grave, asciitilde ]
  };
  replace key <TLDE> {
    [ Escape ]
  };
};
cat ~/.xkb/keymap/mykbd

xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)" };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   { include "pc+us+ru:2+inet(evdev)+group(caps_toggle)+compose(prsc)+60percent(swap_tilde_escape)"  };
        xkb_geometry  { include "pc(pc105)"     };
};
xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY

Периодически слетает, но это бесит меньше, чем Fn постоянно нажимать.

Belkrr
()