py_tosha
@py_tosha
Антон-батон, убил бабушку об картон.

Как повесить несколько дополнительных символов на одну клавишу в конфиге xkb?

Я использую конфиг для xkb, который добавляет некоторые сочетания клавиш для [CapsLock] в стиле vim или emacs. Нерешенной проблемой остается прокрутка страниц в emacs-режиме, потому что нужно забиндить [PgDn] и [PgUp] на [v] и на [V] соответственно. Если повесить на третий уровень [PgDn], а на четверый — [PgUp], то работать это будет, но прокрутка вверх будет выделять все, начиная от курсора, так как [Shift] считается зажатым. Подошло бы сочетание с [Alt], но я не знаю, как его реализовать.
  • Вопрос задан
  • 317 просмотров
Решения вопроса 1
@Z-r
Если в ключевых словах, то RedirectKey(key=..., clearmods). А если в правой части (во что транслировать) всегда одна клавиша, а не аккорд, то вообще имеет смысл описать всю вашу схему как overlay — это намного чище.

[из комментариев]> а вы не могли бы привести пару примеров

Для overlay’я — да, пожалуйста, вот вам выдержка откуда-то из ~/.xkb.d/. И хотя я ей фактически не пользуюсь, поскольку:

— Во-первых, у меня нестабильно работала закомментированная часть (C-wC-backspace) — причем самым причудливым образом — при первой компиляции она выдавала какую-то ошибку, а после ряда танцев с бубном — таки собиралась и работала.

— А во-вторых, я обнаружил, что не имею во всем этом никакой необходимости, ибо у меня из сколько-нибудь активно используемых программ: ГНУ Емакс да Айсвизел (Файрфокс), иногда ряд программ в эмуляторе терминала. С первым — понятно; Айсвизел — на ГТК, где сочетания клавиш можно настроить гораздо гибче, чем тупой контекстно-независимой трансляцией (а базовые емаксовые сочетания для ГТК поставляются из коробки); большинство же интерактивных программ, запускаемых в эмуляторе терминала, используют (или могут использовать) ГНУ Ридлайн, где все еще лучше, чем в ГТК.

Но, как я помню, в остальном тут все должно работать.

partial modifier_keys
xkb_symbols "lctrl_overlay" {
    replace key <LCTL> {
            type = "PC_CONTROL_LEVEL2",
            symbols = [ Control_L, NoSymbol ],
            actions = [ SetMods(modifiers=Control),
                        SetControls(controls=overlay1) ]
    };
};

partial modifier_keys
xkb_symbols "rctrl_overlay" {
    replace key <RCTL> {
            type = "PC_CONTROL_LEVEL2",
            symbols = [ Control_R, NoSymbol ],
            actions = [ SetMods(modifiers=Control),
                        SetControls(controls=overlay1) ]
    };
};

default partial modifier_keys
xkb_symbols "ctrl_overlay" {
    include "nav(lctrl_overlay)"
    include "nav(rctrl_overlay)"
};

partial modifier_keys
xkb_symbols "lctrl_lock_overlay" {
    replace key <LCTL> {
            type = "PC_CONTROL_LEVEL2",
            symbols = [ Control_L, NoSymbol ],
            actions = [ SetMods(modifiers=Control),
                        LockControls(controls=overlay1) ]
    };
};

partial modifier_keys
xkb_symbols "rctrl_lock_overlay" {
    replace key <RCTL> {
            type = "PC_CONTROL_LEVEL2",
            symbols = [ Control_R, NoSymbol ],
            actions = [ SetMods(modifiers=Control),
                        LockControls(controls=overlay1) ]
    };
};

default partial modifier_keys
xkb_symbols "ctrl_lock_overlay" {
    include "nav(lctrl_lock_overlay)"
    include "nav(rctrl_lock_overlay)"
};

partial modifier_keys
xkb_symbols "hwdm" {
    // key <I250> { symbols = [ NoSymbol ] };
    // key <I250> {
    //     actions = [ RedirectKey(key=<BKSP>, mods=Control) ]
    // };
    key <LatH> { overlay1 = <BKSP> };
    key <LatW> { overlay1 = <I250> };
    key <LatD> { overlay1 = <DELE> };
    key <LatM> { overlay1 = <LNFD> };
};

partial modifier_keys
xkb_symbols "pbnf" {
    key <LatP> { overlay1 = <UP> };
    key <LatB> { overlay1 = <LEFT> };
    key <LatN> { overlay1 = <DOWN> };
    key <LatF> { overlay1 = <RGHT> };
};

partial modifier_keys
xkb_symbols "ijkl" {
    key <LatI> { overlay1 = <UP> };
    key <LatJ> { overlay1 = <LEFT> };
    key <LatK> { overlay1 = <DOWN> };
    key <LatL> { overlay1 = <RGHT> };
};

partial modifier_keys
xkb_symbols "khjl" {
    key <LatK> { overlay1 = <UP> };
    key <LatH> { overlay1 = <LEFT> };
    key <LatJ> { overlay1 = <DOWN> };
    key <LatL> { overlay1 = <RGHT> };
};

partial modifier_keys
xkb_symbols "zxcv" {
    key <LatZ> { overlay1 = <UNDO> };
    key <LatX> { overlay1 = <CUT> };
    key <LatC> { overlay1 = <COPY> };
    key <LatV> { overlay1 = <PAST> };
};
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы