Bagaimana cara mendapatkan tata letak keyboard saat ini?

61

Saya bertanya-tanya apakah ada alat baris perintah, yang mengembalikan tata letak keyboard saat ini.

Saya telah XkbLayoutmengatur untuk us, ru.

Pembaruan: setxkbmap mengembalikan pengaturan tata letak, bukan tata letak yang dipilih. Misalnya:

$ setxkbmap -print | grep xkb_symbols
xkb_symbols   { include "pc+us+ru:2+inet(evdev)+capslock(grouplock)+terminate(ctrl_alt_bksp)"   };

Ini akan mengembalikan hasil yang sama tidak peduli apa tata letak saat ini.

Andrew
sumber
Saya tidak terlalu bagus di D-Bus, tetapi saya rasa mudah untuk melacak tata letak keyboard saat ini. Meskipun mungkin tidak dapat melakukannya jika tidak ada saklar yang aktif.
Benjamin

Jawaban:

31

Mungkin ini tergantung pada versi, tetapi pada mesin saya yang menggunakan setxkbmap1.3.0 perintah berikut berfungsi:

setxkbmap -query | grep layout

Perhatikan bahwa tergantung pada kebutuhan Anda, mungkin tidak berguna untuk mengetahui hanya tata letak: misalnya varian Dvorak dari tata letak AS sangat berbeda dari QWERTY default. The -querypilihan untuk setxkbmapmemberikan kedua tata letak dan varian, sebagai bidang yang berbeda:

$ setxkbmap -query
rules:      evdev
model:      default
layout:     fr
variant:    bepo
options:    grp:alt_shift_toggle
Mars
sumber
3
-querytelah ditambahkan di setxkbmap 1.2.0
alanc
Anda mendapatkan tata letak dan varian saat ini dan banyak info tambahan dengansetxkbmap -print -verbose 10
erik
Untuk mengaturnya, misalnya tata letak baik cz dan kami, yang terakhir dengan varian dvorak (untuk keyboard tombol 104), gunakansetxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik
Terima kasih, bekerja
Indacochea Wachín
19

Ada xkb-switch yang dijelaskan sebagai berikut:

xkb-switch adalah program C ++ yang memungkinkan untuk melakukan kueri dan mengubah status tata letak XKB.

https://github.com/ierton/xkb-switch

Atau, mengikuti saran nozimica, Anda dapat menggunakan:

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

Dari utas ini di papan Arch Linux: https://bbs.archlinux.org/viewtopic.php?pid=539406

jasonwryan
sumber
1
Terima kasih, xkb-switchberfungsi dengan baik, tapi saya harap ada solusi yang lebih portabel
Andrew
1
@ Andrew: ya agak aneh tidak ada cara sederhana untuk mendapatkan tata letak saat ini.
Benjamin
7
Anda setxkbmaptidak menampilkan tata letak yang sedang aktif saat lebih dari satu tata letak ditentukan.
terdon
13

Ya ADA alat baris perintah yang melakukan apa yang Anda inginkan! Saya baru saja menemukannya 10 menit yang lalu :)

Lihat di sini: https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

tidak persis apa yang Anda inginkan (itu tidak menghasilkan akhir baris, jadi tambahkan ; echojika Anda perlu). jalankan alat tanpa parameter untuk bantuan.

Pablo Saratxaga
sumber
11

Gunakan ini untuk mendapatkan kode untuk tata letak saat ini:

$(xset -q|grep LED| awk '{ print $10 }')

Ini mungkin perlu dikonversi ke formulir yang Anda inginkan, seperti:

case "$(xset -q|grep LED| awk '{ print $10 }')" in
  "00000002") KBD="English" ;;
  "00001002") KBD="Thai" ;;
  *) KBD="unknown" ;;
esac
Pepa
sumber
3
Saya mendapatkan 00000002meskipun tata letak saya adalah "USA Dvorak internasional". Bahasa tidak cukup ...
l0b0
4
Tidak membantu jika ada tiga tata letak atau lebih. Layout kedua dan ketiga memberikan nilai yang sama 00001004pada mesin saya.
sastanin
masalah: beralih numlock Anda dan mulai perintah ini lagi;)
andras.tim
Ini tidak akan bekerja dengan andal - Anda perlu menggunakan masker karena LED menunjukkan status tombol yang dipimpin keyboard juga.
fikovnik
9

Pendekatan lain yang lebih sederhana, karena posisi tetap dari output xset -qperintah, adalah ini:

xset -q | grep -A 0 'LED' | cut -c59-67

Mencetak 00000002atau 00001002tergantung pada tata letak keyboard Anda saat ini.

nikospag
sumber
Saya suka yang ini, saya pikir Anda bisa mempersempitnya menjadi 8 karakter. c59-66.
xlembouras
8

Pada sistem yang lebih baru, Anda dapat menggunakan

localectl status

Sebagai contoh akan menunjukkan kepada Anda hal berikut:

System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us
oLen
sumber
3

Jawaban sejauh ini tidak berhasil untuk saya. Saya menggunakan setkbmapdengan dua tata letak bahasa Inggris dan ceko sehingga setiap -printatau -queryakan selalu mengembalikan keduanya. Menerima status LED untuk xset -qtidak berfungsi karena yang menunjukkan status semua led keyboard.

Sejauh ini yang terbaik adalah dengan cepat menulis utilitas kecil ini: https://gist.github.com/fikovnik/ef428e82a26774280c4fdf8f96ce8eeb

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <X11/XKBlib.h>
#include <X11/extensions/XKBrules.h>

int main(int argc, char **argv) {
  Display *dpy = XOpenDisplay(NULL);

  if (dpy == NULL) {
    fprintf(stderr, "Cannot open display\n");
    exit(1);
  }

  XkbStateRec state;
  XkbGetState(dpy, XkbUseCoreKbd, &state);

  XkbDescPtr desc = XkbGetKeyboard(dpy, XkbAllComponentsMask, XkbUseCoreKbd);
  char *group = XGetAtomName(dpy, desc->names->groups[state.group]);
  printf("Full name: %s\n", group);

  XkbRF_VarDefsRec vd;
  XkbRF_GetNamesProp(dpy, NULL, &vd);

  char *tok = strtok(vd.layout, ",");

  for (int i = 0; i < state.group; i++) {
    tok = strtok(NULL, ",");
    if (tok == NULL) {
      return 1;
    }
  }

  printf("Layout name: %s\n", tok);

  return 0;
}

dan kompilasi menggunakan

gcc -I/usr/include getxkblayout.c -lX11 -lxkbfile

fikovnik
sumber
3

Anda dapat menggunakannya xkbprintuntuk mencetak tata letak saat ini.

Misalnya untuk mencetak tata letak saat ini sebagai penggunaan PDF

xkbprint -color "${DISPLAY}" - |\
    ps2pdf - > current_keyboard_layout.pdf

yang menghasilkan:

hasil xkbprint

Mengalir
sumber
2

Dari Goosfrabaa di forum Arch Linux :

setxkbmap -v | awk -F "+" '/symbols/ {print $2}'

Ini berfungsi dengan baik di sini, dan mencetak us(dvorak-intl)(ditampilkan sebagai "USA Dvorak internasional" di menu pilihan keyboard GNOME).

l0b0
sumber
7
Ini hanya mencetak tata letak pertama dalam daftar, bukan yang sekarang.
sastanin
Bagaimana saya bisa mendeteksi keymap saya, ketika saya menggunakan toggle bahasa oleh setxkbmap? $ setxkbmap -v>> Trying to build keymap using the following components: | keycodes: evdev+aliases(qwerty) | types: complete | compat: complete+ledscroll(group_lock) | symbols: pc+us+hu:2+inet(evdev)+group(alt_shift_toggle)+compose(rwin)+terminate(ctrl_alt_bksp) | geometry: pc(pc105)dalam hal ini saya mendapat setiap "kita"
andras.tim
0

Sebagian jawaban: Pada KDE , Anda tampaknya bisa mendapatkan tata letak keyboard saat ini melalui qdbusperintah:

$ qdbus org.kde.keyboard /Layouts getCurrentLayout
gb(intl)

Saya memiliki beberapa tata letak yang dikonfigurasikan, tetapi hanya menampilkan satu yang sedang digunakan.

Diuji pada Kubuntu 18.04 (qdbus versi 4.8.7). Mungkin ada solusi berbasis d-bus lain untuk lingkungan non-Qt, tapi saya tidak tahu tentang mereka.

Qeole
sumber
0
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


keyboardLayout () {
    layout=$(variableInFile "KEYMAP" "/etc/vconsole.conf")
    echo ${layout}
}


variableInFile () {
    variable=${1}
    file=${2}

    source ${file}
    eval value=\$\{${variable}\}
    echo ${value}
}


keyboardLayout
Alberto Salvia Novella
sumber
-1

Anda dapat gunakan:

setxkbmap -print | grep xkb_symbols
nozimica
sumber
5
mengembalikan pengaturan keyboard secara keseluruhan, bukan tata letak saat ini (kami atau ru)
Andrew
Jalankan dengan baik, seperti yang dinyatakan oleh @jasonwryan jika Anda menganalisis dengan cermat garis itu, di dalamnya ada tata letak Anda. Dalam kasus saya itu latam.
nozimica
5
versi jasonwryan hanya menampilkan sebagian string setelah '+', xkb_symbolsnilai tidak tergantung pada tata letak yang dipilih, saya selalu mendapatkan 'kita'
Andrew