it-swarm-vi.com

Làm thế nào để tôi có được bố trí bàn phím hiện tại?

Tôi tự hỏi là có bất kỳ công cụ dòng lệnh nào, trả về bố trí bàn phím hiện tại.

Tôi có XkbLayout được đặt thành us, ru.

Cập nhật :setxkbmap trả về cài đặt bố cục, không chọn bố cục. Ví dụ.:

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

Nó sẽ trả về kết quả tương tự cho dù bố cục hiện tại là gì.

61
Andrew

Có thể đây là phiên bản phụ thuộc, nhưng trên máy của tôi sử dụng setxkbmap 1.3.0 lệnh sau hoạt động:

setxkbmap -query | grep layout

Lưu ý rằng tùy thuộc vào nhu cầu của bạn, có thể chỉ vô dụng khi chỉ biết bố cục: ví dụ: biến thể Dvorak của bố cục Hoa Kỳ khá khác so với QWERTY mặc định. Các -query tùy chọn của setxkbmap cung cấp cả bố cục và biến thể, dưới dạng các trường khác nhau:

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

Có xkb-switch được mô tả như vậy:

xkb-switch là một chương trình C++ cho phép truy vấn và thay đổi trạng thái bố cục XKB.

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

Hoặc, theo đề xuất của nozimica, bạn có thể sử dụng:

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

Từ chuỗi này trên bảng Arch Linux: https://bbs.archlinux.org/viewtopic.php?pid=539406

21
jasonwryan

Có THERE IS một công cụ dòng lệnh thực hiện những gì bạn muốn! Tôi mới phát hiện ra nó 10 phút trước :)

Nhìn vào đây: https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

thực hiện chính xác những gì bạn muốn (nó không tạo ra kết thúc của dòng, vì vậy hãy thêm ; echo nếu bạn cần). chạy công cụ mà không có tham số cho sự giúp đỡ.

14
Pablo Saratxaga

Sử dụng điều này để lấy mã cho bố cục hiện tại:

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

Điều này có thể cần phải được chuyển đổi thành một hình thức bạn muốn, như:

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

Một cách tiếp cận đơn giản hơn, vì các vị trí cố định của đầu ra của xset -q lệnh, đây là:

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

Nó in 00000002 hoặc là 00001002 tùy thuộc vào cách bố trí bàn phím hiện tại của bạn.

9
nikospag

Trên các hệ thống mới hơn, bạn có thể sử dụng

localectl status

Ví dụ, nó sẽ cho bạn thấy những điều sau đây:

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

Các câu trả lời cho đến nay không làm việc cho tôi. Tôi sử dụng setkbmap với hai bố cục tiếng Anh và tiếng Séc nên bất kỳ -print hoặc là -query sẽ luôn trả lại hai. Cắt xén trạng thái LED cho xset -q cũng không hoạt động vì cái đó hiển thị trạng thái của tất cả các đèn bàn phím.

Cách tốt nhất cho đến nay là nhanh chóng viết tiện ích nhỏ này: 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;
}

và biên dịch bằng cách sử dụng

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

5
fikovnik

Bạn có thể sử dụng xkbprint để in bố cục hiện tại.

Ví dụ: để in bố cục hiện tại dưới dạng PDF sử dụng

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

sản xuất:

xkbprint result

3
Flow

Từ Goosfrabaa trong diễn đàn Arch Linux :

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

Điều này hoạt động chính xác ở đây và in us(dvorak-intl) (được hiển thị là "USA Dvorak quốc tế" trong menu chọn bàn phím Gnome).

2
l0b0

Câu trả lời một phần: Trên KDE, rõ ràng bạn có thể nhận được bố cục bàn phím hiện tại thông qua lệnh qdbus:

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

Tôi có một vài bố cục được cấu hình, nhưng nó chỉ hiển thị một bố cục hiện đang được sử dụng.

Đã thử nghiệm trên Kubfox 18.04 (phiên bản qdbus 4.8.7). Có thể có các giải pháp dựa trên d-bus khác cho các môi trường không phải Qt, nhưng tôi không biết về chúng.

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
0