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


61

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 đã XkbLayoutthiết lập 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ì.


Tôi không thực sự giỏi về D-Bus, nhưng tôi nên dễ dàng theo dõi bố cục bàn phím hiện tại bằng cách sử dụng nó. Mặc dù nó có thể không thể làm như vậy nếu không có công tắc hoạt động.
Benjamin

Câu trả lời:


31

Có thể đây là phiên bản phụ thuộc, nhưng trên máy của tôi sử dụng setxkbmap1.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 -querytùy chọn setxkbmapcho cả hai cách bố trí và các biến thể, như các lĩnh vực khác nhau:

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

3
-queryđã được thêm vào setxkbmap 1.2.0
alanc

Bạn nhận được các bố cục và biến thể hiện tại và nhiều thông tin bổ sung vớisetxkbmap -print -verbose 10
erik

Để đặt nó, ví dụ cả bố cục cz và chúng tôi, cái sau với biến thể dvorak (cho bàn phím 104), hãy sử dụngsetxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik

Cảm ơn, làm việc
Indacochea Wachín

19

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


1
Cảm ơn, xkb-switchhoạt động tốt, nhưng tôi hy vọng rằng có nhiều giải pháp di động hơn
Andrew

1
@Andrew: vâng, đó là một thứ kỳ quặc không có cách nào đơn giản để có được bố cục hiện tại.
Benjamin

7
Bạn setxkbmapkhông hiển thị bố cục hiện đang hoạt động khi có nhiều hơn một bố cục được xác định.
terdon

13

Có, đây là 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 ; echonếu bạn cần). chạy công cụ mà không có tham số cho sự giúp đỡ.


11

Sử dụng để nhận 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

3
Tôi nhận được 00000002mặc dù bố cục của tôi là "USA Dvorak quốc tế". Ngôn ngữ là không đủ ...
l0b0

4
Nó không có ích nếu có ba hoặc nhiều bố cục. Bố cục thứ hai và thứ ba cho cùng một giá trị 00001004trên máy của tôi.
sastanin

vấn đề: chuyển đổi numlock của bạn và bắt đầu lại lệnh này;)
andras.tim

Điều này sẽ không hoạt động đáng tin cậy - bạn cần sử dụng mặt nạ vì đèn LED cũng chỉ trạng thái của các nút led bàn phím.
fikovnik

9

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 -qlệnh, là:

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

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


Tôi thích cái này, tôi nghĩ bạn có thể thu hẹp nó xuống còn 8 ký tự. c59-66.
xlembouras

8

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

3

Các câu trả lời cho đến nay không làm việc cho tôi. Tôi sử dụng setkbmapvới hai bố cục tiếng Anh và tiếng Séc để bất kỳ -printhoặc -querysẽ luôn trả lại hai. Cắt bớt trạng thái LED cho xset -qkhông hoạt động vì nó 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à viết nhanh 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


3

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:

kết quả xkbprint


2

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


7
Nó chỉ in bố cục đầu tiên trong danh sách, không in bố cục hiện tại.
sastanin

Làm cách nào tôi có thể phát hiện sơ đồ bàn phím của mình, khi tôi sử dụng chuyển đổi ngôn ngữ bằng 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)trong trường hợp này tôi đã nhận được "chúng tôi" mọi lúc
andras.tim

0

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 qdbuslệnh:

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


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

Bạn có thể dùng:

setxkbmap -print | grep xkb_symbols

5
nó trả về các cài đặt bàn phím tổng thể, không phải bố cục hiện tại (chúng tôi hoặc ru)
Andrew

Thực thi nó tốt, như @jasonwryan tuyên bố nếu bạn phân tích cẩn thận dòng đó, vào nó nằm trong bố cục của bạn. Trong trường hợp của tôi nó là latam.
nozimica

5
phiên bản jasonwryan chỉ xuất ra một phần của chuỗi sau '+', xkb_symbolsgiá trị không phụ thuộc vào bố cục đã chọn, tôi luôn nhận được 'chúng tôi'
Andrew
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.