Binding Super + C Super + V untuk Menyalin dan Menempel


23

Untuk beberapa waktu saya tertarik untuk mengikat Windows Key (Super_L) pada keyboard saya untuk Menyalin dan Menempel tanpa alasan lain selain kenyamanan dan konsistensi antara desktop saya dan MacBook saya.

Saya pikir saya sudah dekat setelah membaca tentang xmodmap dan menjalankan yang berikut:

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

Sayangnya, XF86Copy dan XF86Paste sepertinya tidak berfungsi sama sekali. Mereka terdaftar /usr/include/X11/XF86keysym.hdan xevmenunjukkan bahwa urutan kunci sedang ditafsirkan oleh X sebagai XF86Paste dan XF86Copy, apakah simbol ini benar-benar berfungsi? Apakah mereka harus memiliki dukungan tingkat aplikasi?

Jawaban:


18

Binding Super ke Ctrl

Bagaimana dengan mengikat Windows/Logo/Superkunci kiri Anda untuk bertindak sebagai Ctrlkunci lain ?

Anda dapat mencapainya dengan perintah xmodmap berikut:

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

Dengan asumsi Anda menyimpan baris di atas karena super_as_ctrl.xmodmapAnda dapat menguji efeknya dengan mengeksekusi

xmodmap super_as_ctrl.xmodmap

Untuk membuat perubahan permanen (tetap masuk kembali / reboot) ubah nama file ke .Xmodmapdalam folder rumah Anda.

(Di atas diuji pada sistem live Ubuntu 11.10, tetapi harus sama untuk distribusi Linux lainnya)


Menyesuaikan pintasan Salin / Tempel untuk program terminal Anda

Setelah terikat Superdengan CtrlAnda sekarang dapat digunakan Super-Cuntuk menyalin hampir di mana-mana. Satu-satunya pengecualian yang umum adalah program terminal Anda. Namun Anda dapat mendefinisikan ulang pintasan di sana.

Saya menemukan bahwa bahkan gnome-terminalmemiliki opsi ini sekarang (saya tidak punya sampai saya terbiasa Ctrl-Shift-C). Jika Anda menggunakan yang itu, buka Edit / Keyboard Shortcuts...di menu dan tetapkan Ctrl-Cuntuk menyalin dan Ctrl-Vmenempel. Harus serupa untuk konsoledll.

Dan jangan khawatir, Anda tidak akan kehilangan kemampuan untuk menghentikan program menggunakan jalan pintas. Setelah membatalkan pintasan salinan untuk terminal, Anda bisa menggunakan Ctrl-Shift-Cseperti yang Anda gunakan Ctrl-Csebelumnya. Terminal tidak membedakan di sini jika Shift ditekan atau tidak. Dan jalan pintas tidak tertangkap lagi untuk salinan. Alternatif lain, ulangi terminasi ke pintasan lain, seperti yang disarankan MountainX dalam jawabannya.


XF86Copy dll. Tidak berfungsi

Mengenai simbol kunci untuk salin dan tempel: Rupanya mereka tidak memiliki efek. Saya mengujinya dengan cepat dengan menetapkan tindakan salin ke Shift-ScrollLock (itu tidak digunakan dan saya ingin menguji dengan kunci non modifier):

xmodmap -e 'keycode 78 = Scroll_Lock XF86Copy Scroll_Lock'

Menekannya tidak berpengaruh, juga dengan XF86AudioMute. Namun itu berhasil ketika menetapkan huruf 'a'. Jadi saya kira ada masalah khusus dengan simbol kunci khusus XF86 ini.


3
Sayangnya, bahkan jika saya mengikat Super ke Ctrl, saya masih harus menggunakan Ctrl / Super + Shift + C untuk menyalin dan menempel di dalam terminal, yang merupakan insentif utama. Terima kasih mengonfirmasi bahwa kunci XF86 tidak berfungsi.
solo

Program terminal apa yang Anda gunakan? Saya menambahkan solusi yang tidak bekerja dengan gnome-terminal setidaknya. Dan itu harus serupa untuk orang lain.
zpea

4
Mengikat Kontrol ke Meta tidak sama dengan mengubah pintasan untuk menyalin / menempel ke Meta + c / v. Saya ingin membuat pintasan kboard mirip MacO di Linux, jadi jawaban ini tidak luar biasa ...
Sonique

1
Shift + ctrl + c atau apa pun yang terlalu kikuk, dan hanya mengubah Super ke Ctrl akan mengirim sinyal kill dengan Super + c sehingga tidak benar-benar menyelesaikan banyak hal
rien333

langkah pertama adalah kira-kira apa yang saya lakukan untuk mengubah super / perintah menjadi kendali. Itu memperbaiki sebagian besar hal - tetapi saya masih ingin cmd-c dan ctrl-c memiliki fungsi yang berbeda, bahkan jika cmd berarti ctrl di tempat lain. Tidak yakin apakah saya bisa melakukan ini dengan xmodmap dan pintasan khusus terminal.
tedder42

9

Jika Anda ingin mengikat hanya beberapa urutan dari bentuk Super + x, Super + c, Super + v ke urutan lain seperti Ctrl + x, Ctrl + c, Ctrl + v, misalnya sehingga (seperti OP yang diinginkan) ini urutan Super-key tertentu umumnya akan memetakan untuk memotong & menempel tanpa mempengaruhi penggunaan lain dari kunci Super pada sistem Anda, dimungkinkan hanya menggunakan ekstensi XKB. Prosedur di bawah ini menguraikan langkah-langkah dan memberikan dua contoh berbeda dari detail untuk dua pengaturan keyboard awal yang berbeda; semoga itu akan memberikan informasi yang cukup untuk beradaptasi dengan sistem Anda. Ini mengasumsikan Anda merasa nyaman dengan membuat dan mengedit file di sistem Anda, termasuk yang ada di lokasi sistem seperti /usr/share/X11/xkb.

  1. Putuskan di mana Anda ingin pohon konfigurasi XKB Anda berada. Pertama temukan satu sistem. Biasanya di / usr / share / X11 / xkb, dan saya tidak yakin bagaimana menemukannya jika tidak ada; Anda bisa mencari direktori di sistem Anda dengan nama "xkb". Bagaimanapun, setelah Anda menemukannya, Anda dapat memodifikasi sistem satu di tempat, atau Anda dapat menggunakan direktori pilihan Anda. Keuntungan menggunakan direktori sistem adalah Anda dapat lebih mudah melakukan perubahan, tetapi kekurangannya adalah bahwa pembaruan sistem di masa depan mungkin akan menimpa perubahan Anda (Anda telah diperingatkan). Bagaimanapun, semua nama file yang disebutkan selanjutnya adalah relatif terhadap direktori ini, yang akan saya rujuk ketika dibutuhkan sebagai $ XKBLOCAL $, dan semua perintah menganggap itu adalah direktori Anda saat ini.

  2. Tentukan "tipe" XKB apa dari kunci x, c, v saat ini. Cara termudah untuk melakukan ini adalah melalui perintah xkbcomp -a $DISPLAY - | grep -C 6 c,(perhatikan koma sengaja dimasukkan dalam pola). Dalam pengaturan contoh pertama saya, ini menghasilkan:

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

    sedangkan dalam contoh setup saya yang lain ini menghasilkan

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

    Hasilnya adalah bahwa dalam contoh pertama, kunci yang relevan bertipe "ALPHABETIC" sedangkan dalam contoh kedua mereka bertipe "FOUR_LEVEL". Bergantung pada pengaturan keyboard Anda, Anda mungkin menemukan bahwa mereka semua dari jenis lain. Dalam apa yang berikut, tipe akan disebut sebagai $ TYPE $, yang harus Anda ganti dengan string ALPHABETIC yang sebenarnya atau apa pun dalam perintah di bawah ini.

  3. Temukan definisi $ TYPE $ dan salin ke file baru di direktori $ / types $ XKBLOCAL. Berikut adalah perintah yang tidak hanya itu: xkbcomp -a $DISPLAY - | grep -z -o 'type "$TYPE$" {[^}]*};' > types/cutpaste. Nama file "cutpaste" yang saya pilih adalah sewenang-wenang, gunakan nama apa pun yang Anda suka, tetapi perhatikan bahwa Anda harus merujuk file ini secara konsisten pada langkah-langkah selanjutnya. Pada pengaturan pertama, file ini mendapatkan konten

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

    dan dalam contoh lain ia mendapatkan isinya

    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. Edit tipe file / cutpaste untuk melakukan dua hal: tambahkan mukadimah dan mukadimah yang membuatnya menjadi klausa XKB yang tepat, dan ubah nama tipe dan definisi tipe untuk menambahkan satu tingkat lagi yang dihasilkan oleh pengubah yang sesuai dengan Super. Anda harus memeriksa apa yang pengubah pada sistem Anda, kemungkinan Mod4 seperti yang digunakan di bawah ini. Modifikasi yang diperlukan harus jelas dari dua contoh versi final dari tipe / cutpaste, yaitu:

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

    dan

    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. Salin definisi simbol kunci yang dihasilkan oleh grep pada langkah kedua menjadi simbol file / cutpaste baru kedua, dan tambahkan basa-basi dan postamble yang serupa, dan modifikasi definisi untuk menggunakan tipe baru dan tambahkan tindakan ke definisi untuk menangani kunci yang diinginkan diproduksi oleh versi Super. Hasil dari ini dalam dua contoh kami adalah:

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

    dan

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

    Perhatikan bahwa dalam contoh kedua saya memeras beberapa spasi putih (tidak signifikan) juga untuk menjaga panjang garis di bawah sedikit kontrol.

  6. Temukan nama aturan yang ditetapkan bahwa XKB sedang menggunakan. Itu mudah, ini ditunjukkan pada hasil setxkbmap -query. Dalam kasus saya, itu "evdev".

  7. Salin versi sistem aturan / evdev (atau apa pun nama aturan Anda set) adalah $ XKBLOCAL $ / rules / evdev dan tambahkan aturan yang menunjuk ke opsi yang telah kami buat. Anda memiliki dua pilihan di sini: Anda dapat menyalin semua evdev atau hanya bagian-bagian yang menyebutkan model keyboard, tata letak, varian, dan opsi yang sebenarnya Anda gunakan. Tentu saja, jika Anda memodifikasi file sistem di tempat, Anda tidak perlu melakukan penyalinan, cukup mengedit.

    Dalam hal ini, apa yang ditambahkan adalah identik terlepas dari pengaturan keyboard awal, jadi hanya ada satu contoh. Anda menemukan bagian dari file aturan yang dimulai dengan ! option = symbolsdan menambahkan baris cutpaste:super = +cutpasteke bagian itu, dan Anda juga menemukan bagian dari file aturan yang dimulai dengan ! option = typesdan baris cutpaste:super = +cutpasteke bagian itu juga.

  8. Salin versi sistem dari evdev.lst dan tambahkan baris untuk opsi baru Anda. Perhatikan bahwa nama file ini hanya sesuai dengan nama file aturan dengan .lst ditambahkan. Seperti pada langkah sebelumnya, Anda bisa menyalin seluruh file atau hanya bagian yang dirujuk oleh model, tata letak, varian, dan opsi yang Anda gunakan. Anda hanya perlu menemukan bagian dari file ini yang dimulai dengan ! optiondan menambahkan baris seperti ini: cutpaste:super Add super equivalents of cut and paste operationske bagian itu.

  9. OK, sekarang semua file konfigurasi sudah ada. Jika Anda memodifikasi file sistem, sekarang Anda dapat memanggil opsi baru dengan setxkbmap -option cutpaste:super. Di sisi lain, jika tidak, Anda harus membiarkan setxkbmap tahu di mana direktori $ XKBLOCAL $ Anda. Yang lebih parah, server tidak tahu di mana direktori itu berada, dan setxkbmap tidak (atau mungkin tidak bisa, karena pada akhirnya server mungkin berjalan di komputer lain) mengatakannya. Jadi, Anda harus mem-pipe output dari setxkbmap ke xkbcomp, dan juga memberi tahu perintah itu di mana direktori $ XKBLOCAL Anda berada. Oleh karena itu, baris perintah penuh setxkbmap -I$XKBLOCAL$ -option cutpaste:super -print | xkbcomp -I$XKBLOCAL - $DISPLAY.

Semoga ini membantu / menarik bagi seseorang, karena dokumentasi / referensi XKB definitif yang baik jarang. Satu referensi yang sangat membantu adalah http://madduck.net/docs/extending-xkb/ .


Jawaban yang sangat bagus. Ini bekerja untuk saya pada 17.10
blockloop

Ini tidak berhasil untuk saya di Ubuntu 18.04. Hasilnya hanya bahwa kunci 'c', 'x' dan 'v' tidak lagi berfungsi. Saya bisa membuat mereka bekerja lagi setxkbmap -option. Setup lokal saya hampir identik dengan contoh FOUR_LEVEL dengan pengecualian beberapa simbol Group2, Group3 yang saya tinggalkan dari file simbol parsial sehingga file saya terlihat sama seperti contoh.
JinnKo

2

Inilah yang saya lakukan. Ini bukan solusi akhir, tetapi saya mencoba untuk mencapai solusi akhir dan tidak bisa sampai di sana setelah banyak usaha. Jadi saya memilih sesuatu yang sederhana dan bekerja lebih dari 90% dari apa yang saya butuhkan. Saya dapat mengimplementasikannya di komputer mana pun yang saya kunjungi (atau instal Linux baru) dalam hitungan menit. Sederhana sekali.

Dalam aplikasi terminal X, atur preferensi pintasan. Saya telah melakukan ini di Gnome dan KDE. Di Konsole, misalnya, buka Menu> Pengaturan> Konfigurasikan Pintasan. Ada menu serupa di terminal Gnome X. Cukup pilih pintasan (misalnya, "salin") dan masukkan urutan kunci yang diinginkan.

Jika terminal salin & tempel pintasan bertentangan dengan perintah terminal, ada juga perbaikan yang mudah. Sebagai contoh, bagaimana jika seseorang ingin menggunakan CTRL-C untuk salinan (sehingga terminal X sesuai dengan standar CUA)?

Dalam hal ini, Anda dapat mengubah binding kunci stty dengan mudah (dalam .bashrc). Melanjutkan CTRL-C untuk menyalin contoh, katakan Anda ingin kunci interrupt sekarang menjadi CTRL-b (untuk "istirahat"). Ini mencapai itu:

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

Kemudian sumber .bashrc.

Seluruh solusi sesederhana menggunakan pengaturan terminal X untuk mengubah pintasan dan kemudian, secara opsional, menyelesaikan konflik dengan stty dengan perintah gema satu baris. Mati sederhana dan mencakup hampir semua yang saya butuhkan.


0

Mungkin kunci Windows adalah kunci pengubah. jalankan ini dan coba lagi:

xmodmap -e 'remove Mod4 = Super_L'

Terima kasih, tetapi tidak berhasil. Saya tahu pemetaan berfungsi karena xev melaporkan peristiwa XF86.
solo

Posting pertama saya (mengeksekusi xmodmap -e 'remove Mod1 = Meta_L'dan mencoba perintah Anda setelah) bekerja dengan baik untuk saya.
ussr

1
@solo dan tentang bekerja atau tidak, pertimbangkan tidak semua lingkungan desktop atau aplikasi mendukungnya. Untuk mengetahuinya benar-benar berfungsi atau tidak, gunakan di Firefox misalnya. Ini mendukung (mendengarkan) binding kunci X.
ussr

0

Saya telah mengambil sebagian dari apa yang dikatakan Glen Whitney dan berhasil menggunakan pengetahuan itu untuk memetakan perilaku kata-buruk atau manipulasi teks dari MacOS ke dalam custom keymap.

Saya sudah memecahkan masalah Ctrl vs Super copy dan paste tanpa melibatkan solusi spesifik itu, tapi seperti saya katakan itu sangat membantu untuk hal-hal lain. Saya juga menghindari hal-hal seperti xmodmap karena saya bertujuan untuk sepenuhnya mendukung Wayland di beberapa titik. Kinto menggunakan xkb asli dan menghormati MacOS yang diharapkan seperti perilaku terminal.

https://github.com/rbreaves/kinto

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

Ini intinya juga, jika Anda hanya ingin melihat apa yang menjadi inti dari semuanya, itu tidak akan mengganti keymap Anda saat dibutuhkan. Gist juga tidak termasuk file keymap xkb khusus yang mengatur kursor macOS style / manipulasi kata-bijaksana yang menggunakan Cmd dan tombol panah.

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

konten inti

# 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!
#
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.