मुझे वर्तमान कीबोर्ड लेआउट कैसे मिलेगा?


61

मुझे आश्चर्य है कि कोई कमांड लाइन टूल है, जो वर्तमान कीबोर्ड लेआउट लौटाता है।

मैं XkbLayoutकरने के लिए तैयार है us, ru

अपडेट: setxkbmap लेआउट सेटिंग लौटाता है, चयनित लेआउट नहीं। उदाहरण के लिए:

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

यह वही परिणाम लौटाएगा जो वर्तमान लेआउट में कोई फर्क नहीं पड़ता।


मैं वास्तव में डी-बस में अच्छा नहीं हूं, लेकिन मुझे लगता है कि इसका उपयोग करके वर्तमान कीबोर्ड लेआउट को ट्रैक करना आसान होना चाहिए। हालांकि यह सक्रिय स्विच नहीं होने पर ऐसा करने में सक्षम नहीं हो सकता है।
बेंजामिन

जवाबों:


31

हो सकता है कि यह संस्करण निर्भर हो, लेकिन मेरी मशीन पर जो setxkbmap1.3.0 का उपयोग करती है, निम्नलिखित कमांड काम करती है:

setxkbmap -query | grep layout

ध्यान दें कि आपकी आवश्यकता के आधार पर केवल लेआउट जानना बेकार हो सकता है: उदाहरण के लिए, यूएस लेआउट का ड्वोरक संस्करण डिफ़ॉल्ट QWERTY से काफी अलग है। विभिन्न क्षेत्रों के रूप में लेआउट और संस्करण दोनों का -queryविकल्प setxkbmapदेता है:

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


आप के साथ वर्तमान लेआउट और वेरिएंट और कई अतिरिक्त जानकारी प्राप्तsetxkbmap -print -verbose 10
एरिक

इसे सेट करने के लिए, उदाहरण के लिए, दोनों लेआउट cz और हमें, वेरिएंट dvorak (104 कुंजी कीबोर्ड के लिए) के साथ उत्तरार्द्ध, उपयोगsetxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik

धन्यवाद, काम कर रहे
Indacochea Wachín

19

Xkb- स्विच है जो इस प्रकार वर्णित है:

xkb- स्विच एक C ++ प्रोग्राम है जो XKB लेआउट स्टेट को क्वेरी और बदलने की अनुमति देता है।

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

या, nozimica के सुझाव का पालन करते हुए, आप उपयोग कर सकते हैं:

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

आर्क लिनक्स बोर्ड पर इस धागे से: https://bbs.archlinux.org/viewtopic.php?pid=539406


1
धन्यवाद, xkb-switchठीक काम करता है, लेकिन मुझे उम्मीद है कि
एंड्रयू

1
@Andrew: हाँ यह एक तरह का अजीब है, वर्तमान लेआउट को प्राप्त करने का कोई सरल तरीका नहीं है।
बेंजामिन

7
setxkbmapजब एक से अधिक लेआउट परिभाषित किए जाते हैं तो आपका वर्तमान में सक्रिय लेआउट प्रदर्शित नहीं होता है।
terdon

13

हाँ वहाँ एक कमांड लाइन उपकरण है जो आपको क्या चाहिए! मैंने अभी इसे 10min पहले खोजा :)

यहां देखें: https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

ठीक वही करता है जो आप चाहते हैं (यह पंक्ति के अंत में आउटपुट नहीं करता है, इसलिए ; echoयदि आपको आवश्यकता है तो जोड़ें )। मदद के लिए मापदंडों के बिना उपकरण चलाएँ।


11

वर्तमान लेआउट के लिए कोड प्राप्त करने के लिए इसका उपयोग करें:

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

इसे आपके इच्छित रूप में परिवर्तित करने की आवश्यकता हो सकती है, जैसे:

case "$(xset -q|grep LED| awk '{ print $10 }')" in
  "00000002") KBD="English" ;;
  "00001002") KBD="Thai" ;;
  *) KBD="unknown" ;;
esac

3
मैं 00000002भले ही मेरी लेआउट "संयुक्त राज्य अमेरिका ड्वोरक अंतरराष्ट्रीय" है। भाषा पर्याप्त नहीं है ...
l0b0

4
तीन या अधिक लेआउट होने पर यह मदद नहीं करता है। दूसरा और तीसरा लेआउट 00001004मेरी मशीन पर समान मूल्य देते हैं ।
सस्तनिन

समस्या: अपने अंक को टॉगल करें और इस कमांड को फिर से शुरू करें;)
andras.tim

यह मज़बूती से काम नहीं करेगा - आपको मास्क का उपयोग करने की आवश्यकता है क्योंकि एलईडी कीबोर्ड के बटन की स्थिति को भी इंगित करता है।
fikovnik

9

xset -qकमांड के आउटपुट के निश्चित पदों के कारण एक और सरल तरीका यह है:

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

यह प्रिंट करता है 00000002या 00001002आपके वर्तमान कीबोर्ड लेआउट पर निर्भर करता है।


मुझे यह पसंद है, मुझे लगता है कि आप इसे 8 वर्णों तक सीमित कर सकते हैं। c59-66
xlembouras

8

नए सिस्टम पर, आप उपयोग कर सकते हैं

localectl status

उदाहरण के लिए यह आपको निम्नलिखित दिखाएगा:

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

3

आप xkbprintवर्तमान लेआउट को प्रिंट करने के लिए उपयोग कर सकते हैं ।

उदाहरण के लिए पीडीएफ के रूप में वर्तमान लेआउट को प्रिंट करना

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

जो पैदा करता है:

xkbprint परिणाम


2

आर्क लिनक्स मंचों में Goosfrabaa से :

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

यह यहां सही ढंग से काम करता है, और प्रिंट us(dvorak-intl)(GNOME कीबोर्ड चयन मेनू में "यूएसए ड्वोरक अंतर्राष्ट्रीय" के रूप में प्रदर्शित)।


7
यह सूची में केवल पहला लेआउट प्रिंट करता है, वर्तमान में नहीं।
sastanin

जब मैं 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)इस मामले में मैं हर बार "हमें"
andras.tim

2

अब तक के जवाब मेरे काम नहीं आए। मैं setkbmapदो लेआउट अंग्रेजी और चेक के साथ उपयोग करता हूं इसलिए कोई भी -printया -queryहमेशा दोनों को वापस कर देगा। एलईडी की स्थिति को पकड़ना xset -qया तो काम नहीं करता है क्योंकि कोई सभी कीबोर्ड लीड की स्थिति दिखाता है।

अब तक की सर्वश्रेष्ठ यह छोटी उपयोगिता जल्दी से लिखना था: 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;
}

और संकलन का उपयोग कर

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


0

आंशिक उत्तर: केडीई पर , आप स्पष्ट रूप से qdbusकमांड के माध्यम से वर्तमान कीबोर्ड लेआउट प्राप्त कर सकते हैं :

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

मेरे पास कई लेआउट कॉन्फ़िगर किए गए हैं, लेकिन यह केवल वही दिखाता है जो वर्तमान में उपयोग में है।

कुबंटु 18.04 (क्यूडबस संस्करण 4.8.7) पर परीक्षण किया गया। गैर-क्यूटी वातावरण के लिए अन्य डी-बस आधारित समाधान हो सकते हैं, लेकिन मुझे उनके बारे में नहीं पता है।



-1

आप उपयोग कर सकते हैं:

setxkbmap -print | grep xkb_symbols

5
यह समग्र कीबोर्ड सेटिंग लौटाता है, न कि वर्तमान लेआउट (हमें या आरयू)
एंड्रयू

इसे अच्छी तरह से निष्पादित करें, जैसा कि @jasonwryan बताता है कि यदि आप उस रेखा का सावधानीपूर्वक विश्लेषण करते हैं, तो यह आपके लेआउट को दर्शाता है। मेरे मामले में यह है latam
नोज़ीमिका

5
jasonwryan संस्करण सिर्फ '+' के बाद स्ट्रिंग का एक हिस्सा आउटपुट xkb_symbolsकरता है , मूल्य चयनित लेआउट पर निर्भर नहीं करता है, मुझे हमेशा 'हमें' मिलता है
एंड्रयू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.