LINUX.ORG.RU

Изменение клавиш через XKB работает не во всех программах

 


0

2

Здравствуйте! Перенес некоторые клавиши - изменения работают, но не везде. Конфиг:

# ~/.config/xkb/compat/my:
xkb_compat "my" {
        interpret ISO_Level3_Shift { action= SetMods(modifiers=Mod5); };
}

# ~/.config/xkb/types/my:
xkb_types "my" {
        type "THREE_LEVEL" {
                modifiers= Shift+Mod5;
                map[None]= Level1;
                map[Shift]= Level2;
                map[Mod5]= Level3;
                map[Shift+Mod5]= Level3;
                level_name[Level1]= "Base";
                level_name[Level2]= "Caps";
                level_name[level3]= "Custom";
        };
};

# ~/.config/xkb/symbols/my:
xkb_symbols "my"   { 
        key <CAPS> { [ Control_L ] };

        key <TAB> { [ ISO_Level3_Shift ] };
        key <LCTL> { [ Tab ] };
        modifier_map Mod5 { ISO_Level3_Shift };

        key <AC06> { type="THREE_LEVEL", [ h, H, Left ] };
        key <AC07> { type="THREE_LEVEL", [ j, J, Down ] };
        key <AC08> { type="THREE_LEVEL", [ k, K, Up ] };
        key <AC09> { type="THREE_LEVEL", [ l, L, Right ] };

        key <AD10> { type="THREE_LEVEL", [p, P, BackSpace] };
        key <AD08> { type="THREE_LEVEL", [i, I, Insert] };
        key <AD07> { type="THREE_LEVEL", [u, U, Delete] };
        key <AD02> { type="THREE_LEVEL", [w, W, Home] };
        key <AD03> { type="THREE_LEVEL", [e, E, End] };
};

Применяю этот конфиг такой коммандой:

setxkbmap -layout "us+my(my),ru(winkeys)" -option "" -print | xkbcomp -I"$HOME/.config/xkb" - "${DISPLAY%%.*}"

Логика такая что при зажатом TAB клавиши h,j,k,l работают как стрелки, ну вообщем всем известный Vim.

Так вот все это работает полностью и как положено во многих приложениях, например в браузере, в файловом менеджере, но криво работает в терминале и в PhpStorm.

В терминале работает комбинация TAB+p - эмулирует BackSpace. Но например TAB+j не рабоает, при нажатии выводит символ «B», хотя например в браузере работает как положено (Стрелка вниз).

А в PhpStorm ничего не работает ни в самом редакторе ни в менюшках.

Прошу помочь, знающих людей. Спасибо.

P.S. Система Debian Stretch, KDE 5 plasma.

Для начала думаю стоит проверить вне плазмы в каком-нибудь Fluxbox или XFCE.

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

А что это даст ? Допустим вне плазмы работает нормально, и что ?

posmotret ()

В терминале работает комбинация TAB+p — эмулирует BackSpace.

Ну, Mod5 или ISO_Level3_Shift (смотря что за «терминал») понимается как «контроль». Не сказать, что это нормально, но исправлять-то это надо не здесь.

хотя например в браузере работает как положено (Стрелка вниз)

Это не «как положено», вы не это приказали. Это просто ваш браузер понимает команду <ISO_Level3_Shift-Down> точно так же, как и просто <Down>.

Если же вы хотите программно *отжимать* на самом деле зажатый модификатор, то это надо указать явно — в RedirectKey() есть clearmods.

Ну или вообще можно использовать не третий (пятый, седьмой) уровни раскладки, а overlay.

при зажатом TAB клавиши h,j,k,l работают как стрелки, ну вообщем всем известный Vim.

Хм, мне казалось, что Ви предполагает *залипающий* модификатор, а не просто раскоряченные в строку стрелочки.

Zmicier ★★★★★ ()

key <AC06> { type="THREE_LEVEL", [ h, H, Left ] };

По-моему, вы тут что-то сломали. Не на пустом же месте пришлось придумывать *_ALPHABETIC да *_SEMIALPHABETIC.

Zmicier ★★★★★ ()

~/.xkb.d/types/action

// -*-prog-*-

partial default xkb_types "action" {

    type "FOUR_LEVEL+ACTION" {
	modifiers = Shift+LevelThree+Control+Alt;
	map[None] = Level1;
	map[Shift] = Level2;
	map[LevelThree] = Level3;
	map[Shift+LevelThree] = Level4;
        map[Control] = Level5;
        map[Alt] = Level6;
        map[Control+Alt] = Level7;
        map[Shift+Alt] = Level8;
	level_name[Level1] = "Base";
	level_name[Level2] = "Shift";
	level_name[Level3] = "AltGr Base";
	level_name[Level4] = "Shift AltGr";
        level_name[Level5] = "Control";
        level_name[Level6] = "Alt";
        level_name[Level7] = "Control Alt";
        level_name[Level8] = "Shift Alt";
    };

    type "FOUR_LEVEL_ALPHABETIC+ACTION" {
	modifiers = Shift+Lock+LevelThree+Control+Alt;
	map[None] = Level1;
	map[Shift] = Level2;
	map[Lock]  = Level2;
	map[LevelThree] = Level3;
	map[Shift+LevelThree] = Level4;
	map[Lock+LevelThree] =  Level4;
	map[Lock+Shift+LevelThree] =  Level3;
        map[Control] = Level5;
        map[Alt] = Level6;
        map[Control+Alt] = Level7;
        map[Shift+Alt] = Level8;
	level_name[Level1] = "Base";
	level_name[Level2] = "Shift";
	level_name[Level3] = "AltGr Base";
	level_name[Level4] = "Shift AltGr";
        level_name[Level5] = "Control";
        level_name[Level6] = "Alt";
        level_name[Level7] = "Control Alt";
        level_name[Level8] = "Shift Alt";
    };

    type "FOUR_LEVEL_SEMIALPHABETIC+ACTION" {
	modifiers = Shift+Lock+LevelThree+Control+Alt;
	map[None] = Level1;
	map[Shift] = Level2;
	map[Lock]  = Level2;
	map[LevelThree] = Level3;
	map[Shift+LevelThree] = Level4;
	map[Lock+LevelThree] =  Level3;
	map[Lock+Shift+LevelThree] = Level4;
	preserve[Lock+LevelThree] = Lock;
	preserve[Lock+Shift+LevelThree] = Lock;
        map[Control] = Level5;
        map[Alt] = Level6;
        map[Control+Alt] = Level7;
        map[Shift+Alt] = Level8;
	level_name[Level1] = "Base";
	level_name[Level2] = "Shift";
	level_name[Level3] = "Alt Base";
	level_name[Level4] = "Shift Alt";
        level_name[Level5] = "Control";
        level_name[Level6] = "Alt";
        level_name[Level7] = "Control Alt";
        level_name[Level8] = "Shift Alt";
    };

};
Zmicier ★★★★★ ()

~/.xkb.d/symbols/emacs

// -*-prog-*-

partial alphanumeric_keys
xkb_symbols "alphabetic" {

    key <LatP> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<UP>, clearmods=Control) ] };
    key <LatF> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<RGHT>, clearmods=Control),
                    RedirectKey(key=<RGHT>, mods=Control, clearmods=Alt) ] };
    key <LatB> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<LEFT>, clearmods=Control),
                    RedirectKey(key=<LEFT>, mods=Control, clearmods=Alt) ] };
    key <LatN> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<DOWN>, clearmods=Control) ] };

    key <LatE> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<END>, clearmods=Control) ] };
    key <LatA> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<HOME>, clearmods=Control) ] };

    key <LatJ> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<LNFD>, clearmods=Control) ] };
    key <LatM> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<RTRN>, clearmods=Control) ] };
    key <LatI> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<TAB>, clearmods=Control) ] };

    key <LatD> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<DELE>, clearmods=Control),
                    RedirectKey(key=<DELE>) ] };
    key <LatK> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<DELE>, mods=Shift) ] };

    key <LatV> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<PGDN>, clearmods=Control),
                    RedirectKey(key=<PGUP>, clearmods=Alt) ] };

    key <LatW> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<CUT>, clearmods=Control),
                    RedirectKey(key=<COPY>, clearmods=Alt) ] };
    key <LatY> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<PAST>, clearmods=Control) ] };

    key <LatH> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<HELP>, clearmods=Control) ] };
    key <LatS> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<FIND>, clearmods=Control) ] };
    key <LatG> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<STOP>, clearmods=Control) ] };

};

partial
xkb_symbols "brackets" {

    key <AD11> {
        type = "FOUR_LEVEL+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<ESC>, clearmods=Control) ] };

};

partial
xkb_symbols "brackets_alphabetic" {

    key <AD11> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<ESC>, clearmods=Control) ] };

};

partial
xkb_symbols "slash" {

    key <AB10> {
        type = "FOUR_LEVEL+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<UNDO>, clearmods=Control) ] };

};

partial alphanumeric_keys
xkb_symbols "readline" {

    key <LatH> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<BKSP>, clearmods=Control) ] };

    key <LatW> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<BKSP>) ] };

    key <LatU> {
        type = "FOUR_LEVEL_ALPHABETIC+ACTION",
        actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
                    RedirectKey(key=<BKSP>, mods=Shift) ] };

};

partial default alphanumeric_keys
xkb_symbols "qwerty" {
    include "emacs(alphabetic)"
    include "emacs(brackets)"
    include "emacs(slash)"
};

partial alphanumeric_keys
xkb_symbols "jcuken" {
    include "emacs(alphabetic)"
    include "emacs(brackets_alphabetic)"
    include "emacs(slash)"
};
Zmicier ★★★★★ ()
Ответ на: ~/.xkb.d/types/action от Zmicier

Re: ~/.xkb.d/types/action

Zmicier, не могли бы вы, пожалуйста, рассказать в чем суть добавления «Lock» в ALPHABETIC и SEMIALPHABETIC?

также я заметил, если использовать action в декларации key

actions = [ NoAction(), NoAction(), NoAction(), NoAction(),
RedirectKey(key=<STOP>, clearmods=Control) ] >};

то работает только в английской раскладке

qazyll ()
Ответ на: Re: ~/.xkb.d/types/action от qazyll

нашел как определить для других раскладок

key<SOME_KEY> = {
  actions[Group1] = [ NoAction(), NoAction(), NoAction(), 
                      NoAction(), RedirectKey(key=<STOP>, clearmods=Control) ], 
  actions[Group2] = [ NoAction(), NoAction(), NoAction(), 
                      NoAction(), RedirectKey(key=<STOP>, clearmods=Control) ], 
...

но это как то не расширяемо, есть ли вариант сразу для всех раскладок?

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

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

Пример:

setxkbmap -option "us+ru:2+vim+vim:2"

qazyll ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.