LINUX.ORG.RU

Привести CUA-приложения к macOS-подобному управлению

 , , ,


0

2

macOS хороша тем, что на ней CUA гармонично сосуществует с Emacs-управлением — хоткеи, которые в онтопиковых и оффтопиковых приложениях повешаны на Ctrl, там выделены на отдельный клавиш Cmd, а Ctrl свободен для Emacs-управления — таким образом, они гармонично сосуществуют. Под онтопиком GTK+ и Tk умеют в Emacs-управление, но по причине конфликта с CUA-шными Ctrl-хоткеями юзабельность сего не очень высока. Приложения же на Qt, Win32 и всякой велосипедщине вообще в Emacs-управление не умеют.

Для решения этой проблемы я когда-то пытался свитчнуть Ctrl и Mod4 и наварганить костыли на xbindkeys + xdotool, навроде

"xdotool key --clearmodifiers Ctrl+Backspace"
        Release+mod4 + w
"xdotool key --clearmodifiers Ctrl+x"
        Release+mod4 + x
"xdotool key --clearmodifiers Ctrl+y"
        Release+mod4 + y
"xdotool key --clearmodifiers Ctrl+z"
        Release+mod4 + z
Но работало сие предсказуемо с задержкой и глючно, посему быстро было выкинуто. Похоже, нужно делать что-то более низкоуровневое, типа loloswitcher. Ткните мордочкой, куда копать, или в готовые решения, если они есть.

А при чём тут emacs?

Насколько я понимаю, задача сводится к перебиндиванию всех Ctrl-хоткеев на Super в настройках своего любимого DE.

aidaho ★★★★★
()

macOS хороша тем, что на ней CUA гармонично сосуществует с Emacs-управлением

???

CUA гармонично сосуществует с емаксовым управлением даже в самом ГНУ Емаксе. Причем из коробки.

Zmicier ★★★★★
()

GTK+ ... умеют в Emacs-управление, но по причине конфликта с CUA-шными Ctrl-хоткеями юзабельность сего не очень высока

Пример? Или вы словом «CUA» вместо CUA называете что-то свое?

Zmicier ★★★★★
()

Приложения же на Qt, Win32 и всякой велосипедщине вообще в Emacs-управление не умеют.

Это проблема, да.

Похоже, нужно делать что-то более низкоуровневое

Не обязательно. Достаточно просто не порождать на каждое нажатие по два процесса.

Для начала — какой у вас оконный диспетчер? Хорошие это умеют.

Zmicier ★★★★★
()

Похоже, нужно делать что-то более низкоуровневое

Что до более низкоуровнего, то в xkb, во-первых, есть такая штука, как overlay’и. Но одною ей вы не добьетесь назначения на аккорды, только на отдельные клавиши. Клавиши «отменить», «вырезать», «копировать» и «вставить» вполне существуют, но вот клавиш «<что-нибудь> слово» нет. Так что здесь не катит.

Ну и во-вторых там же есть RedirectKey(). Вот с ним уже можно изгаляться: и ставить на любой аккорд, и посылать любой аккорд.

Zmicier ★★★★★
()

Если ты хочешь поменять только сочетания из CUA, то это проще сделать через тему GTK, как сделана поддержка сочетаний Emacs.

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

Убогое Qt не поддерживает темы ввода. Костыли вроде Autohotkey в принципе нормально работать не могут. Здесь не проблемы, которую можно разумно решить.

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

До Emacs OS я ещё не дорос. И не собираюсь, пока не обзаведусь педалями или клавиатурой с модификаторами под пробелом. В лайт-виде, по одному хоткею, оно ещё куда ни шло, но последовательности из нескольких — это треш.

bodqhrohro_promo
() автор топика
Ответ на: комментарий от Zmicier

Пример: в приложении для поиска используется CUA-шный Ctrl+F. И при этом с Emacs keybindings Ctrl+F работает как стрелка вправо. На macOS это отдельные комбинации — Cmd+F и Ctrl+F. На онтопике получается конфликт, работает или одно, или другое. В GTK+ можно быстро менять хоткеи — но это так себе решение, ибо конфигурациезависимая кастомщина, хоткеи могут быть и так все забиты и работает оно, опять-таки, только в GTK+.

bodqhrohro_promo
() автор топика
Ответ на: комментарий от Zmicier

Компиз. Но привязывать это к WM я не хочу, ибо это не входит в его задачи и сменить я его могу в любой момент, уже сидел временно на Marco из-за глюков с видеодрайверами.

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

Пример: в приложении для поиска используется CUA-шный Ctrl+F.

В CUA есть C-f, да?

Zmicier ★★★★★
()
Ответ на: комментарий от bodqhrohro_promo

Компиз

Это я пас.

Но привязывать это к WM я не хочу, ибо это не входит в его задачи

Это входит в его задачи самым непосредственным образом.

Zmicier ★★★★★
()
Ответ на: комментарий от bodqhrohro_promo

Таки похоже, что xkb хватит.

Для контекстно-независимого перевода одного аккорда в другой? Да, вполне.

Сейчас я вам накидаю всякого добра из ~/.xkb/.

Zmicier ★★★★★
()
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от bodqhrohro_promo

но последовательности из нескольких — это треш

А кстати, почему? В смысле, какова альтернатива? В один аккорд всего, очевидно, не уместишь.

И да, как успехи-то? С XKB разобрались?

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