ฉันจะรับเค้าโครงแป้นพิมพ์ปัจจุบันได้อย่างไร


61

ฉันสงสัยว่ามีเครื่องมือบรรทัดคำสั่งใดบ้างที่คืนค่าเค้าโครงแป้นพิมพ์ปัจจุบัน

ฉันได้ตั้งค่าให้XkbLayoutus, ru

อัปเดต: setxkbmapคืนการตั้งค่าเค้าโครงไม่ใช่เค้าโครงที่เลือก เช่น:

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

มันจะส่งกลับผลลัพธ์เดียวกันไม่ว่าเค้าโครงปัจจุบันจะเป็นอะไร


ฉันไม่เก่งใน D-Bus แต่ควรติดตามรูปแบบแป้นพิมพ์ในปัจจุบันโดยใช้ที่ฉันคิด แม้ว่ามันอาจจะไม่สามารถทำได้หากไม่มีสวิตช์ที่ใช้งานอยู่
เบนจามิน

คำตอบ:


31

อาจเป็นรุ่นที่ขึ้นอยู่กับ แต่ในเครื่องของฉันที่ใช้setxkbmap1.3.0 คำสั่งต่อไปนี้ใช้งานได้:

setxkbmap -query | grep layout

โปรดทราบว่าขึ้นอยู่กับความต้องการของคุณมันอาจจะไร้ประโยชน์ที่จะรู้เพียงแค่เลย์เอาต์: ตัวอย่างเช่นตัวแปร Dvorak ของเลย์เอาต์สหรัฐนั้นแตกต่างจาก QWERTY เริ่มต้นค่อนข้างมาก -queryตัวเลือกของการsetxkbmapให้ทั้งเค้าโครงและชุดตัวเลือกเป็นฟิลด์อื่น:

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

3
-queryถูกเพิ่มในsetxkbmap 1.2.0
alanc

คุณจะได้รับเลย์เอาต์และตัวแปรปัจจุบันและข้อมูลเพิ่มเติมมากมายด้วยsetxkbmap -print -verbose 10
erik

ในการตั้งค่าตัวอย่างเช่นเลย์เอาต์ cz และเราตัวหลังพร้อม dvorak ที่ผันแปร (สำหรับแป้นคีย์บอร์ด 104 ตัว) ให้ใช้setxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik

ขอบคุณการทำงาน
Indacochea Wachín

19

มีสวิตช์ xkb ซึ่งอธิบายดังนี้:

xkb-switch เป็นโปรแกรม C ++ ที่อนุญาตให้สืบค้นและเปลี่ยนสถานะเค้าโครง XKB

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

หรือทำตามคำแนะนำของ nozimica คุณสามารถใช้:

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

จากหัวข้อนี้บนกระดาน Arch Linux: https://bbs.archlinux.org/viewtopic.php?pid=539406


1
ขอบคุณใช้xkb-switchงานได้ดี แต่ฉันหวังว่าจะมีวิธีแก้ปัญหาแบบพกพามากขึ้น
Andrew

1
@ แอนดรูว์: ใช่มันค่อนข้างแปลกไม่มีวิธีง่ายๆในการรับเลย์เอาต์ปัจจุบัน
เบนจามิน

7
คุณsetxkbmapไม่แสดงเลย์เอาต์ที่ใช้งานในปัจจุบันเมื่อมีการกำหนดมากกว่าหนึ่งเลย์เอาต์
terdon

13

ใช่มีเครื่องมือบรรทัดคำสั่งที่ทำในสิ่งที่คุณต้องการ! ฉันเพิ่งค้นพบมัน 10 นาทีที่แล้ว :)

ดูที่นี่: 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รูปแบบของฉันคือ "USA Dvorak international" ภาษาไม่เพียงพอ ...
l0b0

4
มันไม่ช่วยถ้ามีสามหรือมากกว่าเค้าโครง เลย์เอาต์ที่สองและสามให้ค่าเดียวกัน00001004กับเครื่องของฉัน
sastanin

ปัญหา: สลับ numlock ของคุณและเริ่มคำสั่งนี้อีกครั้ง;)
andras.tim

สิ่งนี้จะไม่สามารถใช้งานได้อย่างน่าเชื่อถือ - คุณต้องใช้มาสก์เนื่องจาก LED แสดงสถานะของปุ่มนำคีย์บอร์ดเช่นกัน
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

คำตอบจนถึงไม่ได้สำหรับฉัน ผมใช้setkbmapมีสองรูปแบบภาษาอังกฤษและสาธารณรัฐเช็กเพื่อให้ใด ๆ-printหรือ-queryมักจะกลับทั้งสอง การ grepping สถานะ LED สำหรับxset -qไม่ทำงานอย่างใดอย่างหนึ่งเนื่องจากสถานะนั้นแสดงสถานะของไฟ led คีย์บอร์ดทั้งหมด

สิ่งที่ดีที่สุดคือการเขียนยูทิลิตี้ขนาดเล็กนี้อย่างรวดเร็ว: 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


3

คุณสามารถใช้xkbprintเพื่อพิมพ์เค้าโครงปัจจุบัน

ตัวอย่างเช่นการพิมพ์เค้าโครงปัจจุบันเป็นการใช้ PDF

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

ซึ่งผลิต:

ผลลัพธ์ xkbprint


2

จากGoosfrabaa ในฟอรัม Arch Linux :

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

ทำงานได้อย่างถูกต้องที่นี่และพิมพ์us(dvorak-intl)(แสดงเป็น "USA Dvorak international" ในเมนูเลือกแป้นพิมพ์ GNOME)


7
มันพิมพ์เฉพาะเค้าโครงแรกในรายการไม่ใช่รูปแบบปัจจุบัน
sastanin

ฉันจะตรวจพบ keymap ของฉันได้อย่างไรเมื่อฉันใช้การสลับภาษาโดย 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

0

คำตอบบางส่วน: ใน KDEคุณสามารถรับรูปแบบแป้นพิมพ์ปัจจุบันผ่านqdbusคำสั่ง:

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

ฉันมีเลย์เอาต์หลายรูปแบบ แต่มันแสดงเฉพาะรูปแบบที่ใช้งานอยู่ในปัจจุบัน

ทดสอบกับ Kubuntu 18.04 (qdbus เวอร์ชั่น 4.8.7) อาจมีโซลูชั่นที่ใช้ d-bus อื่น ๆ สำหรับสภาพแวดล้อมที่ไม่ใช่ Qt แต่ฉันไม่รู้เกี่ยวกับพวกเขา


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

คุณสามารถใช้ได้:

setxkbmap -print | grep xkb_symbols

5
มันกลับตั้งค่าแป้นพิมพ์โดยรวมไม่ได้ในปัจจุบันรูปแบบ (เราหรือ RU)
แอนดรู

ดำเนินการได้เป็นอย่างดีเนื่องจาก @jasonwryan ระบุว่าหากคุณวิเคราะห์อย่างรอบคอบว่าบรรทัดนั้นมีโครงร่างของคุณอยู่ latamในกรณีของฉันมันเป็น
nozimica

5
รุ่น jasonwryan เพิ่งเอาท์พุทเป็นส่วนหนึ่งของสตริงหลังจาก '+', xkb_symbolsค่าไม่ได้ขึ้นอยู่กับเลย์เอาต์ที่เลือกฉันมักจะได้รับ 'พวกเรา'
แอนดรูว์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.