Связывание Super + C Super + V для копирования и вставки


23

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

Ответы:


18

Привязка супер к 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.


3
К сожалению, даже если я связываю Super с Ctrl, мне все равно придется использовать Ctrl / Super + Shift + C для копирования и вставки внутри терминала, что является основным стимулом. Спасибо, подтверждая, что ключи XF86 не работают.
соло

Какую терминальную программу вы используете? Я добавил решение, которое работает как минимум с gnome-терминал. И это должно быть похоже на других.
zpea

4
Контроль привязки к мета не совпадает с изменением ярлыка для копирования / вставки к мета + с / v. Я хочу сделать MacOs похожими на ярлыки kboard для Linux, так что этот ответ не великолепен ...
Sonique

1
Shift + ctrl + c или что-то слишком неуклюжее, и просто повторное связывание Super с Ctrl отправит сигнал уничтожения с помощью Super + c, так что это не решит так много
rien333

первый шаг - примерно то, что я сделал, чтобы превратить супер / команду в контроль. Это исправляет большинство вещей, но я все же хотел бы, чтобы cmd-c и ctrl-c имели разные функции, даже если cmd означает ctrl в другом месте. Не уверен, смогу ли я сделать это с помощью xmodmap и специфичных для терминала ярлыков.
tedder42

10

Если вы хотите связать всего несколько последовательностей вида 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/ .


Отличный ответ. Это сработало для меня в 17.10
blockloop

Это не сработало для меня в Ubuntu 18.04. В результате просто клавиши «c», «x» и «v» больше не работают. Я смог заставить их работать снова setxkbmap -option. Мои локальные настройки были почти идентичны примеру FOUR_LEVEL, за исключением некоторых символов Group2, Group3, которые я пропустил из файла частичных символов, поэтому мой файл выглядел так же, как примеры.
JinnKo

2

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

Спасибо, но не работает. Я знаю, что отображение работает, потому что xev сообщает о событиях XF86.
соло

Мой первый пост (выполнение xmodmap -e 'remove Mod1 = Meta_L'и проверка ваших команд после) работал нормально для меня.
сср

1
@solo, а по поводу работы или нет, учтите, что не каждая среда рабочего стола или приложения их поддерживают. Чтобы узнать, действительно ли это работает или нет, используйте их, например, в Firefox. Он поддерживает (слушает) привязки клавиш X.
сср

0

Я взял кое-что из того, что сказал Глен Уитни, и сумел использовать эти знания, чтобы отобразить поведение «хуже слова» или «манипулирование текстом» из macOS в пользовательскую таблицу ключей.

Я уже решил проблему с копированием и вставкой Ctrl и Super без использования этого конкретного решения, но, как я уже сказал, это было очень полезно для других целей. Я также избегал таких вещей, как xmodmap, поскольку в какой-то момент я намерен полностью поддерживать Wayland. Kinto использует нативный xkb и учитывает ожидаемое macOS, такое как поведение терминала.

https://github.com/rbreaves/kinto

https://medium.com/@benreaves/kinto-a-mac-inspired-keyboard-mapping-for-linux-58f731817c0

Вот также Gist, если вы просто хотите увидеть, что лежит в основе всего этого, он не будет чередовать вашу таблицу клавиш при необходимости. Gist также не содержит пользовательских файлов ключей xkb, которые устанавливают курсоры в стиле MacOS / манипуляции со словами, использующие Cmd и клавиши со стрелками.

https://gist.github.com/rbreaves/f4cf8a991eaeea893999964f5e83eebb

содержание содержания

# permanent apple keyboard keyswap
echo "options hid_apple swap_opt_cmd=1" | sudo tee -a /etc/modprobe.d/hid_apple.conf
update-initramfs -u -k all

# Temporary & instant apple keyboard keyswap
echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd

# Windows and Mac keyboards - GUI (Physical Alt is Ctrl, Physical Super is Alt, Physical Ctrl is Super)
setxkbmap -option;setxkbmap -option altwin:ctrl_alt_win

# Windows and Mac keyboards - Terminal Apps (Physical Alt is Super, Physical Super is Alt, Physical Ctrl is Ctrl)
setxkbmap -option;setxkbmap -option altwin:swap_alt_win

# If the hid_apple driver is not loaded for Apple keyboards, which can be found out
# by the lsmod command then the above setxkbmap commands will not work
# Use the following commands for Apple style keyboards without an hid_apple driver
#
# Note: this could also apply to hid_apple driver as well 
# if this option is set to 0 inside swap_opt_cmd
#
lsmod | grep hid_apple

# Apple keyboard without hid_apple - GUI
setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl,ctrl:swap_rwin_rctl

# Apple keyboard without hid_apple - Terminal
setxkbmap -option;setxkbmap -option altwin:alt_super_win

#
# If you want a systemd service and bash script to help toggle between
# GUI and Terminal applications then look at project Kinto.
# https://github.com/rbreaves/kinto
#
# Note: The above may not work for Chromebooks running Linux, please look
# at project Kinto for that.
#
# If anyone would like to contribute to the project then please do!
#
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.