Script to toggle setxkbmap

8

Saya ingin skrip bash yang berganti-ganti antara: setxkbmap sedan setxkbmap us.

Lalu, niat saya adalah memetakan skrip itu CtrlEscmelalui pintasan khusus> Keyboard.

Intinya adalah bahwa saya ingin mengganti tata letak keyboard dengan CtrlEscape. Bagaimana saya bisa menerapkannya?

Fredrik
sumber
1
DE apa yang kamu gunakan?
daisy
3
XKB dapat mengatur kunci untuk beralih antar tata letak. Ini bukan sesuatu yang ingin Anda tulis, tetapi mungkin ada konfigurasi yang sudah disiapkan untuk itu di luar sana di mana Anda hanya perlu memilih pasangan tata letak dan kombinasi tombol mana yang Anda inginkan.
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

3

Saya tidak tahu Desktop Desktop apa yang Anda jalankan, bagaimana Anda akan menetapkan tombol pintas dapat bervariasi, tetapi skrip ini berfungsi secara global, setidaknya pada saya Ubuntu 12.04 boxdan Arch Linux:

#!/bin/bash

(setxkbmap -query | grep -q "layout:\s\+us") && setxkbmap se || setxkbmap us
bunga aster
sumber
Sayangnya, ini tidak berfungsi jika Anda mengubah tata letak menggunakan metode gui. Setidaknya, itu tidak ada di kotak xfce saya. Ini hanya berfungsi jika Anda menggunakan setxkbmap untuk mengganti tata letak. Satu-satunya cara saya menemukan bahwa selalu, bekerja secara konsisten adalah penguraian xmodmapseperti pada jawaban saya di bawah ini.
terdon
@terdon berfungsi setidaknya di kotak Ubuntu 12.04 saya, sudahkah Anda mencobanya di sistem Anda?
daisy
Ya, percayalah, saya telah menghabiskan banyak waktu berurusan dengan masalah seperti ini. Saya secara teratur beralih di antara 3 tata letak keyboard (kami, fr, es) dan antara dua keyboard fisik, satu dengan tata letak AS dan satu dengan bahasa Spanyol. Jika saya menggunakan applet pada panel tint2 saya untuk mengubah tata letak keyboard, tidak ada perbedaan sama sekali dalam output setxkbmap. Hal yang sama berlaku jika saya mengganti tata letak menggunakan pintasan yang diatur melalui keyboard shortcutsGUI pada LMDE saya. setxkbmaphanya berubah ketika saya beralih menggunakannya.
terdon
Sangat rapi dengan solusi satu jalur. Terima kasih.
Fredrik
Apa yang akhirnya saya lakukan adalah menyimpan baris ke file .sh di direktori home saya. Kemudian dipetakan ./toggleLayout.sh ke ctrl-esc
Fredrik
4

Ada berbagai jawaban untuk pertanyaan serupa . Namun, tidak satupun dari mereka bekerja dengan baik untuk saya.

Skrip berikut harus berfungsi dalam semua kasus. Ini tentu berfungsi pada sistem debian saya saat mengganti tata letak dengan setxkbmap:

#!/bin/bash
seven=`xmodmap -pke | grep "keycode  16" | awk '{print \$5}'` 
## If this is the "us" layout
if [ $seven == "ampersand" ]; then
    setxkbmap se
else
  setxkbmap us
fi

Script mem-parsing output xmodmap untuk melihat apakah layout saat ini adalah "us" atau "se". Di tata letak "kami", SHIFT+ 7dipetakan ke "ampersand". Jika Anda hanya akan beralih antara tata letak "kami" dan "se", memiliki "ampersand" 7berarti Anda menggunakan tata letak "kami" dan skrip akan berubah menjadi "se". Jika Anda tidak mengaktifkan "ampersand" 7, skrip beralih ke "kami".

terdon
sumber
4

cara terbaik adalah dengan tidak menggunakan skrip, tetapi untuk memuat keyboard dua lapis (misalnya :) setxmodmap "us,se"dan mendefinisikan ulang Ctrl- Escuntuk mengirim ISO_Next_Group

Lihatlah jawaban ini di xkb untuk cara mendefinisikan kembali beberapa kunci tanpa perlu mengedit file default utama (dengan demikian, tidak perlu menjadi root). Dalam file simbol lokal (mis .:), ~/.xkb/symbols/mysymbolsletakkan bagian kecil sebagai:

partial modifier_keys 
xkb_symbols "ctrl_esc_toggle" {
    key <ESC> {
        type[Group1]="PC_CONTROL_LEVEL2",
        symbols[Group1]= [ Escape,     ISO_Next_Group ]
    };
};

PC_CONTROL_LEVEL2 memberi tahu bahwa simbol sencond untuk kunci tersebut didapat dengan Control (bukan Shift).

dan di file keymap lokal (misalnya :; ~/.xkb/keymap/mykbdAnda dapat membuatnya dengan setxkbmap "us,se" ; setxkbmap -print > ~/.xkb/keymap/mykbd) ubah baris xkb_symbols untuk menambahkan "mysymbols (ctr_esc_toggle)" sehingga Anda akan memiliki sesuatu seperti:

xkb_symbols   { include "pc+us+se:2+inet(evdev)+terminate(ctrl_alt_bksp)+compose(rwin)+mysymbols(ctr_esc_toggle)"   };

(perhatikan "se: 2", ": 2" memberitahu untuk memuat definisi simbol "se" sebagai Group2; Anda dapat menumpuk berbagai grup).

Anda sekarang dapat memuatnya dengan: xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY lalu Ctrl-Esc akan beralih antara tata letak "us" dan "se".

Perhatikan bahwa Anda perlu menekan Ctrl (dan tahan) sebelum Esc; cara lain itu tidak bekerja (itu akan memerlukan mendefinisikan pengubah virtual untuk Escape, dan saya tidak tahu bagaimana melakukannya)

Pablo Saratxaga
sumber
1
Bagaimana leftwin+leftalt+spacekelihatannya?
Hotschke
@ Hotschke, terima kasih{ include "pc+us+ru:2+inet(evdev)+group(win_space_toggle)" };
kontributorpw