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

And*_*rew 83 xorg keyboard xkb

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

我已经XkbLayout设置为us, ru.

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

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

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

小智 37

也许这取决于版本,但在我使用setxkbmap1.3.0 的机器上,以下命令有效:

setxkbmap -query | grep layout
Run Code Online (Sandbox Code Playgroud)

请注意,根据您的需要,仅知道布局可能没有用:例如,美国布局的 Dvorak 变体与默认 QWERTY 完全不同。的-query的选项setxkbmap都给出了布局和变种,因为不同的领域:

$ setxkbmap -query
rules:      evdev
model:      default
layout:     fr
variant:    bepo
options:    grp:alt_shift_toggle
Run Code Online (Sandbox Code Playgroud)

  • 不会让您知道多个布局的活动布局,这是 OP 所要求的。无赖这到了顶峰。 (14认同)
  • `-query` 被添加到 [setxkbmap 1.2.0](http://lists.x.org/archives/xorg/2010-September/051048.html) (4认同)

jas*_*yan 22

有 xkb-switch 描述如下:

xkb-switch 是一个 C++ 程序,允许查询和更改 XKB 布局状态。

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

或者,按照 nozimica 的建议,您可以使用:

setxkbmap -print | awk -F"+" '/xkb_symbols/ {print $2}'
Run Code Online (Sandbox Code Playgroud)

来自 Arch Linux 板上的这个线程:https : //bbs.archlinux.org/viewtopic.php?pid=539406

  • 当定义了多个布局时,您的 `setxkbmap` 不会显示当前活动的布局。 (19认同)

Pab*_*aga 22

是的,有一个命令行工具可以做你想做的事!我 10 分钟前才发现它:)

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

xkblayout-state print "%s"
Run Code Online (Sandbox Code Playgroud)

完全符合您的要求(它不输出行尾,因此请; echo根据需要添加)。运行不带参数的工具以获得帮助。


小智 15

使用它来获取当前布局的代码:

$(xset -q|grep LED| awk '{ print $10 }')
Run Code Online (Sandbox Code Playgroud)

这可能需要转换为您想要的形式,例如:

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

  • 如果存在三个或更多布局,则无济于事。第二个和第三个布局在我的机器上给出了相同的值“00001004”。 (5认同)
  • 即使我的布局是“美国德沃夏克国际”,我也得到了“00000002”。语言不够... (3认同)

fik*_*nik 11

到目前为止的答案对我不起作用。我使用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;
}
Run Code Online (Sandbox Code Playgroud)

并使用编译

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

  • 非常感谢!点赞! (2认同)

小智 9

由于xset -q命令输出的固定位置,另一种更简单的方法是:

xset -q | grep -A 0 'LED' | cut -c59-67
Run Code Online (Sandbox Code Playgroud)

它打印0000000200001002取决于您当前的键盘布局。


小智 8

在较新的系统上,您可以使用

localectl status

例如,它将向您显示以下内容:

System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us
Run Code Online (Sandbox Code Playgroud)

  • 当定义多个布局时不显示当前活动的布局,只显示第一个 (3认同)

Flo*_*low 8

您可以使用xkbprint打印当前布局。

例如将当前布局打印为 PDF 使用

xkbprint -color "${DISPLAY}" - |\
    ps2pdf - > current_keyboard_layout.pdf
Run Code Online (Sandbox Code Playgroud)

它产生:

xkbprint 结果