Shift + ISO_Level3_Shift(일명 AltGr)를 사용하는 대신 xkb에서 레벨 4 수정자 또는 잠금 장치에 키를 설정할 수 있는지 궁금합니다.
레벨 6, 7, 8과 동일한 문제입니다("EIGHT_LEVEL" 또는 변형 사용).
레벨 3과 레벨 5는 모두 괜찮은데, 다른 것들은 왜 안 되나요?
답변1
가능하지만 약간 해키합니다. 특정 키 기호가 정의되지 않았습니다. ISO_Level3_{Shift,Latch,Lock}
(level5의 경우에도 동일한 3개)는 X11 및 libxkbcommon 헤더에서 컴파일 타임에 정의됩니다.
compatibility
런타임 시 interpret
섹션 및 ;를 통해 actions
모듈에서 활성화됩니다 . 예를 들어 현재 키맵을 확인하세요.
$ xkbcomp $DISPLAY - | less
//....
xkb_compatibility "complete+ledcaps(shift_lock)" {
//....
interpret ISO_Level3_Shift+AnyOf(all) {
virtualModifier= LevelThree;
useModMapMods=level1;
action= SetMods(modifiers=LevelThree,clearLocks);
};
interpret ISO_Level3_Latch+AnyOf(all) {
virtualModifier= LevelThree;
useModMapMods=level1;
action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
};
interpret ISO_Level3_Lock+AnyOf(all) {
virtualModifier= LevelThree;
useModMapMods=level1;
action= LockMods(modifiers=LevelThree);
};
//....
interpret ISO_Level3_Shift+AnyOfOrNone(all) {
action= SetMods(modifiers=LevelThree,clearLocks);
};
interpret ISO_Level3_Latch+AnyOfOrNone(all) {
action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
};
interpret ISO_Level3_Lock+AnyOfOrNone(all) {
action= LockMods(modifiers=LevelThree);
};
//....
기존 키 기호가 있습니다 ISO_Level2_Latch
. interpret
위와 같은 기존 호환성 섹션은 없지만 추가하면 예상대로 작동합니다. ( Shift
이미 존재하므로 ISO_Level2_Shift
필요하지 않습니다. Shift_Lock
또는 Caps_Lock
대체됩니다 ISO_Level2_Lock
.) 따라서 키를 원하면 키 기호를 Shift_Latch
사용하여 ISO_Level2_Latch
키맵에 추가하세요.
interpret ISO_Level2_Latch+AnyOf(all) {
useModMapMods=level1;
action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
};
interpret ISO_Level2_Latch+AnyOfOrNone(all) {
action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
};
ISO_Level4_Shift
이 방법은 레벨 4, 6, 7, 8에서 사용할 수 있지만 미리 정의된 키 기호 등 은 없습니다. 이를 코드에 추가하고 다시 컴파일하거나 사용되지 않은 일부 키 기호의 용도를 변경하여 레벨 4 교대(또는 래치 또는 잠금)로 해석할 수 있습니다. 헤더 파일을 조사해 보면 libxkbcommon
XKB에 알려진 모든 주요 기호 이름이 우리의 목적에 적합할 것 같습니다.
//....in xkbcommon/xkbcommon-keysyms.h:
//....
#define XKB_KEY_ISO_Fast_Cursor_Left 0xfe2c
#define XKB_KEY_ISO_Fast_Cursor_Right 0xfe2d
#define XKB_KEY_ISO_Fast_Cursor_Up 0xfe2e
#define XKB_KEY_ISO_Fast_Cursor_Down 0xfe2f
XKB_KEY_
XKB 규칙에서 참조할 수 있는 키 기호 이름을 얻으려면 접두사를 제거하세요 . ISO_Fast_Cursor_Left
가짜를 사용해 보자 ISO_Level4_Latch
.
먼저, 다음을 사용하여 기본 키맵을 생성합니다 setxkbmap -print
. 그런 다음 이 파일을 편집하고 이에 재정의를 추가하고 마지막으로 다음을 사용하여 변경된 키맵을 로드합니다 xkbcomp [file] $DISPLAY
.
$ setxkbmap -print > mykeymap.xkb
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+us(altgr-intl)+inet(evdev)" };
xkb_geometry { include "pc(pc105)" };
};
이제 이 파일을 편집하고 필요한 재정의를 입력하세요.
// Attempting to define and use a key as Level4 Shift/Latch/Lock.
// Plan: * activate lv5 shift on rctrl.
// * place latches on lv5 of keys 2,3,4,5 for corresponding level.
// * replace keys ASDF with 8-level versions and define symbols for test.
// * pressing RCtrl+4 then A should result in Á
// starting point: setxkbmap -layout us -variant altgr-intl -option '' -print
// load this file: xkbcomp myfile.xkb $DISPLAY
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat {
include "complete"
// add in interpretations
// ISO_Level3_Latch includes a +AnyOf stanza and a +AnyOfOrNone stanza (same for ISO_Level5_Latch)
// assume each additional latch needs both
interpret ISO_Level2_Latch+AnyOf(all) {
useModMapMods=level1;
action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
};
interpret ISO_Level2_Latch+AnyOfOrNone(all) {
action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
};
interpret ISO_Fast_Cursor_Left+AnyOf(all) {
// Level4 needs both Shift and LevelThree
useModMapMods=level1;
action= LatchMods(modifiers=Shift+LevelThree,clearLocks,latchToLock);
};
interpret ISO_Fast_Cursor_Left+AnyOfOrNone(all) {
// Level4 needs both Shift and LevelThree
action= LatchMods(modifiers=Shift+LevelThree,clearLocks,latchToLock);
};
};
xkb_symbols {
include "pc"
include "us(altgr-intl)"
include "inet(evdev)"
// latch keys
key <AE02> {
type= "EIGHT_LEVEL",
symbols[Group1]= [ 2, at, twosuperior, dead_doubleacute, ISO_Level2_Latch, X, z, Z ]
};
key <AE03> {
type= "EIGHT_LEVEL",
symbols[Group1]= [ 3, numbersign, threesuperior, dead_macron, ISO_Level3_Latch, X, z, Z ]
};
// no ISO_Level4_Latch so use ISO_Fast_Cursor_Left
key <AE04> {
type= "EIGHT_LEVEL",
symbols[Group1]= [ 4, dollar, currency, sterling, ISO_Fast_Cursor_Left, X, z, Z ]
};
key <AE05> {
type= "EIGHT_LEVEL",
symbols[Group1]= [ 5, percent, EuroSign, dead_cedilla, ISO_Level5_Latch, X, z, Z ]
};
// no ISO_Level6_Latch so use ISO_Fast_Cursor_Right
// no ISO_Level7_Latch so use ISO_Fast_Cursor_Up
// no ISO_Level8_Latch so use ISO_Fast_Cursor_Down
// eight-level keys ASDF for testing
key <AC01> {
type= "EIGHT_LEVEL_SEMIALPHABETIC",
symbols[Group1]= [ a, A, aacute, Aacute, agrave, Agrave, aring, Aring ]
};
key <AC02> {
type= "EIGHT_LEVEL_SEMIALPHABETIC",
symbols[Group1]= [ s, S, ssharp, section, ccedilla, Ccedilla, ntilde, Ntilde ]
};
key <AC03> {
type= "EIGHT_LEVEL_SEMIALPHABETIC",
symbols[Group1]= [ d, D, eth, ETH, thorn, THORN, t, T ]
};
key <AC04> {
type= "EIGHT_LEVEL_SEMIALPHABETIC",
symbols[Group1]= [ f, F, eacute, Eacute, x, X, z, Z ]
};
// ISO_Level3_Shift on Right Alt
include "level3(ralt_switch)"
// ISO_Level5_Shift on Right Ctrl
include "level5(rctrl_switch)"
};
xkb_geometry { include "pc(pc105)" };
};
이제 걸쇠를 테스트할 수 있습니다(위 예에서는 ISO_Level5_Shift
마우스 오른쪽 버튼을 클릭해야 합니다 Ctrl
. xkbcomp
그렇지 않은 경우 명령을 다시 실행하십시오).
ISO_Level5_Shift+2
그러면 a인쇄되어야합니다A
ISO_Level5_Shift+3
그러면 a인쇄되어야합니다á
ISO_Level5_Shift+4
그러면 a인쇄되어야합니다Á
ISO_Level5_Shift+5
그러면 a인쇄되어야합니다à
테스트에서 RCtrl-as-level5-shift가 약간 불안정하고 항상 올바르게 적용되지는 않는다는 것을 확인했습니다. 일반적으로 xkbcomp
명령을 한두 번 다시 실행하면 작동하게 됩니다. A또는 키를 사용하여 F테스트하면 Ctrl+D쉘이 종료될 수 있습니다.
일부 앱은 우리가 빌린 키보드 기호를 인식하지 못하여 이상한 작업을 수행할 수 있습니다. 예를 들어, Firefox는 4
올바른 래치가 활성화되면 짝수를 인쇄하므로 키 시퀀스가 rctrl+4 then a
발생합니다 4Á
. 이는 3과 5의 실제 키 기호에서는 발생하지 않으므로 다른 키 기호를 차용하면 Firefox는 아무것도 인쇄해서는 안 된다는 것을 깨닫게 됩니다. 지금까지 대부분의 터미널 애플리케이션은 예상대로 작동하고 있습니다.
답변2
나는 같은 문제에 직면하여 더 직접적인 방법을 찾았습니다. 내 사용 사례는 단 한 번의 클릭으로 레벨 7로 바로가기를 얻는 것입니다. 이는 매우 일반적이며 해킹이 아닙니다.
추가 레벨 이름의 경우 이미 사용된 Shift, LevelThree 및 LevelFive 외에도 가상 수정자 Super 또는 Hyper(또는 Meta)를 사용할 수도 있습니다. 저는 레벨 7에서 Hyper를 사용할 예정입니다. Super 및 Hyper에 대한 해석은 /usr/share/X11/compat/misc에 정의되어 있으며 기본 구성에 포함되어 있습니다.
추가 단축키를 추가하기 위해 새 단축키를 만듭니다.유형. 일반적으로 8개 수준에 사용되는 유형은 EIGHT_LEVEL이며 /usr/share/X11/xkb/types/level5에 정의되어 있습니다. 다음 내용으로 level7_hyper라는 파일을 생성하고 /usr/share/X11/xkb/types에 저장합니다. 원하는 경우 동일한 레벨에 대해 여러 키 조합을 설정할 수 있습니다.
default partial xkb_types "default" {
// Adds the shortcut Hyper to reach level 7
// and Hyper+Shift to reach level 8
virtual_modifiers LevelThree, LevelFive, Hyper;
type "EIGHT_LEVEL_HYPER" {
modifiers = Shift + LevelThree + LevelFive + Hyper;
map[None] = Level1;
map[Shift] = Level2;
map[LevelThree] = Level3;
map[Shift+LevelThree] = Level4;
map[LevelFive] = Level5;
map[Shift+LevelFive] = Level6;
map[Hyper] = Level7;
map[LevelThree+LevelFive] = Level7;
map[Shift+Hyper] = Level8;
map[Shift+LevelThree+LevelFive] = Level8;
level_name[Level1] = "Base";
level_name[Level2] = "Shift";
level_name[Level3] = "Alt Base";
level_name[Level4] = "Shift Alt";
level_name[Level5] = "X";
level_name[Level6] = "X Shift";
level_name[Level7] = "X Alt Base";
level_name[Level8] = "X Shift Alt";
};
};
기호 파일에서 이 유형을 사용하려면 이 최소 작업 예제를 수정하십시오. 예를 들어 /usr/share/X11/xkb/symbols/level7se로 저장하세요.
default partial alphanumeric_keys
xkb_symbols "level7se" {
// Include your favourite symbols
include "se"
name[Group1]="Level7-se";
key.type[Group1] = "EIGHT_LEVEL_HYPER";
// Copy in the lines from the symbols file of your choice and make
// your edits, here just the button A
key <AC01> { [ a, A, b, B, c, C, d, D ]};
// Modifier keys only have one level
key.type[Group1] = "ONE_LEVEL";
// Right Alt gives level 3
key <RALT> {[ ISO_Level3_Shift ]};
// Left Win key gives level 5
key <LWIN> {[ ISO_Level5_Shift ]};
// The button to the left of the number line (paragraph on Swedish
// keyboards. Tilde on some others?) gives level 7.
key <TLDE> {[ Hyper_R ]};
};
그런 다음 다음을 사용하여 구성을 로드할 수 있습니다.
setxkbmap -types complete+level7_hyper level7se
수정자 키가 ONE_LEVEL 유형을 사용하므로 전체 유형도 포함해야 합니다.
더 많은 수준의 단축키를 얻으려면 유형 파일에 해당 행을 추가하고 기호 파일에 해당 섹션을 추가하면 됩니다.