如何获取当前的键盘布局?

如何获取当前的键盘布局?

我想知道是否有任何命令行工具可以返回当前的键盘布局。

我已经XkbLayout设置为us, ru.

更新: setxkbmap返回布局设置,而不是选定的布局。例如:

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

无论当前布局是什么,它都会返回相同的结果。

答案1

也许这与版本有关,但在我使用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

答案2

是的,有一个命令行工具可以满足您的要求!我十分钟前才发现它:)

看这里:https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

完全按照您想要的方式执行(它不会输出行尾,因此; echo如果需要,请添加)。运行不带参数的工具以获得帮助。

答案3

有 xkb-switch ,其描述如下:

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

答案4

到目前为止的答案对我来说不起作用。我使用setkbmap英语和捷克语两种布局,因此任何-print-query都将始终返回这两种布局。查询 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

相关内容