Я уже некоторое время интересуюсь возможностью привязать клавишу 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
.
Решите, где вы хотите разместить дерево конфигурации XKB. Сначала найдите системное. Обычно оно находится в /usr/share/X11/xkb, и я не совсем уверен, как его найти, если его там нет; вы можете просто поискать в своей системе каталоги с именем "xkb". В любом случае, как только вы его найдете, вы можете либо изменить системное на месте, либо использовать любой каталог по вашему выбору. Преимущество использования системного каталога в том, что вы можете гораздо легче вызывать свои изменения, но недостаток в том, что будущие обновления системы могут перезаписать ваши изменения (вас предупредили). В любом случае, все имена файлов, упомянутые далее, относятся к этому каталогу, который я буду называть при необходимости $XKBLOCAL$, и все команды предполагают, что это ваш текущий каталог.
Определите, какой 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 или любой другой в командах ниже.
Найдите определение $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"; };
Отредактируйте файл 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"'; }; };
Скопируйте определения символов ключей, которые были выведены 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)] }; };
Обратите внимание, что во втором примере я также убрал некоторые (несущественные) пробелы, чтобы немного контролировать длину строки.
Найдите имя набора правил, который XKB использует в данный момент. Это просто, оно показано в результате
setxkbmap -query
. В моем случае это было "evdev".Скопируйте системную версию rules/evdev (или как там называется ваш набор правил) в $XKBLOCAL$/rules/evdev и добавьте правила, указывающие на созданные нами параметры. Здесь у вас есть два варианта: вы можете скопировать весь evdev или только те части, в которых упоминается модель клавиатуры, раскладка, вариант и параметры, которые вы фактически используете. Конечно, если вы изменяете системные файлы на месте, вам не нужно выполнять никакого копирования, только редактирование.
В этом случае то, что добавляется, идентично независимо от начальной настройки клавиатуры, так что есть только один пример. Вы находите раздел файла правил, который начинается с
! option = symbols
и добавляете строкуcutpaste:super = +cutpaste
в этот раздел, и вы также находите раздел файла правил, который начинается с! option = types
и строкуcutpaste:super = +cutpaste
в этот раздел.Скопируйте системную версию evdev.lst и добавьте строку для вашего нового параметра. Обратите внимание, что имя этого файла просто соответствует имени файла правил с добавленным расширением .lst. Как и в предыдущем шаге, вы можете скопировать весь файл или только часть, на которую ссылаются модель, макет, вариант и параметр(ы), которые вы используете. Вам просто нужно найти раздел этого файла, который начинается с
! option
и добавить строку, например:cutpaste:super Add super equivalents of cut and paste operations
в этот раздел.Хорошо, теперь все файлы конфигурации на месте. Если вы изменили системные файлы, вы можете теперь вызвать новую опцию с помощью
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'