Wiązanie Super + C Super + V do kopiowania i wklejania

23

Od pewnego czasu interesuje mnie przypisanie klawisza Windows (Super_L) na klawiaturze do kopiowania i wklejania bez żadnego innego powodu, poza wygodą i spójnością między moim komputerem stacjonarnym a moim MacBookiem.

Myślałem, że byłem blisko po przeczytaniu o xmodmap i wykonaniu następujących czynności:

$ # 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"

Niestety, XF86Copy i XF86Paste w ogóle nie działają. Są one wymienione w /usr/include/X11/XF86keysym.hi xevpokazuje, że sekwencja klawiszy jest interpretowana przez X jako XF86Paste i XF86Copy, czy te symbole faktycznie działają? Czy muszą mieć wsparcie na poziomie aplikacji?

solo
źródło

Odpowiedzi:

18

Wiązanie Super do Ctrl

Co powiesz na związanie lewego Windows/Logo/Superklawisza, aby działał jak inny Ctrlklucz?

Możesz to osiągnąć za pomocą następujących poleceń xmodmap:

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

Zakładając, że zapisałeś powyższe linie, ponieważ super_as_ctrl.xmodmapmożesz przetestować efekt poprzez wykonanie

xmodmap super_as_ctrl.xmodmap

Aby zmienić na stałe (przetrwanie przy ponownym logowaniu / ponownym uruchomieniu) zmień nazwę pliku na .Xmodmapw folderze domowym.

(Powyższe zostało przetestowane na systemie Live Ubuntu 11.10, ale powinno być takie samo dla innych dystrybucji Linuksa)


Dostosowywanie skrótów Kopiuj / Wklej dla programu terminalowego

Po związaniu się Superz Ctrltobą możesz teraz używać Super-Cdo kopiowania prawie wszędzie. Jedynym częstym wyjątkiem jest twój program terminalowy. Możesz jednak przedefiniować tam skróty.

Dowiedziałem się, że gnome-terminaldo tej pory ma nawet tę opcję (i tak nie miałem, dopóki się nie przyzwyczaiłem Ctrl-Shift-C). Jeśli go używasz, przejdź do Edit / Keyboard Shortcuts...menu i przypisz, Ctrl-Caby skopiować i Ctrl-Vwkleić. Powinny być podobne dla konsoleitp.

I nie martw się, nie stracisz możliwości zakończenia programu za pomocą skrótu. Po ponownym powiązaniu skrótu kopiowania do terminala możesz używać go Ctrl-Shift-Ctak, jak Ctrl-Cwcześniej. Terminal nie rozróżnia tutaj, czy Shift jest wciśnięty, czy nie. Skrót nie jest już przechwytywany dla kopii. Alternatywnie ponownie powiązaj terminate z innym skrótem, jak sugeruje MountainX w swojej odpowiedzi.


XF86Copy itp. Nie działają

Odnośnie kluczowych symboli kopiowania i wklejania: Najwyraźniej nie mają one wpływu. Przetestowałem to szybko, przypisując działanie kopiowania do Shift-ScrollLock (było nieużywane i chciałem przetestować za pomocą klucza niemodyfikującego):

xmodmap -e 'keycode 78 = Scroll_Lock XF86Copy Scroll_Lock'

Naciśnięcie go nie przyniosło żadnego efektu, ani w XF86AudioMute. Jednak zadziałało przy przypisywaniu litery „a”. Sądzę więc, że istnieje szczególny problem z tymi kluczowymi symbolami specjalnymi XF86.

zpea
źródło
3
Niestety, nawet jeśli powiążę Super z Ctrl, nadal będę musiał użyć Ctrl / Super + Shift + C, aby skopiować i wkleić w terminalu, co jest główną zachętą. Dziękujemy za potwierdzenie, że klucze XF86 nie działają.
solo
Z jakiego programu terminalowego korzystasz? Dodałem rozwiązanie, które działa przynajmniej z terminalem gnome. I powinno być podobnie dla innych.
zpea
4
Kontrola wiązania do Meta nie jest tym samym, co skrót do kopiowania / wklejania do Meta + c / v. Chcę, aby MacO były podobne do skrótów kboard na Linuksie, więc ta odpowiedź nie jest doskonała ...
Sonique
1
Shift + Ctrl + C lub cokolwiek jest zbyt nieporadne, a ponowne przypisanie Super do Ctrl wyśle ​​sygnał zabicia za pomocą Super + C, więc to tak naprawdę nie rozwiązuje zbyt wiele
rien333
pierwszy krok jest mniej więcej tym, co zrobiłem, aby zmienić super / polecenie w kontrolę. To naprawia większość rzeczy - ale nadal chciałbym, aby cmd-c i ctrl-c miały różne funkcje, nawet jeśli cmd oznacza ctrl w innym miejscu. Nie jestem pewien, czy mogę to zrobić za pomocą xmodmap i skrótów specyficznych dla terminala.
tedder42
9

Jeśli chcesz powiązać tylko kilka sekwencji w postaci Super + x, Super + c, Super + v z innymi sekwencjami, takimi jak Ctrl + x, Ctrl + c, Ctrl + v, na przykład, aby (zgodnie z życzeniem OP) te poszczególne sekwencje superkluczy będą na ogół mapowane do wycinania i wklejania bez wpływu na jakiekolwiek inne użycie klawisza Super w twoim systemie, możliwe jest użycie tylko rozszerzenia XKB. Poniższa procedura przedstawia kroki i podaje dwa różne przykłady szczegółów dla dwóch różnych początkowych konfiguracji klawiatury; mam nadzieję, że dostarczy wystarczających informacji, aby dostosować się do twojego systemu. Zakłada, że ​​nie masz problemów z tworzeniem i edycją plików w systemie, w tym plików w lokalizacjach systemowych, takich jak/usr/share/X11/xkb .

  1. Zdecyduj, gdzie ma się znajdować drzewo konfiguracji XKB. Najpierw znajdź system pierwszy. Zazwyczaj jest w / usr / share / X11 / xkb i nie jestem pewien, jak go znaleźć, jeśli go nie ma; możesz po prostu przeszukać swój system w poszukiwaniu katalogów o nazwie „xkb”. W każdym razie, gdy go znajdziesz, możesz albo zmodyfikować system jeden na miejscu, albo możesz użyć dowolnego wybranego katalogu. Zaletą korzystania z katalogu systemowego jest to, że można łatwiej wywoływać zmiany, ale wadą jest to, że przyszłe aktualizacje systemu mogą zastąpić zmiany (ostrzeżenie). W każdym razie wszystkie nazwy plików wymienione poniżej odnoszą się do tego katalogu, do którego będę się odwoływać w razie potrzeby jako $ XKBLOCAL $, a wszystkie polecenia zakładają, że to twój bieżący katalog.

  2. Określić, jaki „typ” klucza XKB są obecne klucze x, c, v. Najłatwiej to zrobić za pomocą polecenia xkbcomp -a $DISPLAY - | grep -C 6 c,(pamiętaj, że przecinek jest celowo zawarty we wzorcu). W mojej pierwszej przykładowej konfiguracji daje to:

    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> {
    

    podczas gdy w moim innym przykładzie konfiguracja ta powoduje

    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> {
    

    Wynik jest taki, że w pierwszym przykładzie odpowiednie klucze są typu „ALPHABETIC”, podczas gdy w drugim przykładzie są typu „FOUR_LEVEL”. W zależności od konfiguracji klawiatury może się okazać, że są one innego rodzaju. W dalszej części typ będzie nazywany $ TYPE $, który należy zastąpić rzeczywistym łańcuchem ALPHABETIC lub jakimkolwiek innym poleceniem poniżej.

  3. Znajdź definicję $ TYPE $ i skopiuj ją do nowego pliku w katalogu $ XKBLOCAL $ / types. Oto polecenia, które nie tylko, że: xkbcomp -a $DISPLAY - | grep -z -o 'type "$TYPE$" {[^}]*};' > types/cutpaste. Nazwa pliku „wklejanie”, który wybrałem, jest dowolna, użyj dowolnej nazwy, ale pamiętaj, że będziesz musiał odwoływać się do tego pliku konsekwentnie w późniejszych krokach. W pierwszej instalacji ten plik pobiera zawartość

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

    aw innym przykładzie pobiera treść

    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. Przeprowadź edycję typów plików / wklejania, aby zrobić dwie rzeczy: dodaj preambułę i postamble, dzięki czemu będzie to właściwa klauzula XKB, i zmień nazwę typu i definicję typu, aby dodać jeszcze jeden poziom wytwarzany przez modyfikator odpowiadający Super. Powinieneś sprawdzić, jaki modyfikator znajduje się w twoim systemie, prawdopodobnie jest to Mod4, jak zastosowano poniżej. Niezbędne modyfikacje powinny wynikać z dwóch przykładowych ostatecznych wersji typów / pasty, a mianowicie:

    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";
        };
    };
    

    i

    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. Skopiuj definicje symboli klucza, które zostały wyprowadzone przez grep w drugim kroku, do drugiego nowego symbolu pliku / wklejania i dodaj podobną preambułę i postamble, a także zmodyfikuj definicje, aby używać nowych typów i dodaj działania do definicji, aby obsłużyć żądany klucz wyprodukowane przez wersje Super. Rezultaty tego w naszych dwóch przykładach są następujące:

    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)]
        };
    };
    

    i

    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)]
        };
    };
    

    Zauważ, że w drugim przykładzie wycisnąłem także trochę (nieistotnych) białych znaków, aby zachować nieco kontrolę nad długością linii.

  6. Znajdź nazwę zestawu reguł, z których obecnie korzysta XKB. To proste, widać to w wyniku setxkbmap -query. W moim przypadku było to „evdev”.

  7. Skopiuj wersję systemową rules / evdev (lub jakąkolwiek inną nazwę zestawu reguł) do $ XKBLOCAL $ / rules / evdev i dodaj reguły wskazujące na opcje, które stworzyliśmy. Masz tutaj dwie możliwości: możesz skopiować wszystkie evdev lub tylko fragmenty wspominające model klawiatury, układ, wariant i opcje, których faktycznie używasz. Oczywiście, jeśli modyfikujesz pliki systemowe na miejscu, nie musisz kopiować, tylko edytować.

    W tym przypadku dodawane elementy są identyczne niezależnie od początkowej konfiguracji klawiatury, więc jest tylko jeden przykład. Znajdziesz sekcję pliku reguł, która zaczyna się od, ! option = symbolsi dodajesz linię cutpaste:super = +cutpastedo tej sekcji, a także sekcję pliku reguł, który zaczyna się od, ! option = typesoraz linię cutpaste:super = +cutpastedo tej sekcji.

  8. Skopiuj wersję systemową evdev.lst i dodaj wiersz dla nowej opcji. Zauważ, że nazwa tego pliku po prostu odpowiada nazwie pliku reguł z dołączonym .lst. Podobnie jak w poprzednim kroku, możesz skopiować cały plik lub tylko część, do której odnosi się model, układ, wariant i używane opcje. Musisz tylko znaleźć sekcję tego pliku, która zaczyna się od ! optioni dodać taką linię: cutpaste:super Add super equivalents of cut and paste operationsdo tej sekcji.

  9. OK, teraz wszystkie pliki konfiguracyjne są na miejscu. Jeśli zmodyfikowałeś pliki systemowe, możesz teraz wywołać nową opcję za pomocą setxkbmap -option cutpaste:super. Z drugiej strony, jeśli tego nie zrobiłeś, musisz poinformować setxkbmap, gdzie znajduje się twój katalog $ XKBLOCAL $. Co gorsza, serwer też nie wie, gdzie jest ten katalog, a setxkbmap nie (lub może nie może, ponieważ ostatecznie serwer może działać na innym komputerze) tego nie mówi. Więc musisz przesłać dane wyjściowe setxkbmap do xkbcomp, a także powiedzieć tej komendzie, gdzie jest twój katalog $ XKBLOCAL. Pełna linia poleceń to dlatego setxkbmap -I$XKBLOCAL$ -option cutpaste:super -print | xkbcomp -I$XKBLOCAL - $DISPLAY.

Mam nadzieję, że jest to pomocne / interesujące dla kogoś, ponieważ dobra ostateczna dokumentacja / referencje XKB są rzadkie. Jednym z bardzo pomocnych odniesień był http://madduck.net/docs/extending-xkb/ .

Glen Whitney
źródło
Doskonała odpowiedź. To zadziałało dla mnie w 17.10
blockloop
To nie działało dla mnie na Ubuntu 18.04. W rezultacie klawisze „c”, „x” i „v” przestały działać. Udało mi się sprawić, że znów będą pracować setxkbmap -option. Moja lokalna konfiguracja była prawie identyczna z przykładem FOUR_LEVEL, z wyjątkiem niektórych symboli Group2, Group3, które pominąłem w pliku symboli częściowych, więc mój plik wyglądał tak samo jak w przykładach.
JinnKo
2

Oto co robię. To nie jest najlepsze rozwiązanie, ale starałem się osiągnąć najlepsze rozwiązanie i nie mogłem się do niego dostać po wielu wysiłkach. Więc zdecydowałem się na coś, co jest proste i które działa na ponad 90% tego, czego potrzebuję. Mogę zaimplementować go na dowolnym komputerze, do którego się udam (lub przy dowolnej nowej instalacji Linuksa) w ciągu kilku minut. To bardzo proste.

W aplikacji terminalu X ustaw preferencje skrótów. Zrobiłem to w Gnome i KDE. Na przykład w Konsole przejdź do Menu> Ustawienia> Konfiguruj skróty. Podobne menu znajduje się w terminalu Gnome X. Wystarczy wybrać skrót (np. „Kopiuj”) i wprowadzić żądaną sekwencję klawiszy.

W przypadku konfliktu skrótów kopiowania i wklejania terminala z poleceniami terminala istnieje również łatwa poprawka. Na przykład, co jeśli ktoś chce użyć CTRL-C do kopiowania (więc terminal X jest zgodny ze standardem CUA)?

W takim przypadku możesz łatwo zmienić powiązania klawiszy stty (w .bashrc). Kontynuując CTRL-C dla przykładu kopiowania, powiedz, że chcesz, aby klucz przerwania był teraz CTRL-b (dla „break”). Dzięki temu:

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

Następnie źródło .bashrc.

Całe rozwiązanie jest tak proste, jak używanie ustawień terminali X do zmiany skrótów, a następnie, opcjonalnie, rozwiązywanie konfliktów ze stty za pomocą jednowierszowego polecenia echa. Zupełnie prosty i obejmuje prawie wszystko, czego potrzebuję.

MountainX dla Moniki Cellio
źródło
0

Prawdopodobnie klawisz Windows to klawisz modyfikujący. uruchom to i spróbuj ponownie:

xmodmap -e 'remove Mod4 = Super_L'
ZSRR
źródło
Dzięki, ale nie załatwia sprawy. Wiem, że mapowanie działa, ponieważ xev zgłasza zdarzenia XF86.
solo
Mój pierwszy post (wykonywanie xmodmap -e 'remove Mod1 = Meta_L'i wypróbowywanie poleceń później) działał dla mnie dobrze.
zsrr
1
@solo, a jeśli chodzi o działanie lub nie, weź pod uwagę, że nie każde środowisko pulpitu lub aplikacje je obsługują. Aby dowiedzieć się, czy to naprawdę działa, czy nie, użyj ich na przykład w przeglądarce Firefox. Obsługuje (nasłuchuje) powiązania klawiszy X.
zsrr
0

Wykorzystałem część tego, co powiedział Glen Whitney i udało mi się wykorzystać tę wiedzę do zmapowania gorzejszego słowa lub manipulacji tekstem z macOS na niestandardową mapę klawiszy.

Rozwiązałem już problem kopiowania i wklejania Ctrl vs Super bez angażowania tego konkretnego rozwiązania, ale jak powiedziałem, było to bardzo pomocne w innych sprawach. Unikałem też takich rzeczy jak xmodmap, ponieważ w pewnym momencie zamierzam w pełni wspierać Wayland. Kinto używa natywnego xkb i respektuje oczekiwane zachowanie systemu macOS, takie jak terminal.

https://github.com/rbreaves/kinto

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

Oto także Gist, jeśli chcesz po prostu zobaczyć, co jest w centrum tego wszystkiego, nie zmieni naprzemiennie mapy klawiszy, gdy zajdzie taka potrzeba. Gist nie obejmuje również niestandardowych plików map klawiszy xkb, które konfigurują kursory w stylu macOS / manipulacje słowne wykorzystujące Cmd i klawisze strzałek.

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

treść merytoryczna

# 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!
#
R Ben R.
źródło