22

В течение некоторого времени меня интересовало связывание клавиши 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, действительно ли эти символы работают? Должны ли они иметь поддержку на уровне приложений?

4 ответа4

15

Привязка супер к 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, но он должен быть таким же для других дистрибутивов Linux)


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

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

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

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


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

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

xmodmap -e 'keycode 78 = Scroll_Lock XF86Copy Scroll_Lock'

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

6

Если вы хотите связать всего несколько последовательностей вида Super+x, Super+c, Super+v с другими последовательностями, такими как, например, Ctrl+x, Ctrl+c, Ctrl+v, чтобы (по желанию OP) эти Определенные последовательности супер-ключей обычно сопоставляются для вырезания и вставки, не влияя на любое другое использование супер-ключа в вашей системе, это возможно, используя только расширение 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. Отредактируйте типы файлов /cutpaste так, чтобы они делали две вещи: добавляли преамбулу и пост-марку, делающие ее подходящим предложением XKB, и изменяли имя типа и определение типа, чтобы добавить еще один уровень, создаваемый модификатором, соответствующим Super. Вы должны проверить, что это за модификатор в вашей системе, скорее всего это Mod4, как использовано ниже. Необходимые модификации должны быть очевидны из двух примеров окончательных версий типов / пасты, а именно:

    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 на втором шаге, во второй новый файл символов / вырезки, добавьте аналогичную преамбулу и разметку и измените определения, чтобы использовать новые типы, и добавьте действия в определение для обработки требуемого ключа. производится супер версиями. Результаты этого в наших двух примерах:

    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/.

1

Вот что я делаю. Это не окончательное решение, но я попытался найти окончательное решение и не смог достичь его после долгих усилий. Поэтому я согласился на что-то простое и работающее более чем на 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. Мёртвый простой и охватывает практически все, что мне нужно.

0

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

xmodmap -e 'remove Mod4 = Super_L'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .