Как я могу заставить мои клавиши стрелок ISO_Level5_Shift работать в Java Swing GUI?

1051
Owen

У меня есть раскладка клавиатуры, которая используется ISO_Level5_Shiftдля предоставления клавиш со стрелками. Из моего файла символов макета:

key <AC06> { type[Group1]="EIGHT_LEVEL", [ d, D, ampersand, U2227, Home, Home, Greek_delta, Greek_DELTA ]}; key <AC07> { type[Group1]="EIGHT_LEVEL", [ h, H, parenright, U27E9, Left, Left, Greek_eta, Greek_ETA, U210F ]}; key <AC08> { type[Group1]="EIGHT_LEVEL", [ t, T, parenleft, U27E8, Down, Down, Greek_tau, Greek_TAU ]}; key <AC09> { type[Group1]="EIGHT_LEVEL", [ n, N, slash, U2115, Right, Right, Greek_nu, Greek_NU ]}; key <AC10> { type[Group1]="EIGHT_LEVEL", [ s, S, underscore, U2237, End, End, Greek_sigma, Greek_SIGMA ]}; 

Они работают в большинстве программ (Firefox, Eclipse, Vim, ...). К сожалению, они не работают в любом Java Swing GUI, который я когда-либо использовал. В частности, они не работают в IntelliJ IDEA, и именно это меня особенно беспокоило.

Есть ли что-то, что я мог бы изменить в своем макете, или переменные среды, связанные с Java, или конфигурацию IDEA, которые могли бы решить эту проблему?

1

3 ответа на вопрос

6
Owen

ОК, я нашел решение. Это на самом деле не идеально, но оно получает желаемое поведение.

Во-первых, я сбросил полное состояние конфигурации клавиатуры, используя

$ xkbcomp $DISPLAY - > now.xkb 

Затем я нашел строки

interpret Overlay1_Enable+AnyOfOrNone(all) { action= LockControls(controls=Overlay1); }; 

и изменил его на

interpret Overlay1_Enable+AnyOfOrNone(all) { action= SetControls(controls=Overlay1); }; 

что предотвращает «залипание» модификатора, т.е. он применяется только тогда, когда вы удерживаете клавишу нажатой.

Затем я взял ключ, который раньше был моим ISO_Level5_Shift:

key <TAB> { type= "ONE_LEVEL", symbols[Group1]= [ ISO_Level5_Shift ] }; 

и изменил его на Overlay1_Enable:

key <TAB> { type= "ONE_LEVEL", symbols[Group1]= [ Overlay1_Enable ] }; 

Затем для каждого ключа, где я хотел, чтобы изменение вступило в силу, я добавил определение наложения:

key <AD07> { type= "EIGHT_LEVEL", overlay1= <PGUP>, symbols[Group1]= [ g, G, asterisk, G, Prior, G, Greek_gamma, Greek_GAMMA ] }; 

Затем заново применил все это с

$ xkbcomp now.xkb $DISPLAY 

Полезная документация:

0

У меня тоже были проблемы с этим, вот мое решение, использующее в качестве переключателя оверлея ключ блокировки caps для включения навигации, подобной emacs / vim, надеюсь, это поможет всем, кто хочет сделать что-то подобное.

// Emacs like keys with CAPS as overlay switch.  // Using ISO_Level3_Shift or ISO_Level5_Shift would also make // most applications work and would have been more flexible, // however they don't work in Java Swing apps (e.g. IntelliJ IDEA) // but using overlay works  // To enable, save this file as /usr/share/X11/xkb/symbols/emacs and run: // // setxkbmap -option '' "emacs" // // However it may not persist and can get reset back to the default by other things. // Alternatively, insert the following into /usr/share/X11/xkb/rules/evdev.xml // ... // <layoutList> // ... // <layout> // <configItem> // <name>emacs</name> // <shortDescription>en</shortDescription> // <description>English (US, Emacs)</description> // <languageList> // <iso639Id>eng</iso639Id> // </languageList> // </configItem> // </layout> // ... // </layoutList> // ... // Then you should be able to choose 'English (US, Emacs)' in a keyboard preference // GUI such as fcitx and have it persist.  default partial alphanumeric_keys xkb_symbols "basic" {  // Base keyboard functionality, using 'us' here // See definitions in /usr/share/X11/xkb/symbols // e.g. 'include "us(intl)"' where 'intl' is defined inside the 'us' file include "us"  // Press Shift_L + Shift_R together as an alternative way to toggle Caps_Lock, // then turn CAPS key to enable overlay1 mode when and only when holding down. include "shift(both_capslock)" key <CAPS> ;  // Emacs like navigation keys when holding down <CAPS> // e.g. caps + n to go down key <AB05> ; // b key <AC04> ; // f key <AD10> ; // p key <AB06> ; // n key <AC01> ; // a key <AD03> ; // e key <AC05> ; // g  // Emacs like editing keys when holding down <CAPS> // Redo/Undo only work with applications that understand the them key <AB10> ; // / key <UNDO> {[Undo, Redo]}; // Shift + / -> Redo key <AC03> ; // d  // VIM like navigation keys when holding down <CAPS> key <AC06> ; // h key <AC09> ; // l key <AC08> ; // k key <AC07> ; // j  }; 
0
drets

В частности, они не работают в IntelliJ IDEA, и именно это меня особенно беспокоило.

Существует обходной путь - сопоставить нужные ключи на стороне IntelliJ IDEA.

  1. Перейдите в Настройки ⇒ Keymap.
  2. Найдите клавишу, которая не работает, когда нажата комбинация клавиш «iso level shift» (скажем, клавиша «Вверх»).
  3. Выберите «Добавить сочетание клавиш».
  4. Нажмите комбинацию клавиш «iso level shift», которая не работает как клавиша «вверх» в IntelliJ.
  5. Применять.

Вуаля, комбинация клавиш «сдвиг уровня iso» ведет себя как клавиша «вверх» даже в IntelliJ IDEA.