Привязка Super к Ctrl

Привязка Super к Ctrl

Я уже некоторое время интересуюсь возможностью привязать клавишу Windows (Super_L) на клавиатуре к функциям «Копировать» и «Вставить» исключительно из соображений удобства и согласованности работы на настольном компьютере и MacBook.

Я подумал, что уже близок к цели, прочитав о xmodmap и выполнив следующее:

$ # re-map Super_L to Mode_switch, the 3rd col in keymap table `xmodmap -pke`
$ xmodmap -e "keycode  133 = Mode_switch"

$ # map Mode_switch+c to copy
$ xmodmap -e "keycode  54 = c C XF86_Copy C"

$ # map Mode_switch+v to paste
$ xmodmap -e "keycode  55 = v V XF86_Paste V"

К сожалению, XF86Copy и XF86Paste, похоже, вообще не работают. Они перечислены /usr/include/X11/XF86keysym.hи xevпоказывают, что последовательность клавиш интерпретируется X как XF86Paste и XF86Copy, эти символы действительно работают? Должны ли они иметь поддержку на уровне приложения?

решение1

Привязка Super к Ctrl

А как насчет того, чтобы привязать левую Windows/Logo/Superклавишу к другой Ctrlклавише?

Этого можно добиться с помощью следующих команд xmodmap:

remove mod4 = Super_L
keysym Super_L = Control_L
add Control = Control_L

Предполагая, что вы сохранили приведенные выше строки, super_as_ctrl.xmodmapвы можете проверить эффект, выполнив

xmodmap super_as_ctrl.xmodmap

Чтобы сделать изменение постоянным (сохраняющимся после повторного входа в систему/перезагрузки), переименуйте файл .Xmodmapв вашей домашней папке.

(Вышеизложенное было протестировано на системе Ubuntu 11.10 Live, но то же самое должно быть и для других дистрибутивов Linux)


Настройка сочетаний клавиш «Копировать/Вставить» для вашей терминальной программы

Привязавшись Superк Ctrlвы теперь можете использовать Super-Cдля копирования практически везде. Единственное общее исключение — ваша терминальная программа. Однако вы можете переопределить ярлыки там.

Я обнаружил, что даже gnome-terminalесть эта опция сейчас (у меня ее не было, пока я Ctrl-Shift-Cне привык). Если вы используете ее, перейдите Edit / Keyboard Shortcuts...в меню и назначьте Ctrl-Cкопировать и Ctrl-Vвставлять. Должно быть похоже для konsoleи т. д.

И не волнуйтесь, вы не потеряете возможность завершать программу с помощью сочетания клавиш. После перепривязки сочетания клавиш копирования для терминала вы можете просто использовать его Ctrl-Shift-Cтак, как вы использовали Ctrl-Cраньше. Терминал здесь не различает, нажата клавиша Shift или нет. И сочетание клавиш больше не перехватывается для копирования. В качестве альтернативы перепривяжите terminate к другому сочетанию клавиш, как предлагает MountainX в своем ответе.


XF86Copy и т. д. не работают

Что касается символов клавиш для копирования и вставки: судя по всему, они не оказывают никакого эффекта. Я быстро проверил, назначив действие копирования на Shift-ScrollLock (оно не использовалось, и я хотел проверить с помощью клавиши без модификатора):

xmodmap -e 'keycode 78 = Scroll_Lock XF86Copy Scroll_Lock'

Нажатие не имело никакого эффекта, также и с XF86AudioMute. Однако это сработало при назначении буквы 'a'. Так что я предполагаю, что есть конкретная проблема с этими специальными символами клавиш XF86.

решение2

Если вы хотите связать всего несколько последовательностей вида Super+x, Super+c, Super+v с другими последовательностями, такими как Ctrl+x, Ctrl+c, Ctrl+v, например, так, чтобы (как того хотел OP) эти конкретные последовательности клавиш Super-key в целом отображались для копирования и вставки, не влияя на другие варианты использования клавиши Super в вашей системе, это возможно с помощью простого расширения XKB. В приведенной ниже процедуре описываются шаги и приводятся два разных примера деталей для двух разных начальных настроек клавиатуры; надеемся, что это даст достаточно информации для адаптации к вашей системе. Предполагается, что вы умеете создавать и редактировать файлы в своей системе, включая файлы в таких системных расположениях, как /usr/share/X11/xkb.

  1. Решите, где вы хотите разместить дерево конфигурации XKB. Сначала найдите системное. Обычно оно находится в /usr/share/X11/xkb, и я не совсем уверен, как его найти, если его там нет; вы можете просто поискать в своей системе каталоги с именем "xkb". В любом случае, как только вы его найдете, вы можете либо изменить системное на месте, либо использовать любой каталог по вашему выбору. Преимущество использования системного каталога в том, что вы можете гораздо легче вызывать свои изменения, но недостаток в том, что будущие обновления системы могут перезаписать ваши изменения (вас предупредили). В любом случае, все имена файлов, упомянутые далее, относятся к этому каталогу, который я буду называть при необходимости $XKBLOCAL$, и все команды предполагают, что это ваш текущий каталог.

  2. Определите, какой XKB "тип" ключа у текущих ключей x,c,v. Самый простой способ сделать это — с помощью команды xkbcomp -a $DISPLAY - | grep -C 6 c,(обратите внимание, что запятая намеренно включена в шаблон). В моем первом примере настройки это дает:

    key <AB02> {
        type= "ALPHABETIC",
        symbols[Group1]= [               x,               X ]
    };
    key <AB03> {
        type= "ALPHABETIC",
        symbols[Group1]= [               c,               C ]
    };
    key <AB04> {
        type= "ALPHABETIC",
        symbols[Group1]= [               v,               V ]
    };
    key <AB05> {
    

    тогда как в моем другом примере настройки это дает

    key <AB02> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               x,               X, approxeq,     dead_ogonek ]
    };
    key <AB03> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               c,               C, ccedilla,        Ccedilla ]
    };
    key <AB04> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               v,               V, squareroot,           U25CA ]
    };
    key <AB05> {
    

    В результате в первом примере соответствующие клавиши имеют тип "ALPHABETIC", а во втором — тип "FOUR_LEVEL". В зависимости от настроек клавиатуры вы можете обнаружить, что они имеют совершенно другой тип. В дальнейшем тип будет называться $TYPE$, который вы должны заменить фактической строкой ALPHABETIC или любой другой в командах ниже.

  3. Найдите определение $TYPE$ и скопируйте его в новый файл в каталоге $XKBLOCAL$/types. Вот команда, которая делает именно это: xkbcomp -a $DISPLAY - | grep -z -o 'type "$TYPE$" {[^}]*};' > types/cutpaste. Имя файла "cutpaste", которое я выбрал, произвольно, используйте любое имя, которое вам нравится, но учтите, что вам придется ссылаться на этот файл последовательно в последующих шагах. В первой настройке этот файл получает содержимое

    type "ALPHABETIC" {
        modifiers= Shift+Lock;
        map[Shift]= Level2;
        map[Lock]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "Caps";
    };
    

    а в другом примере он получает содержимое

    type "FOUR_LEVEL" {
        modifiers= Shift+LevelThree;
        map[Shift]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
    };
    
  4. Отредактируйте файл types/cutpaste, чтобы сделать две вещи: добавьте преамбулу и постамбулу, которые сделают его надлежащим предложением XKB, и измените имя типа и определение типа, чтобы добавить еще один уровень, созданный модификатором, соответствующим Super. Вам следует проверить, какой модификатор установлен в вашей системе, скорее всего, это Mod4, как используется ниже. Необходимые изменения должны быть очевидны из двух примеров финальных версий types/cutpaste, а именно:

    default partial xkb_types "addsuper" {
        type "ALPHABETIC_SUPER" {
            modifiers= Shift+Lock+Mod4;
            map[Shift]= Level2;
            map[Lock]= Level2;
            map[Mod4]= Level3;
            map[Shift+Mod4]= Level3;
            map[Lock+Mod4]= Level3;
            level_name[Level1]= "Base";
            level_name[Level2]= "Caps";
            level_name[Level3]= "With Super";
        };
    };
    

    и

    default partial xkb_types "addsuper" {
        type "FOUR_LEVEL_SUPER" {
            modifiers= Shift+LevelThree+Mod4;
            map[Shift]= Level2;
            map[LevelThree]= Level3;
            map[Shift+LevelThree]= Level4;
            map[Mod4]= Level5;
            map[Shift+Mod4] = Level5;
            map[LevelThree+Mod4] = Level5;
            map[Shift+LevelThree+Mod4] = Level5;
            level_name[Level1]= "Base";
            level_name[Level2]= "Shift";
            level_name[Level3]= "Alt Base";
            level_name[Level4]= "Shift Alt";
            level_name[Level5]= "With Super"';
       };
    };
    
  5. Скопируйте определения символов ключей, которые были выведены grep на втором шаге, во второй новый файл symbols/cutpaste, добавьте аналогичную преамбулу и постамбулу, измените определения, чтобы использовать новые типы, и добавьте действия к определению для обработки нужного ключа, созданного версиями Super. Результаты этого в наших двух примерах следующие:

    default partial xkb_symbols "superversions" {
        replace key <AB02> {
            type[Group1]= "ALPHABETIC_SUPER",
            symbols[Group1]= [               x,               X, NoSymbol ],
            actions[Group1]= [      NoAction(),      NoAction(), RedirectKey(key=<LatX>,mods=Control,clearmods=Super)]
        };
        replace key <AB03> {
            type[Group1]= "ALPHABETIC_SUPER",
            symbols[Group1]= [               c,               C, NoSymbol ],
            actions[Group1]= [      NoAction(),      NoAction(), RedirectKey(key=<LatC>,mods=Control,clearmods=Super)]
        };
        replace key <AB04> {
            type[Group1]= "ALPHABETIC_SUPER",
            symbols[Group1]= [               v,               V, NoSymbol ],
            actions[Group1]= [      NoAction(),      NoAction(), RedirectKey(key=<LatV>,mods=Control,clearmods=Super)]
        };
    };
    

    и

    default partial xkb_symbols "superversions" {
        replace key <AB02> { 
            type[Group1]= "FOUR_LEVEL_SUPER",
            symbols[Group1]= [x,X,approxeq,dead_ogonek,NoSymbol],
            actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatX>,mods=Control,clearmods=Super)]
        };
        replace key <AB03> { 
            type[Group1]= "FOUR_LEVEL_SUPER",
            symbols[Group1]= [c,C,ccedilla,Ccedilla,NoSymbol],
            actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatC>,mods=Control,clearmods=Super)]
        };
        replace key <AB04> { 
            type[Group1]= "FOUR_LEVEL_SUPER",
            symbols[Group1]= [v,V,squareroot,U25CA,NoSymbol],
            actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatV>,mods=Control,clearmods=Super)]
        };
    };
    

    Обратите внимание, что во втором примере я также убрал некоторые (несущественные) пробелы, чтобы немного контролировать длину строки.

  6. Найдите имя набора правил, который XKB использует в данный момент. Это просто, оно показано в результате setxkbmap -query. В моем случае это было "evdev".

  7. Скопируйте системную версию rules/evdev (или как там называется ваш набор правил) в $XKBLOCAL$/rules/evdev и добавьте правила, указывающие на созданные нами параметры. Здесь у вас есть два варианта: вы можете скопировать весь evdev или только те части, в которых упоминается модель клавиатуры, раскладка, вариант и параметры, которые вы фактически используете. Конечно, если вы изменяете системные файлы на месте, вам не нужно выполнять никакого копирования, только редактирование.

    В этом случае то, что добавляется, идентично независимо от начальной настройки клавиатуры, так что есть только один пример. Вы находите раздел файла правил, который начинается с ! option = symbolsи добавляете строку cutpaste:super = +cutpasteв этот раздел, и вы также находите раздел файла правил, который начинается с ! option = typesи строку cutpaste:super = +cutpasteв этот раздел.

  8. Скопируйте системную версию evdev.lst и добавьте строку для вашего нового параметра. Обратите внимание, что имя этого файла просто соответствует имени файла правил с добавленным расширением .lst. Как и в предыдущем шаге, вы можете скопировать весь файл или только часть, на которую ссылаются модель, макет, вариант и параметр(ы), которые вы используете. Вам просто нужно найти раздел этого файла, который начинается с ! optionи добавить строку, например: cutpaste:super Add super equivalents of cut and paste operationsв этот раздел.

  9. Хорошо, теперь все файлы конфигурации на месте. Если вы изменили системные файлы, вы можете теперь вызвать новую опцию с помощью setxkbmap -option cutpaste:super. С другой стороны, если вы этого не сделали, вы должны сообщить setxkbmap, где находится ваш каталог $XKBLOCAL$. Что еще хуже, сервер также не знает, где находится этот каталог, и setxkbmap не сообщает ему (или, возможно, не может, поскольку в конечном итоге сервер может быть запущен на другой машине). Поэтому вам нужно передать вывод setxkbmap в xkbcomp, а также сообщить этой команде, где находится ваш каталог $XKBLOCAL. Таким образом, полная командная строка выглядит так setxkbmap -I$XKBLOCAL$ -option cutpaste:super -print | xkbcomp -I$XKBLOCAL - $DISPLAY.

Надеюсь, это будет кому-то полезно/интересно, так как хорошая окончательная документация/справочник по XKB встречается редко. Одна очень полезная ссылка былаhttp://madduck.net/docs/extending-xkb/.

решение3

Вот что я делаю. Это не окончательное решение, но я пытался достичь окончательного решения и не смог его достичь после многих усилий. Поэтому я остановился на чем-то простом и работающем для более чем 90% того, что мне нужно. Я могу реализовать это на любом компьютере, к которому я подойду (или на любой новой установке Linux) за считанные минуты. Это чертовски просто.

В приложении X-терминала задайте настройки сочетания клавиш. Я делал это и в Gnome, и в KDE. Например, в Konsole перейдите в Меню > Настройки > Настроить сочетания клавиш. Похожее меню есть в Gnome X-терминале. Просто выберите сочетание клавиш (например, «копировать») и введите нужную последовательность клавиш.

В случае, если сочетания клавиш копирования и вставки терминала конфликтуют с командами терминала, есть простое решение для этого. Например, что если кто-то хочет использовать CTRL-C для копирования (чтобы X-терминал соответствовал стандарту CUA)?

В этом случае вы можете легко изменить привязки клавиш stty (в .bashrc). Продолжая пример с CTRL-C для копирования, скажем, вы хотите, чтобы клавиша прерывания теперь была CTRL-b (для "break"). Это позволяет:

echo "stty intr \^b" >> ~/.bashrc 

Затем исходный .bashrc.

Все решение так же просто, как использование настроек X-терминала для изменения сочетаний клавиш, а затем, по желанию, разрешение конфликтов с stty с помощью однострочной команды echo. Очень просто и охватывает почти все, что мне нужно.

решение4

Вероятно, клавиша Windows является клавишей-модификатором. Запустите это и попробуйте еще раз:

xmodmap -e 'remove Mod4 = Super_L'

Связанный контент