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.


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

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


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.


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

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.


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

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


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


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).


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.


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

-1

Anda dapat gunakan:

setxkbmap -print | grep xkb_symbols

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