Как назначить другой модификатор для клавиши Alt для X11?

9

Цель:

Я хотел бы назначить Alt для CapsLock-key, а Meta для Alt-key. Но при этом Alt-ключ больше не будет распознаваться как Alt, а CapsLock-ключ больше не будет распознаваться как CapsLock.

openSUSE 11.4

Ранее:

openSUSE 11.1 - поскольку я единственный пользователь своего компьютера, я "просто" отредактировал файл / usr / share / X11 / xkb / keycodes / xfree86, и он работал без проблем. Ключи были привязаны к их символам на самом низком уровне.

Проблемы:

  1. ХКВ

    Я создал вариант польского макета (pl_ext), который (для теста) состоит из таких записей:

    key <CAPS> { [ Alt_L ] };
    modifier_map Mod1 { Alt_L, Alt_R };
    

    Однако это просто ничего не делает, клавиша CapsLock в xev распознается (символ) как Alt_L, но когда я нажимаю клавишу CapsLock, она ведет себя как CapsLock (например, при условии, что у вас есть Файл в меню, Alt + F должна открыть это меню, это не ).

    Вопрос: Как определить файл макета для установки CapsLock-key как Alt, а Alt-key как Meta?

    Изменить: половина успеха здесь! Теперь у меня есть такие записи:

    key <CAPS> { [ Alt_L ] };
    modifier_map Mod1 { <CAPS> }; // this is a difference
    

    и это работает как хотелось бы. Это не:

    key <LALT> { [ Meta_L ] } ;
    key <RALT> { [ Meta_R ] } ;
    modifier_map Mod5 { <LALT>,<RALT> };
    

    Alt-клавиши распознаются как Meta xev, но я все еще могу открывать меню с помощью Alt + F, переключать окна, а я не должен. А с другой стороны, я не могу ввести какой-либо национальный характер, и я должен.

  2. xfree86

    Но теперь это не работает, я думаю, вместо xfree86 читается другая таблица файлов.

    Вопрос: Как узнать, какой файл таблицы ключей используется системой (X / Gnome)?

    Редактировать: лучший вариант для меня - редактирование таблиц кодов клавиш - был решен ответом macias !

  3. Xmodmap

    Половина успеха здесь. Эта часть работает как нужно:

    удалить Lock = Caps_Lock keysym Caps_Lock = Alt_L

    Теперь у меня есть ключ CapsLock, который сопоставлен с Alt. Но это:

    keysym Alt_L = Meta_L

    ... делает странную вещь. xev показывает, что Alt-key сопоставлен с Meta, но когда я нажимаю Alt + F (это должно быть сопоставлено с Meta + F -> ничего не делая), открывается меню File. Более того, когда я нажимаю Alt + Tab, я получаю переключатель окон (я не должен - Alt теперь Meta).

    Вопрос: Как «удалить» старое поведение для Alt-ключа?

    Изменить: эта часть решена ответом Жиля .

Резюме:

Ответ на любой вопрос (надеюсь) решит мою проблему, однако я предпочитаю использовать xkb целиком, потому что затем могу упаковать все файлы для xkb и изменить макет в одном месте. Спасибо заранее за любую помощь!

greenoldman
источник
Если вы нашли ответ, пожалуйста, опубликуйте его и предоставьте достаточно информации для других людей, которые могут быть заинтересованы. (Совершенно хорошо ответить на свой собственный вопрос, если вы нашли ответ в другом месте или самостоятельно; вы можете даже пометить свой ответ как принятый, если хотите.)
Жиль "ТАК - прекрати быть злым"
@ Жиль, хорошо, но я держу твой ответ в качестве ответа, просто чтобы предотвратить возможное обвинение, я сделал это за очки. Кроме того, ваша помощь была очень ценной для меня.
Гринольдман
Вы не получаете баллы за то, что приняли свой ответ в любом случае. (Вы получаете баллы за голоса по своему собственному ответу, и это справедливо, так как вы выполнили работу.) Самое главное, чтобы информация была четко представлена. Теперь есть два ответа на этот вопрос, один с xmodmap и один с xkb, и страница выглядела бы более понятной, если бы они оба были опубликованы как ответы.
Жиль "ТАК - прекрати быть злым"

Ответы:

7

(Этот ответ касается только xmodmap. Я уверен, что это возможно сделать с помощью XKB, я просто не знаю как.)

Модификаторы и ключевые слова назначаются независимо. Но вы получаете странные эффекты, если не устанавливаете их последовательно. Я думаю, что все, что вам не хватает, - это addкоманда для назначения модификатора Meta_L, хотя вам также может потребоваться очистить и переназначить клавиши-модификаторы. Вы можете заменить Mod1и Mod2на Mod3, Mod4и Mod5: они взаимозаменяемы, просто убедитесь, что вы не используете один для двух разных целей.

clear Mod1
clear Mod2
remove Lock = Caps_Lock
keysym Caps_Lock = Alt_L
keysym Alt_L = Meta_L
add Mod1 = Alt_L Alt_R
add Mod2 = Meta_L Meta_R
Жиль "ТАК - перестань быть злым"
источник
Большое спасибо. Таким образом, я использовал Mod5 вместо Mod2 для Meta и теперь могу писать как положено (я использую meta + key для многих национальных символов). Но, как ни странно, теперь у меня снова проблема с CapsLock-ключом - он привязан к ... Meta. Я думаю, почему, потому что когда-то есть привязка к Alt, но затем Alt переопределяется. Так как же изменить ситуацию и один раз настаивать на коде, а второй раз на символе? Я бы не хотел использовать необработанные коды клавиш, потому что они могут меняться с клавиатуры на клавиатуру. Я не могу поменять местами порядок ключей, потому что в последней строке я получу ошибку.
Гринольдман
Проблема в keysym Caps_Lock = Alt_Lтом, что если вы запустите его дважды, он вернет систему в нежелательное состояние. Вот почему я использую коды клавиш ; они различаются между операционными системами и архитектурами (не между клавиатурами), но не так часто.
Жиль "ТАК - перестань быть злым"
Спасибо за объяснение, я сразу угадала :-). Если вы не возражаете, я оставлю этот вопрос дольше без ответа, возможно, кто-нибудь сможет решить мою проблему на уровне xkb, что будет более гибким (переключение раскладок убивает xmodmaps).
Гринольдман
Огромное спасибо, продолжал бороться с символами / ПК без успеха.
Коди Крейвен,
9

Подход к редактированию кодов клавиш

Я нашел ответ на польском форуме Ubuntu. Теперь можно редактировать не файл "xfree86", а файл "evdev". Таким образом, вы можете вносить постоянные изменения, которые работают для всех макетов.

Пример (по запросу Жиля) - войдите в систему как root, перейдите на

/usr/share/X11/xkb/keycodes

сделайте резервную копию файла «evdev», а затем отредактируйте его. Измените коды по своему вкусу, например, в моем случае:

<LALT> = 66; // when I press CapsLock (66 code) system will report pressing LeftAlt
<LMTA> = 64; // I will get LeftMeta when pressing LeftAlt (64 code)

Вы можете найти какие коды, выполнив команду "xev", но вы можете просто посмотреть на оригинальный файл "evdev".

Выйдите, войдите, наслаждайтесь новой клавиатурой :-).

greenoldman
источник
это, вероятно, правильный путь с XKB. Я использую Linux Mint и сталкиваюсь с проблемами, когда Keyboard Preferencesопции для Capslockпереопределения настраиваемой XKBконфигурации я пишу. Так как это переключатель выбора, я не вижу способа остановить применение одного из правил в графическом интерфейсе.
dcunited001
Можете ли вы сохранить поведение LALT? То есть, не меняя его на LMTA? Я пытался, но, видимо, у вас не может быть двух назначений в форме <LALT> = ...
Даниэль
с этим было так легко переключить LALT и RALT на Ubuntu ... большое спасибо. для всех гуглов: сопоставьте alt с другим ключом ubuntu alt с altgr ubuntu remap alt ctrl
Ноэль Шенк
4

попробуй это:

    key <CAPS>  { [ Alt_L, Alt_L ] };
    key <LALT> { [ Meta_L, Meta_L ] };
    modifier_map Mod1 { Alt_L, Alt_R };
    modifier_map Mod5 { Meta_L, Meta_R };

обратите внимание на два определения уровня. Это потому, что по умолчанию для LALT является [Alt_L, Meta_L]; если вы не переопределите второй, он останется Meta_L.

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

partial modifier_keys
xkb_symbols "capsasalt_altasmeta" {
        replace key <CAPS>  { [ Alt_L, Alt_L ] };
        replace key <LALT> { [ Meta_L, Meta_L ] };
        modifier_map Mod1 { Alt_L, Alt_R };
        modifier_map Mod5 { Meta_L, Meta_R };
};
Пабло Саратчага
источник