Прив’язування 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раніше. Термінал тут не розрізняє, натиснути чи ні. І ярлик більше не вловлюється за копію. Як альтернатива, відновіть термінал до іншого ярлика, як пропонує 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
Керування прив'язкою до Meta не те саме, що змінити ярлик для копіювання / вставки на Meta + c / v. Я хочу зробити макоси схожими на ярлики kboard в Linux, тому ця відповідь не чудова ...
Sonique

1
Shift + ctrl + c або що завгодно занадто незграбне, і просто перезавантаження Super на Ctrl посилатиме сигнал вбиття Super + c, що насправді не так багато вирішує
rien333

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

9

Якщо ви хочете зв’язати лише декілька послідовностей форми Super + x, Super + c, Super + v з іншими послідовностями, такими як Ctrl + x, Ctrl + c, Ctrl + v, наприклад, таким чином, щоб (як бажає ОП) ці конкретні послідовності Супер-ключів, як правило, відображаються для вирізання та вставки, не впливаючи на будь-яке інше використання клавіші 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> {
    

    Підсумок полягає в тому, що в першому прикладі відповідні клавіші мають тип "ALFHABETIC", тоді як у другому прикладі вони мають тип "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, щоб зробити дві речі: додати преамбулу та postamble, що робить її належним пунктом 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 на другому кроці, у другий новий символ символів / cutpaste та додайте аналогічну преамбулу та postamble, а також модифікуйте визначення, щоб використовувати нові типи та додайте дії до визначення для обробки потрібного ключа виробляється версіями 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. У моєму випадку це був "евдев".

  7. Скопіюйте системну версію правил / evdev (або як би не було назва ваших правил) у $ XKBLOCAL $ / правила / 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
блокування

Це не спрацювало для мене на 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 (для "перерви"). Це означає, що:

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

Тоді джерело .bashrc.

Все рішення настільки ж просто, як використання налаштувань терміналів X для зміни ярликів, а потім, за бажанням, вирішення конфліктів із stty за допомогою однорядкової команди ехо. Мертвий простий і охоплює майже все, що мені потрібно.


0

Можливо, ключ Windows - це модифікатор. запустіть це та повторіть спробу:

xmodmap -e 'remove Mod4 = Super_L'

Дякую, але не роби трюку. Я знаю, що відображення працює, тому що xev повідомляє про події XF86.
соло

Мій перший пост (виконання xmodmap -e 'remove Mod1 = Meta_L'та спробування ваших команд після) працював для мене чудово.
ussr

1
@solo, а щодо роботи чи ні, враховуйте, що не кожне середовище робочого столу чи програми підтримують їх. Щоб дізнатись, чи це дійсно працює чи ні, використовуйте їх, наприклад, у Firefox. Він підтримує (слухає) прив’язки клавіш X.
ussr

0

Я взяв частину того, що сказав Глен Уїтні, і встиг використати ці знання для відображення гіршого або текстового маніпулювання поведінки з macOS у користувацьку клавішу.

Я вже вирішив проблему копіювання та вставки Ctrl vs 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 не включає власні файли з клавішними файлами 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.