Используйте setxkbmap, чтобы поменять местами левый Shift и левый элемент управления

17

Можно ли поменять местами левую Shiftи левую CTRLклавиши setxkbmapвместо xmodmap?

РЕДАКТИРОВАТЬ

Я перешел на Fcitx , который намного лучше работает с моей раскладкой клавиатуры и настраиваемой раскладкой клавиатуры, чем IBus во всех отношениях. Я очень рекомендую это.

день
источник

Ответы:

28

xmodmapустарел; так что на самом деле это должно быть сделано с помощью xkbинструментов.

Кажется, что нужный вам подкачка не включен по умолчанию в файлы X11; поэтому вы должны написать это сами.

Страница http://madduck.net/docs/extending-xkb/ помогла мне понять и найти способ сделать это.

Создайте файл, в ~/.xkb/keymap/mykbdкоторый вы поместите вывод setxkbmap, это будет ваше базовое определение клавиатуры; например:

setxkbmap -print > ~/.xkb/keymap/mykbd

затем создайте файл символов, чтобы определить обмен ключами, поместите его, например, в ~/.xkb/symbols/myswap

там поставьте следующие строки:

partial modifier_keys
xkb_symbols "swap_l_shift_ctrl" {
    replace key <LCTL>  { [ Shift_L ] };
    replace key <LFSH> { [ Control_L ] };
};

затем отредактируйте ~/.xkb/keymap/mykbdфайл и измените xkb_symbolsстроку, чтобы добавить

+myswap(swap_l_shift_ctrl)

наконец, вы можете загрузить его xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY(вы не можете использовать «~» для -Iпараметра). Вероятно, он выдаст много предупреждений о неопределенных символах для некоторых редких ключей, но вы можете их игнорировать (например, перенаправить ошибку в dave:) 2> /dev/null.

Если вы хотите иметь возможность легко переключаться между нормальным и вашим инвертированным сочетанием Ctrl / Shift; просто создайте под ~/.xkb/keymap/другим файлом, без дополнительной опции «myswap», и загрузите его с помощью xkbcomp. Вы можете сделать два небольших скрипта для их загрузки.

Пабло Саратчага
источник
1
Благодарю. Это работает, но на этот раз. Проблема в том, что я использую движок ввода под названием IBus. Всякий раз, когда я переключал метод ввода, а затем обратно нажатием клавиши «Ctrl + Пробел», левый Shift и левый контроль переключаются обратно. Любое предложение о том, как этого избежать.
день
ммн, может быть, IBus делает некоторые переопределения клавиатуры. попробуйте xkbcomp $DISPLAY some.dumpпосле и перед вызовом IBus и выполните различие двух дампов (это полное определение клавиатуры); вы, вероятно, увидите различия.
Пабло Саратчага
Хм, это как раздражает. Есть идеи, чтобы избавиться от проблемы? Обратите внимание, что команда setxkbmap -option caps:escapeработает. IBus запомнил поменявшиеся клавиши Esc и Caps_Lock, но не поменял местами левые клавиши Shift и Left Control.
день
возможно IBus читал клавиатуру при запуске. Попробуйте выгрузить IBus, сменить клавиатуру и загрузить ее снова. Если проблема не устраняется, то следует задать специальный вопрос для IBus (и, возможно, сообщить об ошибке; в общем, IBus должен обнаруживать изменения клавиатуры и
уважать
Здравствуй. Может кто-нибудь сказать мне, как я бы использовал ту же технику, чтобы поменять местами левую клавишу Alt с левой клавишей управления? Я попытался изменить файл myswap на: частичный modifier_keys xkb_symbols "swap_l_shift_ctrl" {замена ключа <LCTL> {[Alt_L]}; заменить ключ <LALT> {[Control_L]}; }; но это не сработало. ТИА !!!
Нил Джирарди
3

Я столкнулся с некоторыми проблемами, связанными LALTс Control_Lиспользованием решения Pablo , похоже, вам также необходимо установить modifier_mapпараметры.

Я скопировал шаблон из /usr/share/X11/xkb/symbols/altwin- ищите xkb_symbols "ctrl_alt_win"- и изменил его, чтобы установить следующие изменения:

  • LALT ключ для управления **
  • LWIN ключ к Alt
  • МЕНЮ ключ к клавише Windows

Окончательный ~/.xkb/symbols/myswapфайл был:

partial modifier_keys
xkb_symbols "swap" {
   key <MENU> {     [   Super_L     ]   };
   key <LALT> { [ Control_L, Control_L  ] };
   key <RALT> { type[Group1] = "TWO_LEVEL",
                symbols[Group1] = [ Alt_R, Meta_R ] };
   key <LWIN> { [ Alt_L, Meta_L ] };
   key <LCTL> { [ Control_L ] };
   key <RCTL> { [ Control_R ] };
   modifier_map Control { <LALT>, <LCTL>, <RCTL> };
   modifier_map Mod1 { <LWIN>, <RALT> };
   modifier_map Mod4 { <MENU> };
};

Я также добавил -w0в xkbcompкоманду, чтобы избежать каких-либо предупреждений при открытии новой оболочки.

xkbcomp -w0 -I$HOME/.xkb $HOME/.xkb/keymap/mykbd $DISPLAY

** Много переключаясь между Mac и Linux, мне нравится иметь две управляющие клавиши в Linux, чтобы приблизить клавиатуру Mac к моей мышечной памяти.

Jo-эль
источник