我想知道是否有任何命令行工具可以返回当前的键盘布局。
我已经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
也许这与版本有关,但在我使用setxkbmap
1.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