Bagaimana cara mendapatkan layout keyboard gnome dari terminal?

14

Untuk penggunaan dalam skrip bash, saya perlu mendapatkan tata letak keyboard gnome yang saat ini digunakan pengguna. Sebagai contoh jika pengguna mengatur tata letak keyboard untuk en-us, saya memerlukan perintah bash yang mencetak saya ini.

Bagaimana saya bisa mendapatkan informasi itu?

Memperbarui:

setxkbmap -querysayangnya tidak bekerja. Di bawah ini adalah ouput dengan tata letak en(perintah pertama) dan de(perintah kedua) diaktifkan. Beralih tata letak keyboard tampaknya memiliki beberapa hubungan dengan konfigurasi sesi gnome

setxkbmap -query 
rules:      evdev
model:      pc105
layout:     us,de
variant:    ,
options:    terminate:ctrl_alt_bksp,lv3:ralt_switch,grp:alts_toggle

setxkbmap -query
rules:      evdev
model:      pc105
layout:     us,de
variant:    ,
options:    terminate:ctrl_alt_bksp,lv3:ralt_switch,grp:alts_toggle

Pembaruan2:

setxkbmap -print #with en-us layout
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+de:2+inet(evdev)+level3(ralt_switch_for_alts_toggle):1+level3(ralt_switch_for_alts_toggle):2+group(alts_toggle)+level3(ralt_switch)+terminate(ctrl_alt_bksp)"    };
    xkb_geometry  { include "pc(pc105)" };
};
setxkbmap -print #after switching to german layout
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+de:2+inet(evdev)+level3(ralt_switch_for_alts_toggle):1+level3(ralt_switch_for_alts_toggle):2+group(alts_toggle)+level3(ralt_switch)+terminate(ctrl_alt_bksp)"    };
    xkb_geometry  { include "pc(pc105)" };
};
ftiaronsem
sumber
Sayangnya ini bukan bash, tetapi menggunakan libxklavier, inilah [contoh python] [1] untuk melakukan apa yang Anda minta: [1]: cgit.freedesktop.org/libxklavier/tree/tests/test_gi.py
balon
1
<rant> xkb adalah neraka tak berdokumen! Beberapa definisi tata letak ini tidak berfungsi dengan baik; bagi saya mereka tiba-tiba beralih pada waktu acak dan setelah menangguhkan itu ditentukan secara acak mana dari tata letak yang ditentukan yang berlaku dan - apa yang lebih buruk - secara independen untuk setiap keyboard yang terpasang. Ya, xkb sebenarnya dapat memiliki tata letak yang berbeda untuk keyboard yang berbeda, tetapi ini tidak didokumentasikan di mana pun sejauh yang saya tahu dan oleh karena itu satu-satunya fitur yang dilakukan adalah mengganggu kami karena kami tidak dapat mengontrolnya. xkb, serius, jangan mulai aku! </rant>
Christian

Jawaban:

9

Menurut pertanyaan serupa pada Stackoverflow , berikut ini harus melakukan trik:

setxkbmap -print | grep xkb_symbols | awk '{print $4}' | awk -F"+" '{print $2}'

Saya tidak dapat memverifikasinya, karena saat ini saya tidak memiliki mesin * nix dengan X yang tersedia (saya tidak di rumah) ...

Izzy
sumber
1
Menjalankan setxkbmap -print mengembalikan yang berikut. Saya tidak berpikir ini membantu OP. xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compat { include "complete" }; xkb_symbols { include "pc+us+inet(evdev)" }; xkb_geometry { include "pc(pc105)" }; };
balon
Jadi saat ini Anda memiliki tata letak "kami" yang aktif? Itulah yang di atas pernyataan, diberikan masukan Anda, akan menghasilkan sebagai output (hanya dua huruf: "kami"). Bagaimana tampilannya ketika Anda beralih ke tata letak yang berbeda?
Izzy
2
Terima kasih atas jawaban anda. Sayangnya ini tidak melakukan trik. Kedua kali saya mendapatkan kita. Saya telah mengedit pertanyaan saya untuk menunjukkan kepada Anda ouput.
ftiaronsem
patut dicoba. Anda dapat mencoba menentukan -vparameter (beberapa kali), yang meningkatkan verbositas dan dengan demikian memberikan lebih banyak informasi. Harus bekerja untuk keduanya, -queryjuga -print. Karena saya tidak memiliki pengaturan multilang, saya tidak dapat memastikan apakah ia memberikan detail yang Anda butuhkan - tetapi dengan 3 kali -voutput di sini terbagi menjadi "aturan yang diterapkan" dan "keymap". Yang terakhir tampaknya menjadi informasi yang lengkap, sehingga bagian pertama dapat memiliki "bagian yang sedang aktif".
Izzy
terima kasih lagi, tapi sayangnya ini tidak berhasil juga. Output yang sama sebelum dan sesudah perubahan tata letak. Secara independen dari verbositas.
ftiaronsem
4

Untuk Ubuntu 17.10 atau lebih baru

Di Ubuntu 17.10, dengan GNOME, nilai gsettings saat ini tidak berubah ketika Anda beralih sumber input. Sebaliknya ada mru-sumber kunci yang berisi daftar m ost r ecently u sed sumber masukan.

$ gsettings get org.gnome.desktop.input-sources mru-sources
[('xkb', 'se'), ('xkb', 'us')]

Sumber pertama dalam daftar itu adalah yang sekarang, jadi oneliner untuk mendapatkan tata letak saat ini mungkin terlihat seperti ini:

gsettings get org.gnome.desktop.input-sources mru-sources | sed -r "s/\S*\s'([^']+).*/\1/"

Harap dicatat bahwa jawaban ini tidak berlaku jika Anda menggunakan Unity pada sistem Ubuntu 17.10. Dengan Unity tetap berfungsi seperti sebelumnya.

Gunnar Hjalmarsson
sumber
3

Untuk Ubuntu 13.04 dan lebih rendah

Anda bisa menggunakan xkblayout-statealat. Lihat file README.md untuk deskripsi, kompilasi, instalasi dan penggunaan.

Perintah berikut akan melakukan apa yang Anda inginkan:

xkblayout-state print "%s"

Untuk Ubuntu 13.10 dan lebih tinggi

Ubuntu 13.10 hadir dengan beberapa peningkatan yang baik dalam hal ini, dan Anda dapat menggunakan fungsi bash sederhana berikut:

get_current_xkblayout () {
      current_input_nr=$(gsettings get org.gnome.desktop.input-sources current | \
          awk '{ print $NF }')
      shift=$(( 2 * ( $current_input_nr + 1 )))
      gsettings get org.gnome.desktop.input-sources sources | tr -d "\',[]()" | \
          awk -v cur="$shift" '{ print $cur }'
}

Perintah berikut ini juga berfungsi di 13.10:

setxkbmap -query | awk -F"(,|[ ]+)" '/layout:/ { print $2 }'

atau:

setxkbmap -print | awk -F"+" '/xkb_symbols/ {print $2}'
Radu Rădeanu
sumber
2

Cukup tekan Ctrl+ Alt+ Tdi keyboard Anda untuk membuka Terminal. Saat terbuka, jalankan perintah di bawah ini.

setxkbmap -query

Inilah yang harus Anda lihat

masukkan deskripsi gambar di sini

Mitch
sumber
terima kasih atas jawaban yang cepat, sayangnya ini tidak berfungsi. Inilah ouput (pertama kali dengan tata letak en, kedua dengan de):
ftiaronsem
karena memformat yang disisipkan sebagai edit pertanyaan ...
ftiaronsem
1
terima kasih lagi atas balasan secepatnya. Ini sesuai dengan apa yang saya lihat, tetapi tidak memberi tahu saya, apakah saya memilih tata letak Jerman atau Amerika. Atau apakah saya melewatkan sesuatu?
ftiaronsem
2

Dengan menggunakan terminal, saya telah menjalankan uji perubahan antara 'pt' dan 'kita', dan setelah setiap perubahan, saya telah mengumpulkan tata letak keyboard yang digunakan dengan sukses:

Dapatkan tata letak keyboard aktif

setxkbmap -print | grep xkb_symbols | awk -F"+" '{print $2}'
  • Cetak konfigurasinya: setxkbmap -print
  • Kumpulkan garis yang penting: grep xkb_symbols
  • mendapatkan string setelah tanda "+" pertama: awk -F"+" '{print $2}'

Output yang memiliki tata letak 'us' aktif adalah: us


Bersihkan di antara tata letak

sudo setxkbmap -option grp:alt_shift_toggle pt

Lewati tempat ia membaca 'pt', kode bahasa untuk beralih.

masukkan deskripsi gambar di sini

Catatan: Saya menggunakan Gnome di Ubuntu 12.04 (Precise Pangolin)

Zuul
sumber
Terima kasih atas jawaban anda. Masalahnya tampaknya bahwa pengguna cenderung beralih di antara tata letak dengan menggunakan applet bilah tugas. Ini bekerja jika seseorang beralih tata letak dari cmd, tetapi tidak berfungsi, jika pengguna beralih dengan task bar applet.
ftiaronsem
@ftiaronsem, Anda belum menyebutkan bagian itu sebelumnya :) Saya akan memeriksanya dan memperbarui jawaban saya jika memungkinkan!
Zuul
0

Untuk Ubuntu 13.10 atau Lebih Baru

(Tidak yakin apakah itu berfungsi di rilis sebelumnya)

current_layout=gsettings get org.gnome.desktop.input-sources current | awk '{print $2}'
gsettings get org.gnome.desktop.input-sources sources | grep -Po "'[[:alpha:]]+'\)" | sed -ne "s/['|)]//g;$(($current_layout+1))p"

Untuk melihat lebih banyak opsi:

gsettings list-recursively org.gnome.desktop.input-sources
user.dz
sumber