it-swarm-id.com

Bagaimana cara mendapatkan tata letak keyboard saat ini?

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

Saya memiliki XkbLayout diset ke 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.

61
Andrew

Mungkin ini tergantung pada versi, tetapi pada mesin saya yang menggunakan setxkbmap 1.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. -query pilihan setxkbmap memberikan tata letak dan varian, sebagai bidang yang berbeda:

$ setxkbmap -query
rules:      evdev
model:      default
layout:     fr
variant:    bepo
options:    grp:alt_shift_toggle
33
mars

Ada xkb-switch yang dijelaskan sebagai berikut:

xkb-switch adalah program C++ yang memungkinkan untuk melakukan query dan mengubah status layout 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

21
jasonwryan

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

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

xkblayout-state print "%s"

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

14
Pablo Saratxaga

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
11
Pepa

Pendekatan lain yang lebih sederhana, karena posisi tetap dari keluaran xset -q perintah, apakah ini:

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

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

9
nikospag

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
8
oLen

Jawaban sejauh ini tidak berhasil untuk saya. Saya menggunakan setkbmap dengan dua tata letak bahasa Inggris dan ceko jadi apa saja -print atau -query akan selalu mengembalikan keduanya. Meraih status LED untuk xset -q tidak 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

5
fikovnik

Anda dapat menggunakan xkbprint untuk mencetak tata letak saat ini.

Misalnya untuk mencetak tata letak saat ini sebagai PDF digunakan

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

yang menghasilkan:

xkbprint result

3
Flow

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 international" di menu pilihan keyboard GNOME).

2
l0b0

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

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

Saya memiliki beberapa tata letak yang dikonfigurasi, 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.

1
Qeole
#! /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